Долой рутину расшифровки дисков, или использование сетевой разблокировки с помощью tang/clevis
Все мы наверное сталкивались с такой занудной штукой как расшифровка дисков после ребута, или после краша сервера. Недавно столкнулся с замечательной фичей 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. Спасибо за внимание!