Продолжаю переводить все свои VM на зашифрованные диски (luks). Если в 1 речь идет о VM работающих на собственном физ.сервере и там есть возможность выдать vTPM и переключить BIOS в UEFI для корректной работы разблокировки luks. А что делать с VM где хостер не даёт такой возможности? У меня таких две крутяться у Hetzner.
Есть прекрасное решение, связка clever/tang, но сервер tang предназначен для работы в приватной локальной сети. Конечно его можно запустить на публичном сервере и всё будет работать, но не только у вас, а и у тех у кого в руках окажется ваш виртуальный диск.
#Так происходит привязка разблокировки luks к серверу tang
clevis luks bind -d /dev/vda4 tang '{"url":"http://IP-сервера-tang"}'
Если IP-сервера-tang публичный, то где бы не запустили ваш виртуальный диск, он будет разблокирован. Поэтому этот вариант для VM у Hetzner, я не рассматривал. Конечно можно создать виртуальную локальную сеть между VM одного хостера и это решит проблему "IP-сервера-tang публичный". Но это вариант, мне не особо нравился.
А потом пришла мысль. А что если clevis будет знать только адрес WireGuard tang-сервера, но в wg conf не будет эндпоинта. Сервер с tang сам будет инициировать wg соединение, а clevis получив соединение отправляет свой запрос. Ха, весего-то надо поднять wg в ранней загрузке на VM с lusk. Аварйный ssh поднял и с wg справлюсь, лехкотня.
С поднятием wg пришлось попотеть и пройти через два сложных варианта, до того как пришёл к простому.
- Вариант в лоб. Скрип (онже hook в dracut) внедряем в initramfs, он отрабатывает и поднимает wg. Вывод: работает капризно, то да, то нет, то вам, то не вам...
- Вариант системный. Пишу модуль для dracut, который запускает службу systemd, которая поднимает wg. Вывод: работает стабильно и вороде вот оно, но нет. Взглянул на тонну написанного кода и такое ощущение... ну не элегантно это, как из пушки по воробьям. Мне нужно просто поднять wg, а не космический карабль к Луне сопроводить.
- Вариант простой. Без особого оптимизма набираю в аварийной ssh консоле nmcli и вот он, во всей красе, NetworkManager. И чтож я дурень, сразу тебя и не проверил. Всего делов, положить конфиг wg в нужное место и NetworkManager поднимает WireGuard.
Какие возможности даёт это решение? Ваш сервер c tang может находиться у любого хостера, да что у хостера, хоть дома на компе со своими ключами за NAT. Далее несколько блоков кода, поверте если бы остался 2 вариант их было бы значительно больше. Не буду разжёвывать как создавать конфиги для WireGuard, кому надо разберется. Главное запомнить, у VM с lusk не должно быть эндпоинта (публичного адреса) сервера c tang.
Настройки для VM с clever для разблокировки lusk:
Создаем wg подключение и копируем wg0.nmconnection в нужную паку:
nmcli connection import type wireguard file wg0.conf mkdir -p /usr/lib/NetworkManager/system-connections cp /etc/NetworkManager/system-connections/wg0.nmconnection /usr/lib/NetworkManager/system-connections/ chmod 700 /usr/lib/NetworkManager/system-connections chmod 600 /usr/lib/NetworkManager/system-connections/wg0.nmconnection #Удалить строку "uuid=..." и добавить вместо неё "autoconnect=true" nano /usr/lib/NetworkManager/system-connections/wg0.nmconnectionУстановить clevis-dracut и добавить настройки dracut
dnf -y install clevis-dracut #Добавляем модуль clevis echo 'add_dracutmodules+=" clevis "' > /etc/dracut.conf.d/wireguard.conf #Добавляем драйвер ядра WireGuard echo 'add_drivers+=" wireguard "' >> /etc/dracut.conf.d/wireguard.conf #Добавляем config echo 'install_items+=" /usr/lib/NetworkManager/system-connections/wg0.nmconnection "' >> /etc/dracut.conf.d/wireguard.confФинал пересборка initramfs
dracut -vf
И если добавить настройки из 2, после перезагрузки сервера поднимится аварийный ssh и wg соединени для разблокировки lusk. Но перед перезагрузкой лучше настроить сервер с tang и привязать его ключи к вашему диску lusk.
Настройки для сервера с tang:
Создаем wg подключение
nmcli connection import type wireguard file wg0.conf #Проверяем "latest handshake", если есть то тунель поднялся wgУстановка самого tang
dnf -y install tangНастройка tang
#Создание новых ключей /usr/libexec/tangd-keygen /var/db/tang #Включаем tangd.socket systemctl enable --now tangd.socket #Проверяем ключи tang, вывод будет примерно таким: "thzZRnlNAO_Z_IQ_NqSt5P_uwiA" tang-show-keys
Всё ваш tang готов к клиентам. На VM с lusk выполняем привязку. Будет запрошен пароль к lusk. И будет задан вопрос доверяете Вы ключу tang.
lsblk
clevis luks bind -d /dev/vda4 tang '{"url":"http://wgIP-сервера-tang"}'
Вот и всех делов)))
Перевел все свои VM/BM на зашифрованные диски. Что долго откладывал, так как считал, что не хватает компетенций и могу накосячить. Но получив волшебный пендель от инцидента с FirstVDS 1 получил мативацию и разгрыз камень который считал не по зубам.
Всем безопасности в наше бурное время.
PS Не забудьте ограничить firewall`ом 80 порт у сервера с tang, например так:
# Ограничивает доступ к порту 80 только из подсети wg
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address='10.7.0.0/24' port port="80" protocol="tcp" accept"
Если нужен пост о настройки firewalld на серверах, пишите в комментариях.





