Der Punkt würde mich sehr interessieren
Vorab ganz wichtig: Ich bin kein Experte, aber hab das ganze bei mir 2 oder 3 Mal gemacht und es hat geklappt. Ich sage nicht, dass es überall klappt und gebe keine Garantie, allerdings verstehe ich die Befehle und kann improvisieren, wenn was schief läuft. Einfaches Copy&Paste ohne zu kapieren, was man da macht, würde ich nicht empfehlen.
Hinweise:
- Es ist wichtig, welches Rescue-Live-System man verwendet - mit Ubuntu 22.04 hat das ganze nicht geklappt (vermutlich falsche ZFS Version). Ich nutze das hier in Kombination mit dieser Rescue CD.
Anleitung:
1. Schritt: Proxmox mit ZFS installieren
Das beschreibe ich jetzt mal nicht im Detail... man nimmt halt Proxmox, bootet den Installer und installiert es mit "erweitert" als ZFS statt ext4. Ansonsten alles wie gewohnt.
2. Schritt (Optional) - Remote Unlock via SSH:
Proxmox starten
Einen SSH public key auf den Clients erstellen, die einen Remote-Unlock per SSH durchführen können soll
Den remote unlock vorbereiten, in dem man den Public Key auf Proxmox überträgt (vor der Verschlüsselung des Laufwerks):
Bash:
PROXMOX_HOST="192.168.1.10"
ssh-copy-id root@$PROXMOX_HOST
ssh "root@$PROXMOX_HOST"
# install zfs ssh remote unlock feature
apt update
apt -y install zfs-initramfs dropbear-initramfs
# configure dropbear and ignore these errors, since we are not using cryptsetup, but native ZFS encryption
# cryptsetup: ERROR: Couldn't resolve device rpool/ROOT/pve-1
# cryptsetup: WARNING: Couldn't determine root device
mkdir -p /etc/dropbear-initramfs
cp "/root/.ssh/authorized_keys" /etc/dropbear-initramfs/
# optional: unlock-only shell with direct password prompt instead of a real shell
# bearbeitet die authorized_keys-Datei so, dass vor dem Key noch eingestellt wird, welche Kommandos erlaubt sind
# andernfalls muss man beim remote login noch zfsunlock ausführen
sed -i.bak 's/^ssh-/no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="\/usr\/bin\/zfsunlock" ssh-/g' /etc/dropbear-initramfs/authorized_keys
# configure dropbear options
grep '^DROPBEAR_OPTIONS' /etc/dropbear-initramfs/config > /dev/null || (echo 'DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 60"' >> /etc/dropbear-initramfs/config && update-initramfs -u)
3. Schritt - System verschlüsseln
Man bootet irgendeine System Rescue CD mit ZFS 2.0 unterstützung, um die Verschlüsselung durchzuführen.
Das kann auch mit Proxmox selbst im Recovery Mode gemacht werden, wenn man nicht Ventoy nutzt, ich habe aber Ventoy und das hier verwendet:
A fork of SystemRescue (formerly SystemRescueCd) with ZFS built-in and serial console access enabled for all boot options. Download bootable ISOs from the releases page. - nchevsky/systemrescue-zfs
github.com
An der Maschine bzw. über IPMI / AMT:
Bash:
# optional: Load your keyboard layout
loadkeys de
# stop firewall and enable sshd
systemctl stop iptables
systemctl start sshd
# change root password for remote login
passwd root
# show ip address
ip a
Danach kann man sich per SSH ins rescue einloggen und die root partition verschlüsseln:
Bash:
# optional: show pools that can be imported
zpool import
# import proxmox pool
zpool import -f rpool
# optional: show pool status
zpool status
# optional: list available datasets
zfs list
# 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 too prevent two datasets with the same mount point
zfs destroy -r rpool/ROOT
# 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 encryption=on -o keyformat=passphrase rpool/ROOT
# choose a strong passphrase
# 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
# Set the Mountpoint
zfs set mountpoint=/ rpool/ROOT/pve-1
# destroy the copyroot dataset
zfs destroy -r rpool/copyroot
# optional: verify that dataset structure is as expected
zfs list
# NAME USED AVAIL REFER MOUNTPOINT
# rpool 1.27G 1.76T 104K /rpool
# rpool/ROOT 1.27G 1.76T 192K /rpool/ROOT
# rpool/ROOT/pve-1 1.27G 1.76T 1.22G /
# rpool/data 96K 1.76T 96K /rpool/data
# optional: verify that root dataset is encrypted
zfs get encryption rpool/ROOT
# optional: enable trim for ssds
zpool set autotrim=on rpool # enable trim
# optional: enable compression zstd-4, see https://www.reddit.com/r/zfs/comments/sxx9p7/a_simple_real_world_zfs_compression_speed_an/
zfs set recordsize=1M compression=zstd-4 rpool
# Export the pool again
zpool export rpool
Nach einem Reboot muss man seine Passphrase eingeben - hat man den Remote-Unlock konfiguriert geht das mit:
Bash:
ssh -l root -p 2222 <Proxmox-IP>
Entweder muss man nun das Passwort eingeben oder den Befehl zfsunlock - je nachdem, ob man die authorized_keys entsprechend bearbeitet hat, dass nur noch die Passworteingabe erfolgen soll.
4. Schritt - data verschlüsseln
So, nun möchte man noch die Data-Partition für die VMs und LXC Container verschlüsseln. Das mache ich über eine Schlüssel-Datei, die auf der verschlüsselten root-Parition liegt. So kann ich nach dem reboot die VMs und Container automatisch starten lassen und muss nicht noch mal extra eine passphrase für eine weitere Partition eingeben. Man könnte auch die Data-Paritition wegwerfen und die Root vergrößern, allerdings bringt das aus meiner Sicht einige Nachteile mit sich (hinsichtlich Snapshots), auf die ich jetzt hier mal nicht näher eingehe (
schaut euch einfach dieses wirklich sehenswerte Video an)
Bash:
# Back in Proxmox
# create a strong encryption key
openssl rand -hex -out /root/data-encrypted.key 32
# backup your encryption key somewhere!!
# recreate data with key based encryption
umount /rpool/data
zfs snapshot -r rpool/data@copy
zfs send -R rpool/data@copy | zfs receive rpool/copydata
zfs destroy -r rpool/data
zfs send -R rpool/copydata@copy | zfs receive -o encryption=on -o keyformat=hex -o keylocation=file:///root/data-encrypted.key rpool/data
zfs set mountpoint=/rpool/data rpool/data
zfs destroy -r rpool/copydata
# encryption needs to load key first, so you have to create a system service, which performs the following on boot
# zfs load-key -r rpool/data
# zfs mount rpool/data # if not auto mounted
cat << 'EOF' > /etc/systemd/system/zfs-load-data-key.service
[Unit]
Description=Load ZFS keys
DefaultDependencies=no
Before=zfs-mount.service
After=zfs-import.target
Requires=zfs-import.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/zfs load-key -r rpool/data
[Install]
WantedBy=zfs-mount.service
EOF
systemctl enable --now zfs-load-data-key
So, das müsste es sein. Viel Erfolg - über konstruktives Feedback freue ich mich sehr, wie gesagt, ich bin KEIN Experte bei Proxmox oder ZFS.