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

В статье также предполагается, что установка Proxmox является новой и пока не имеет виртуальных машин или контейнеров.

Шифрование rpool/ROOT набор данных

Proxmox устанавливает свою систему внутри rpool/ROOT набор данных. Это то, что мы будем шифровать первыми.

Установите обычно с помощью установщика, после настройки перезагрузки в режим восстановления (с USB-накопителя). Обязательно установите в режиме UEFI (нужен системный загрузчик).

  1. Установка с zfs (RAID0 для однодискового приложения)
  2. Перезагрузка в ISO > Расширенные опции > Графический режим отладки
  3. Выйти с exit или Ctrl+D
  4. Выполнить следующие команды:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Import the old
zpool import -f rpool

# Make a snapshot of the current one
zfs snapshot -r rpool/ROOT@copy

# Send the snapshot to a temporary root
zfs send -R rpool/ROOT@copy | zfs receive rpool/copyroot

# Destroy the old unencrypted root
zfs destroy -r rpool/ROOT

# Set better ZFS properties
zpool set autoexpand=on rpool
zpool set autotrim=on rpool
zpool set failmode=wait rpool

# Create a new zfs root, with encryption turned on
# OR -o encryption=aes-256-gcm - aes-256-ccm vs aes-256-gcm
zfs create -o acltype=posix -o atime=off -o compression=lz4 -o encryption=aes-256-gcm -o checksum=blake3 -o dnodesize=auto -o encryption=on -o keyformat=passphrase -o overlay=off -o xattr=sa rpool/ROOT

# Copy the files from the copy to the new encrypted zfs root
zfs send -R rpool/copyroot/pve-1@copy | zfs receive -o encryption=on rpool/ROOT/pve-1

# Deviate from the original gist and delete copyroot
zfs destroy -r rpool/copyroot

# Set the Mountpoint
zfs set mountpoint=/ rpool/ROOT/pve-1

# Export the pool again, so you can boot from it
zpool export rpool

Перезагрузка в систему. Теперь вам следует предложить пароль шифрования.

1
reboot -f

Шифрование rpool/data набор данных

Далее нам нужно зашифровать rpool/data набор данных. Именно здесь Proxmox хранит виртуальные машинные диски.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import the pool with an alternate root at /mnt
zpool import -f -R /mnt rpool

# Load the encryption keys for all encrypted datasets
zfs load-key -a

# Destroy original dataset as after mounting pve-1 in the next step rpool/data will appear `busy`
zfs destroy -r rpool/data

# Mount the 'pve-1' dataset
zfs mount rpool/ROOT/pve-1

# Recursively bind the /proc directory to the chroot environment
mount -o rbind /proc /mnt/proc

# Recursively bind the /sys directory
mount -o rbind /sys /mnt/sys

# Recursively bind the /dev directory
mount -o rbind /dev /mnt/dev

# Change root into the new environment
chroot /mnt /bin/bash

Создайте парольную фразу diceware и сохраните ее /.data.key. Затем продолжайте:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Create a new encryption key
dd if=/dev/urandom bs=32 count=1 of=/.data.key 

# Set the appropriate permission
chmod 400 /.data.key

# Make the key immutable
chattr +i /.data.key

# Create a new dataset with encryption enabled
zfs create -o acltype=posix -o atime=off -o compression=lz4 -o encryption=aes-256-gcm -o checksum=blake3 -o dnodesize=auto -o encryption=on -o keyformat=passphrase -o keylocation=file:///.data.key -o keyformat=raw -o overlay=off -o xattr=sa rpool/data

Далее нам нужно настроить системную услугу для автоматической разблокировки. Поместите следующее внутрь /etc/systemd/system/zfs-load-key.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=Load encryption keys
DefaultDependencies=no
After=zfs-import.target
Before=zfs-mount.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/zfs load-key -a

[Install]
WantedBy=zfs-mount.service

Наконец, включить услугу:

1
systemctl enable zfs-load-key.service

Добавить возможность разблокировки через SSH (dropbear-initramfs)

Неудобно вводить пароль шифрования на консоли. Возможно, вы захотите настроить Dropbear внутри initramfs, чтобы вместо этого разблокировать диск над SSH.

Во-первых, установите dropbear-initramfs пакет. Обратите внимание, что мы проходим --no-install-recommends аргумент здесь, так как мы не хотим, чтобы он был установлен cryptsetup и дайте раздражающие предостережения каждому поколению inmitramf.

1
apt install --no-install-recommends dropbear-initramfs

Дальше, добавьте ваши авторизованные_ключи в /etc/dropbear/initramfs/authorized_keys и исправить разрешения:

1
chmod 600 /etc/dropbear/initramfs/authorized_keys

Добавить эту строку в конфигурацию /etc/dropbear/initramfs/dropbear.conf с этой командой:

1
echo 'DROPBEAR_OPTIONS="-s -c cryptroot-unlock"' >> /etc/dropbear/initramfs/dropbear.conf

На мой взгляд, дефолт достаточно хорош. Некоторые другие сообщения в блоге могут порекомендовать вам изменить порт, чтобы избежать предупреждения о несоответствии с отпечатком пальца, но я бы порекомендовал использовать другой поддомен для подключения к Dredbear вместо этого. Таким образом, вы можете связать отпечаток пальца Dropbear с помощью записей SSHFP.

Если вы не сделаете дополнительную конфигурацию, Dropbear получит IP-адрес с DHCP-сервера.

Чтобы настроить статический IP-адрес, добавьте строку с этим синтаксисом к концу /etc/initramfs-tools/initramfs.conf:

1
IP=<client-ip>::<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>

Пример настройки IP-адреса для первого сетевого интерфейса:

1
IP=192.168.1.101::192.168.1.1:255.255.255.0:hostname

Пример настройки IP-адреса для интерфейса enp3s0:

ПРИМЕЧАНИЕ: Убедитесь, что ваше имя интерфейса не было переименовано при просмотре имени. Вы можете проверить имя интерфейса с ip link.

1
IP=192.168.1.27::192.168.1.1:255.255.255.0:hostname:enp3s0

Наконец, обновление initramfs с этой командой:

1
update-initramfs -k all -u

Обновите загрузчик Proxmox VE с этой командой:

1
proxmox-boot-tool refresh

Очистка и перезагрузка

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
exit

# Unmount /proc
umount /mnt/proc

# Unmount /sys
umount /mnt/sys

# Unmount /dev (if target is busy, check for nested mounts)
umount /mnt/dev

# Unmount the ZFS dataset
zfs unmount rpool/data

# Unmount the ZFS dataset
zfs unmount rpool/ROOT/pve-1

# Export the ZFS pool
zpool export rpool

# Use key combination to reboot the system
Ctrl + Alt + Del

Теперь вы должны быть в состоянии застрять в свой Dropbear при перезагрузке. Использовать zfsunlock для того, чтобы разблокировать rpool/ROOT набор данных

Завершение

Если вам понравился этот пост о том, как установить нативное шифрование ZFS в Proxmox, пожалуйста, поделитесь им со своими друзьями в социальных сетях, которым может быть интересна эта статья или оставьте комментарий ниже.