Все мы наверное сталкивались с такой занудной штукой как расшифровка дисков после ребута, или после краша сервера. Недавно столкнулся с замечательной фичей tang/clevis, и жизнь моя улучшилась.

Tang

По сути это сервер для разблокировки зашифрованных дисков. О том как он хранит ключи можно прочесть тут

Clevis

Clevis являет собой клиент, который устанавливается на сервер зашифрованной виртуальной машины, его можно использовать для автоматического дешифрования данных или даже автоматического разблокирования томов LUKS. Если сервер tang доступен то диск автоматически расшифровывается, зависит от вашей настройки

Оставлю для вас тут видео презентацию

Применение

В данной статье мы рассмотрим полное шифрование корня "/" . В качестве систем, я выбрал родную для tang/clevis CentOS 8 и Ubuntu20.04. Корень зашифрован при установки системы.

Настройка tang Ubuntu 20.04.01 LTS

Spoiler
apt install tang jose
systemctl enable tangd.socket
systemctl start tangd.socket

Тем самым мы запустим службу на 80 порту.

В одной из инструкций мне попалась информация, что для ubuntu 18.04 вам необходимо вручную сгенерировать ключи tang с помощью /usr/lib/x86_64-linux-gnu/tangd-keygen /var/db/tang перед запуском сервера. Не могу подтвердить или опровергнуть, так как не тестил на этой системе

Для определения отпечатка ключа подписи выполним

tang-show-keys
#вывод будет примерно таким:
thzZRnlNAO_Z_IQ_NqSt5P_uwiA

Ну и конечно не забываем про настройку iptables, если вы не находитесь за NAT. безопасность превыше всего!

С настройкой сервера закончили.

Настройка clevis на клиентах 20.04.01 LTS

Spoiler

Устанавливаем пакеты

apt install clevis clevis-luks

После этого определяем зашифрованный том на нашей системе

lsblk

В моем случае это sda3, для того чтобы проверить, что мы делаем все правильно используем

cryptsetup luksDump /dev/sda3
Вывод будет примерно таким
Вывод будет примерно таким

Потом надо убедиться что что сервер tang нам отвечает

curl http://192.168.100.22/adv #подставляем ip adress tang

Вывод

Привязываем clevis к tang

clevis luks bind -d /dev/sda3 tang '{"url": "http://192.168.100.22"}'

Потом он спросит пароль от зашифрованного диска, соглашаемся и вводим

Если мы повторно запустим команду

cryptsetup luksDump /dev/sda3

То увидим что там добавился токен Clevis

Устанавливаем плагин clevis

apt install clevis-initramfs

И тут есть нюансик который проявляется, если у вас нет DHCP, так как конфиг сетевой карты находится у нас на зашифрованном томе, а нам необходимо чтобы сеть появилась раньше чем он загрузиться, нужно немного поправить initramfs.conf

Добавляем следующий параметр

IP=192.168.100.20::192.168.100.1:255.255.255.0:admin1:ens18
#IP=ip address::Gateway:Mask:hostname:interface

Повторно инициализируем initramfs

update-initramfs -u -k 'all'

Перезагружаем сервер и наблюдаем.

Если по какой-то причине вам необходимо будет отключить привязку tang, то воспользуйтесь этой командой

clevis luks unbind -d /dev/sda3 -s 1 
# -s это слот на котором находится clevis его можно посмотреть на предыдущем скриншоте

P.S. Также эта инструкция применима к Debian 10, но clevis-initramfs там находится в тестовой ветке. Так что на свой страх и риск можете добавить тестовые репы в : /etc/apt/sources.list

deb   http://deb.debian.org/debian testing main contrib non-free
deb-src http://deb.debian.org/debian testing main contrib non-free

Настройка clevis на клиентах CentOS 8.2

Spoiler

Устанавливаем пакеты

yum -y install clevis clevis-luks clevis-dracut

Дальше определяем зашифрованный том на нашей системе

lsblk

В моем случае это sda2, для того чтоб проверить, что мы делаем все правильно используем

cryptsetup luksDump /dev/sda2

Теперь надо убедиться что что сервер tang нам отвечает

curl http://192.168.100.22/adv #подставляем ip adress tang

Привязываем clevis к tang

clevis luks bind -d /dev/sda2 tang '{"url": "http://192.168.100.22"}'

После этого он спросит пароль от зашифрованного диска, соглашаемся и вводим

Если мы повторно запустим команду то можем увидеть что первый слот занят и активен

cryptsetup luksDump /dev/sda2

Далее запускаем dracut

dracut -f

Перезагружаемся, и все работает

Если по какой-то причине вам необходимо будет отключить привязку tang, то воспользуйтесь этой командой

clevis luks unbind -d /dev/sda2 -s 1 
# -s это слот на котором находится clevis его можно посмотреть на предыдущем скриншоте

Эксплуатирую данное чудо пока всего неделю, но уже очень доволен. Также система умеет работать не с полной шифровкой тома, а с отдельными дисками.

Обязательно к прочтению!

  • Если плохой парень, получит доступ к вашему cloud account, или прямой доступ к железке, тогда через grub он сможет сбить пароль root. Единственный вариант который мне приходит в голову на вопрос, как от этого уберечься, это поставить пароль на grub, но кто может гарантировать его надежность?

  • Доступ к tang server нужно прятать за white-list, в случае если украдут жесткий диск и попробуют зайти с друго ip, у них ничего не выйдет. Также чтобы уберечься от кражи диска можно привязать его к железу TPM2.0 вначале статьи я оставлял ссылку на видеоконференцию.

P.S. Хотел поделиться настройкой clevis на ubuntu, так как мало где описывается процесс. Также хотелось поделиться своими граблями на которые я наступил при настройке initramfs. Спасибо за внимание!