Proxmox. Установка на зашифрованный системный раздел
Описание
Установка Proxmox на зашифрованный системный раздел. При загрузке ОС необходимо вводить пароль шифрования.
Установка
Вариант 1. Установка Debian 10 на шифрованный раздел LVM, и уже в Debian ставим Proxmox
При такой установке раздел /boot будет незашифрован. ОС при запуске в явном виде будет просить ввести пароль для подключения шифрованных системных разделов.
Запускаем установку Debian 10 на отдельный диск для ОС.
Создаем и шифруем раздел, на котором будут разделы LVM / и swap
Вариант шифрования 1
Предпочтительный, поскольку можно создать шифрованный раздел небольшого размера. Потом будет проще и быстрее его бэкапировать, хранить и восстанавливать
Вариант шифрования 2
Простой. шифрованный раздел займет объем всего диска, неудобного бэкапировать и восстанавливать
В процессе установки выбираем установку на шифрованый раздел LVM
Автоматически будут созданы разделы:
sda1 - /boot
sda5 - sda5_crypt (на нем будут разделы / и swap)
Дальнейшая общая настройка после установки Debian
На сервере SSH (Proxmox VE)
nano /etc/ssh/sshd_config
... PermitRootLogin yes ...
systemctl restart sshd
Устанавливаем утилиту для работы с бриджами
apt install -y bridge-utils
Смотрим имя локального сетевого интерфейса
ip a
Создаем бридж
Назначаем статический IP на бридже
Добавляем в бридж локальный интерфейс ens192 без IP
nano /etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug ens192 iface ens192 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.199.189 netmask 255.255.255.0 gateway 192.168.199.1 dns-nameservers 192.168.199.1 bridge_ports ens192 bridge_stp off bridge_fd 0
ИЛИ
Динамический IP на бридже
nano /etc/network/interfaces
... auto vmbr0 iface vmbr0 inet dhcp bridge_stp off bridge_fd 0
systemctl restart networking ИЛИ reboot
nano /etc/hostname
pve-test01
nano /etc/hosts
127.0.0.1 localhost.localdomain localhost 192.168.199.189 pve-test01.local pve-test01 pvelocalhost ...
Проверяем
hostname --ip-address
... 192.168.199.189 ...
echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg # optional, if you have a non-default umask
apt update && apt full-upgrade
apt install proxmox-ve postfix open-iscsi
// Recommended: remove the os-prober package
// The os-prober package scans all the partitions of your host, including those assigned to guests VMs, to create dual-boot GRUB entries. If you didn't install Proxmox VE as dual boot beside another Operating System, you can safely remove the os-prober package.
apt remove os-prober
Если в системе есть диск с данными, который мы хотим дешифровать при загрузке вместе с системным, то добавим вторую строку с диском data01 в файл /etc/crypttab:
sda5_crypt (/dev/sda5) - системный шифрованный раздел
data01 (/dev/sdb) - шифрованный диск с данными
UUID можно посмотреть командой "blkid"
nano /etc/crypttab
... sda5_crypt UUID=cc534e1a-8de7-4767-ad29-8e03e15a3fce none luks,discard data01 UUID=e001816d-68d9-4a64-9013-d5aab823fedf none luks,discard ...
reboot
При загрузке в локальной консоли после дешифрования системного раздела sda5_crypt появится запрос на дешифрование data01
Отчасти готово.
Теперь, при запуске системы, необходимо подключиться удаленным управлением (например, iLO Remote Console) или, на крайний случай, монитором с клавиатурой.
Если же карта удаленного доступа на сервере отсутствует, а монитор подключать не хочется, то имеется решение.
Используем dropbear-initramfs, реализация ssh сервера, встроенного в initramfs, чтобы можно было подключиться по ssh перед загрузкой ядра linux и ввести пароль на шифрованный раздел удаленно.
Есть ограничение: по логину/паролю подключиться в таком случае не получится. на клиенте, с которого будем подключаться по ssh для ввода пароля шифрованного раздела необходимо создать publickey и поместить его на сервер ssh (pve). можно использовать одну пару ключей (id_rsa / id_rsa.pub) на разных машинах linux
На клиенте (Linux)
Для начала создадим пару ключей (id_rsa / id_rsa.pub), которые будем использовать для подключения на сервер с целью дешифрования разделов
Вносим настройки в ssh клиент, чтобы при изменении ключа ssh удаленного сервера, ssh клиент не ругался
nano ~/.ssh/config
... UserKnownHostsFile=/dev/null StrictHostKeyChecking=no ...
(
ИЛИ
при подключении клиентом по ssh используем опции:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user$host
)
Создаем публичный ключ
ssh-keygen -t rsa
Получаем ключ: ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub
На сервере SSH (Proxmox VE)
Вариант 1. Дешифруем только системный раздел
https://www.cyberciti.biz/security/how-to-unlock-luks-using-dropbear-ssh-keys-remotely-in-linux/
https://www.sidorenko.io/post/2019/09/full-encrypted-proxmox-installation/
https://www.pbworks.net/ubuntu-guide-dropbear-ssh-server-to-unlock-luks-encrypted-pc/
Ставим утилиты
apt-get install -y dropbear-initramfs cryptsetup-initramfs lvm2
Настройки dropbear
echo 'DROPBEAR_OPTIONS="-RFEsjk -c /bin/cryptroot-unlock"' > /etc/dropbear-initramfs/config
Содержимое cat id_rsa.pub (который создали на клиенте) копируем и помещаем в файл authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvPopsr/hQHihV59qKcLLXLVae0SUshN6xPPe+y7SidCzjBvt4dAhj9IRagxDbRIRaqLefIO+wyvR8bu6qXfYV98Nf8qNRgeCjvseCnxUwR7ek/51NXhn1FqwHRwdvswIwbkF88aIPdgpL8+BBqoIQKgULIKNdDJ/QigqvWN3WacKpfWp/Nyae9h4LYsOV2tLVb/42q3Hw9T9ojEkk3fa1+JWO5ioZdG/8BTTix0C4/yesOGDo4TraN3sHMK2wd+cSoG2tgzkU9hhfQCTACP/j1FO7qNxqIveeSHraAP12yLqaWXeT5SS/FQq8Tf3+c6/nX3lM7aTr/cHwM8WTdzWD root@centos7-test01' > /etc/dropbear-initramfs/authorized_keys
Проверяем что таблица /etc/crypttab содержит примерно следующее
sda2_crypt /dev/sda2 none luks,initramfs
Настройки сети DROPBEAR
${optional_fqdn}, ${interface_name} - необязательные параметры
echo 'IP="${ip_address}::${gateway_ip}:${netmask}:${optional_fqdn}:${interface_name}:none"' > /etc/initramfs-tools/conf.d/ip
Обновляем initramfs
ЗАПУСКАТЬ ПРИ ЛЮБОМ ИЗМЕНЕНИИ КОНФИГА dropbear-iniramfs
update-initramfs -k all -u
reboot
Система требует ввести пароль для дальнейшей загрузки
ВАРИАНТ 2:
ДЕШИФРУЕМ СИСТЕМНЫЙ РАЗДЕЛ И ВТОРОЙ ДИСК С ДАННЫМИ
---
// можно использовать и просто для системного диска
// для этого не используем строку дешифровки второго диска /dev/sdb в скрипте (см. далее)
---
// https://askubuntu.com/questions/1076305/dropbear-initramfs-on-ubuntu-18-04
apt-get install dropbear initramfs-tools busybox
nano /etc/default/dropbear
...
NO_START=1
...
// этот скрипт создает при загрузке системы скрипт /usr/bin/unlock,
// который будет автоматически запускаться при входе клиента ssh в оболочку сервера.
// обращаем внимания на дополнительную строку: /sbin/cryptsetup luksOpen /dev/sdb data01
// она дешифрует второй диск с данными, затем необходимо будет ввести пароль для первого системного диска,
// после чего система начнет загружаться
nano /etc/initramfs-tools/hooks/crypt_unlock.sh
---
#!/bin/sh
PREREQ="dropbear"
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
# custom non-system disk decrypt
/sbin/cryptsetup luksOpen /dev/sdb data01
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following lines will be executed after the passphrase has been correctly entered
# kill the remote shell
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF
chmod 755 "${DESTDIR}/bin/unlock"
mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF
chmod 755 "${DESTDIR}/lib/unlock/plymouth"
echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd
fi
---
chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
nano /etc/initramfs-tools/scripts/init-bottom/cleanup.sh
---
#!/bin/sh
echo "Killing dropbear"
killall dropbear
exit 0
---
chmod +x /etc/initramfs-tools/scripts/init-bottom/cleanup.sh
// IP dropbear, к которому будем подключаться для дешифрования разделов
nano /etc/initramfs-tools/initramfs.conf
...
IP=192.168.199.177::192.168.199.1:255.255.255.0:::off
---
// настройки dropbear
// -c /usr/bin/unlock - автозапуск скрипта дешифрования при подключением клиентом ssh при загрузке iniramfs
echo 'DROPBEAR_OPTIONS="-RFEsjk -c /usr/bin/unlock"' > /etc/dropbear-initramfs/config
// содержимое cat id_rsa.pub (который создали на клиенте) копируем и помещаем в файл authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvPopsr/hQHihV59qKcLLXLVae0SUshN6xPPe+y7SidCzjBvt4dAhj9IRagxDbRIRaqLefIO+wyvR8bu6qXfYV98Nf8qNRgeCjvseCnxUwR7ek/51NXhn1FqwHRwdvswIwbkF88aIPdgpL8+BBqoIQKgULIKNdDJ/QigqvWN3WacKpfWp/Nyae9h4LYsOV2tLVb/42q3Hw9T9ojEkk3fa1+JWO5ioZdG/8BTTix0C4/yesOGDo4TraN3sHMK2wd+cSoG2tgzkU9hhfQCTACP/j1FO7qNxqIveeSHraAP12yLqaWXeT5SS/FQq8Tf3+c6/nX3lM7aTr/cHwM8WTdzWD root@centos7-test01' > /etc/dropbear-initramfs/authorized_keys
// обновляем настройки iniramfs
// ЗАПУСКАТЬ ПРИ ЛЮБОМ ИЗМЕНЕНИИ КОНФИГА dropbear-iniramfs
update-initramfs -u
reboot
// система требует ввести пароль для дальнейшей загрузки
ПОДКЛЮЧИТЬСЯ ИЗ LINUX ДЛЯ ДЕШИФРОВАНИЯ РАЗДЕЛА:
---
// когда будет запрос пароля на подключение шифрованных разделов,
// подключаемся С КЛИЕНТА, PUBLICKEY КОТОРОГО ВНЕСЛИ В authorized_keys
// пароль root SSH сервера не будет запрашиваться, так как мы добавили publickey клиента на сервер.
// публичный ключ id_rsa.pub, после его внесения в /etc/dropbear-initramfs/authorized_keys на сервере,
// необязательно использовать только с клиента, на котором мы его создали.
// можно перенести ключ на любую Linux машину и использовать эту машину для подключения к серверу.
// по-умолчанию при использовании ssh-клиента, система ищет ключи в ~/.ssh
// указать путь к паре ключей (id_rsa / id_rsa.pub) вручную также можно опцией -i
ssh -i /root/rsa/id_rsa root@192.168.199.186
...
Please unlock disk sda5_crypt:
...
// вводим пароль на шифрованный раздел
// готово - система загружается
ПОДКЛЮЧИТЬСЯ ИЗ WINDOWS ДЛЯ ДЕШИФРОВАНИЯ РАЗДЕЛА:
---
// для дешифрования раздела будем использовать PUTTY
// и ту же пару ключей, которую создали в Linux
// копируем пару ключей (id_rsa / id_rsa.pub) из системы Linux в систему Windows, в директорию "rsa" в папке с plink.exe
// скачиваем puttygen.exe и plink.exe
// https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
// необходимо сконвертировать приватный ключ id_rsa в формат, который поймет putty
// https://www.simplified.guide/putty/convert-ssh-key-to-ppk
// запускаем puttygen
Load - выбираем приватный ключ id_rsa
// будет сообщение об успехе импорта ключа, далее:
Save private key - сохраняем файл как id_rsa.ppk (формат ключа putty) в директорию "rsa" в папке с plink.exe
// запускаем plink, указав путь к ключу id_rsa.ppk
plink.exe -batch -i .\rsa\centos7-test01-199-191\id_rsa.ppk root@192.168.199.186
...
Please unlock disk sda2_crypt:
...
// вводим пароль шифрования
// готово - система загружается
ПОДКЛЮЧИТЬСЯ ИЗ MIKROTIK ROUTEROS ДЛЯ ДЕШИФРОВАНИЯ РАЗДЕЛА:
---
// копируем на микротик пару ключей (id_rsa / id_rsa.pub), которые создали на Linux
// и импортируем их
/user ssh-keys private import user=admin private-key-file=id_rsa public-key-file=id_rsa.pub passphrase=""
// подключаемся
/system ssh address=192.168.199.177 user=root
...
Please unlock disk sda2_crypt:
...
// вводим пароль шифрования
// готово - система загружается
ВАРИАНТ 2:
ШИФРОВАНИЕ ВСЕХ РАЗДЕЛОВ, ВКЛЮЧАЯ /BOOT
// https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html
// https://habr.com/ru/post/306606/
-----------------------------------------------