Proxmox. Установка на зашифрованный системный раздел
Описание
Установка Proxmox на зашифрованный системный раздел. При загрузке ОС необходимо вводить пароль шифрования.
Установка
Вариант 1. Установка Debian 10 на шифрованный раздел LVM, и уже в Debian ставим Proxmox
При такой установке раздел /boot будет незашифрован. ОС при запуске в явном виде будет просить ввести пароль для подключения шифрованных системных разделов.
Запускаем установку Debian 10 на отдельный диск для ОС.
Создаем и шифруем раздел, на котором будут разделы LVM / и swap
Вариант шифрования 1
Предпочтительный, поскольку можно создать шифрованный раздел небольшого размера. Потом будет проще и быстрее его бэкапировать, хранить и восстанавливать
Вариант шифрования 2
Простой. шифрованный раздел займет объем всего диска, неудобного бэкапировать и восстанавливать
В процессе установки выбираем установку на шифрованый раздел LVM
Автоматически будут созданы разделы:
sda1 - /boot
sda5 - sda5_crypt (на нем будут разделы / и swap)
После установки
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"
// - при загрузке после дешифрования системного раздела sda5_crypt появится запрос на дешифрование data01
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
// отчасти готово
// теперь, при запуске системы, необходимо подключиться удаленным управлением (например, 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:
...
// вводим пароль шифрования
// готово - система загружается
ВАРИАНТ 2:
ШИФРОВАНИЕ ВСЕХ РАЗДЕЛОВ, ВКЛЮЧАЯ /BOOT
// https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html
// https://habr.com/ru/post/306606/
-----------------------------------------------