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"
apt update
apt -y install zfs-initramfs dropbear-initramfs
mkdir -p /etc/dropbear-initramfs
cp "/root/.ssh/authorized_keys" /etc/dropbear-initramfs/
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
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:
loadkeys de
systemctl stop iptables
systemctl start sshd
passwd root
ip a
Danach kann man sich per SSH ins rescue einloggen und die root partition verschlüsseln:
Bash:
zpool import
zpool import -f rpool
zpool status
zfs list
zfs snapshot -r rpool/ROOT@copy
zfs send -R rpool/ROOT@copy | zfs receive rpool/copyroot
zfs destroy -r rpool/ROOT
zfs create -o encryption=on -o keyformat=passphrase rpool/ROOT
zfs send -R rpool/copyroot/pve-1@copy | zfs receive -o encryption=on rpool/ROOT/pve-1
zfs set mountpoint=/ rpool/ROOT/pve-1
zfs destroy -r rpool/copyroot
zfs list
zfs get encryption rpool/ROOT
zpool set autotrim=on rpool
zfs set recordsize=1M compression=zstd-4 rpool
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:
openssl rand -hex -out /root/data-encrypted.key 32
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
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.