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)
Add temp IP and gw (IF IT'S NOT DONE AUTOMATICALLY!)
ifconfig ens192 192.168.199.12/24
ip route add default via 192.168.199.1
Allow root login via SSH
nano /etc/ssh/sshd_config
... PermitRootLogin yes ...
systemctl restart sshd
Now you can login via SSH
Устанавливаем утилиту для работы с бриджами
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_ports ens192
bridge_stp off
bridge_fd 0
reboot
nano /etc/hostname
pve-test01
nano /etc/hosts
EXACTLY LIKE THIS! VERY IMPORTANT! REMOVE EVERYTHING ELSE!
127.0.0.1 localhost.localdomain localhost 192.168.199.189 pve-test01.local pve-test01 pvelocalhost
Проверяем
hostname --ip-address
... 192.168.199.189 ...
Debian 10 + PVE 6.x
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
Debian 11 + PVE 7.x
Add the Proxmox VE repository:
echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
Add the Proxmox VE repository key as root (or use sudo):
wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
Verify
sha512sum /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
7fb03ec8a1675723d2853b84aa4fdb49a46a3bb72b9951361488bfd19b29aab0a789a4f8c7406e71a69aabbc727c936d3549731c4659ffa1a08f44db8fdcebfa /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
Update your repository and system by running:
apt update && apt full-upgrade
Install the Proxmox VE Kernel
First you need to install and boot the Proxmox VE kernel, as some packages depend on specific kernel compile flags to be set or feature extensions (e.g., for apparmor) to be available.
apt install pve-kernel-5.15
reboot
Note that while the pve-kernel-5.15 is the default stable kernel for the Proxmox VE 7.x series, there's also a newer opt-in kernel available with pve-kernel-6.2, possibly helping to resolve some hardware related woes on modern systems
Install the Proxmox VE packages
apt install proxmox-ve postfix open-iscsi
Configure packages which require user input on installation according to your needs.
If you have a mail server in your network, you should configure postfix as a satellite system. Your existing mail server will then be the relay host which will route the emails sent by Proxmox VE to their final recipient. If you don't know what to enter here, choose local only and leave the system name as is.
Remove the Debian Kernel
Proxmox VE ships its own kernel and keeping the Debian default kernel can lead to trouble on upgrades, for example, with Debian point releases. Therefore, you must remove the default Debian kernel:
apt remove linux-image-amd64 'linux-image-5.10*'
Update and check grub2 config by running
update-grub
Recommended: Remove the os-prober Package
The os-prober package scans all the partitions of your host to create dual-boot GRUB entries. But the scanned partitions can also include those assigned to virtual machines, which one doesn't want to add as boot entry.
If you didn't install Proxmox VE as dual boot beside another OS, you can safely remove the os-prober package:
apt remove os-prober
Debian 12 + PVE 8.x
echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
Add the Proxmox VE repository key as root (or use sudo):
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg # verify sha512sum /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg 7da6fe34168adc6e479327ba517796d4702fa2f8b4f0a9833f5ea6e6b48f6507a6da403a274fe201595edc86a84463d50383d07f64bdde2e3658108db7d6dc87 /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
Update your repository and system by running:
apt update && apt full-upgrade
Install the Proxmox VE Kernel
First you need to install and boot the Proxmox VE kernel, as some packages depend on specific kernel compile flags to be set or feature extensions (e.g., for apparmor) to be available.
apt install pve-kernel-6.2
reboot
Install the Proxmox VE packages
apt install proxmox-ve postfix open-iscsi chrony
Note that you can replace chrony with any other NTP daemon, but we recommend against using systemd-timesyncd on server systems, and the ntpsec-ntpdate option might conflict with bringing up networking on boot on some hardware. Configure packages which require user input on installation according to your needs.
If you have a mail server in your network, you should configure postfix as a satellite system. Your existing mail server will then be the relay host which will route the emails sent by Proxmox VE to their final recipient.
If you don't know what to enter here, choose local only and leave the system name as is.
Remove the Debian Kernel
Proxmox VE ships its own kernel and keeping the Debian default kernel can lead to trouble on upgrades, for example, with Debian point releases. Therefore, you must remove the default Debian kernel:
apt remove linux-image-amd64 'linux-image-6.1*'
Update and check grub2 config by running:
update-grub
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
cp /usr/share/cryptsetup/initramfs/bin/cryptroot-unlock /bin/
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: ...
Вводим пароль шифрования
Готово - система загружается
Также можно использовать скрипт для включения компьютера через WOL и дальнейшего подключения для дешифровки, таким образом для дешифрования потребуется только ввод пароля зашифрованных дисков
# vars
:local proxmoxIp "192.168.17.251";
:local proxmoxMac "00:9C:02:97:5B:0D";
:local proxmoxUser "root";
:local mikrotikBridgeLocal "bridge-local";
:global proxmoxIpReachable [/ping $proxmoxIp count=3];
while ($proxmoxIpReachable = 0) do={
:delay delay-time=1s;
:global proxmoxIpReachable [/ping $proxmoxIp count=3];
:delay delay-time=1s;
:put "proxmoxIpReachable: $proxmoxIpReachable";
:put "Proxmox $proxmoxIp UNreachable...";
/tool wol mac=$proxmoxMac interface=$mikrotikBridgeLocal;
};
/system ssh user=$proxmoxUser address=$proxmoxIp;
Вариант 2. Шифрование всех разделов, включая /boot
https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html