Proxmox. Установка на зашифрованный системный раздел

Материал из Wiki
Перейти к навигации Перейти к поиску

Описание

Установка Proxmox на зашифрованный системный раздел. При загрузке ОС необходимо вводить пароль шифрования.

Установка

Вариант 1. Установка Debian 10 на шифрованный раздел LVM, и уже в Debian ставим Proxmox

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

Запускаем установку Debian 10 на отдельный диск для ОС.

Создаем и шифруем раздел, на котором будут разделы LVM / и swap

Вариант шифрования 1. Создание системного раздела произвольного объема

Предпочтительный, поскольку можно создать шифрованный раздел небольшого размера. Потом будет проще и быстрее его бэкапировать, хранить и восстанавливать

Pve os crypt 1.jpg
Pve os crypt 2.jpg
Pve os crypt 3.jpg
Pve os crypt 4.jpg
Pve os crypt 5.jpg
Pve os crypt 6.jpg
Pve os crypt 7.jpg
Pve os crypt 8.jpg
Pve os crypt 9.jpg
Pve os crypt 10.jpg
Pve os crypt 11.jpg
Pve os crypt 12.jpg
Pve os crypt 13.jpg
Pve os crypt 14.jpg
Pve os crypt 15.jpg
Pve os crypt 16.jpg
Pve os crypt 17.jpg
Pve os crypt 18.jpg
Pve os crypt 19.jpg
Pve os crypt 20.jpg
Pve os crypt 21.jpg
Pve os crypt 22.jpg
Pve os crypt 23.jpg
Pve os crypt 24.jpg
Pve os crypt 25.jpg
Pve os crypt 26.jpg
Pve os crypt 27.jpg
Pve os crypt 28.jpg
Pve os crypt 29.jpg
Pve os crypt 30.jpg
Pve os crypt 31.jpg
Pve os crypt 32.jpg
Pve os crypt 33.jpg
Pve os crypt 34.jpg
Pve os crypt 35.jpg
Pve os crypt 36.jpg
Pve os crypt 37.jpg
Pve os crypt 38.jpg

Вариант шифрования 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

systemctl restart networking ИЛИ 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

Шифрование

Если в системе есть диск с данными, который мы хотим дешифровать при загрузке вместе с системным, то добавим вторую строку с диском 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.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/

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:
...

Вводим пароль шифрования

Готово - система загружается

Также можно использовать скрипт для включения компьютера через 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

https://habr.com/ru/post/306606/