Proxmox VE
ZFS Remote Entschlüsselung via SSH
Work in Progress!
Ein zfs pool wird beim Start des Hosts automatisch entschlüsselt. Der Key wird dafür via SSH von einem anderen Host angefragt. Falls das System in einem fremden Netzwerk gebootet wird, kann der Pool nicht entschlüsselt werden.
Vorbereitungen am empfangenden Host
Der Host, welche das verschlüsselte Saveset enthalten soll, muss zuerst ein SSH Schlüsselpaar erzeugen, welches danach für die Anfrage am bereitstellenden Host genutzt wird. Dafür nutze ich ed25519 als Keytype, da dies sicherer ist als RSA und unsere Gegenstelle sowieso ein modernes Debian / Proxmox sein wird.
ssh-keygen -t ed25519 -C "fetch-zfs-key@pve01-test" -f /etc/zfs/fetch-zfs-key_id
chmod 0600 /etc/zfs/fetch-zfs-key_id
Vorbereitungen am bereitstellenden Host
Auf dem Host, welcher den Key bereitstellen soll, muss der Key erzeugt werden und bei einem Aufruf eines bestimmten Kommandos ausgegeben werden.
Erzeugen des Keys
Den Key lege ich hier in diesem Beispiel unter /etc/zfs/remote-keys/<hostname>-<pool>.key
ab.
mkdir -p /etc/zfs/remote-keys
openssl rand -hex 32 | tr -d '\n' > /etc/zfs/remote-keys/pve01-test-encrypted.key
Ausgabekommando des Keys
Dieses Skript wird aufgerufen, wenn sich ein bestimmter SSH Key von einem bestimmten Host verbindet und stellt danach den Key bereit. Hierfür wird ein Bash-Skript unter /usr/local/sbin/provide-zfs-key
mit folgendem Inhalt erzeugt:
#!/bin/bash
cat /etc/zfs/remote-keys/$1.key
Diese Datei muss noch für den Owner ausführbar gemacht werden.
chmod 0700 /usr/local/sbin/provide-zfs-key
Um zu testen, ob dies funktioniert, kann bereits als root der Befehl provide-zfs-key pve01-encrypted
aufgerufen werden.
Erzeugen des verschlüsselten Datasets
Auf dem Host, der nun das verschlüsselte Dataset enthalten soll, wird jenes nun erzeugt und einmalig manuell entsperrt. Dafür benötigen wir den Hex-Key, den wir vorhin erzeugt haben.
zfs create -o encryption=on -o keyformat=hex rpool/encrypted
Hier fügt man nun zweimal den Key aus der Zwischenablage ein und prüft danach, ob das Saveset auch korrekt erzeugt und entsperrt wurde:
root@pve01-test:~# zfs get encryption,keylocation,keystatus rpool/encrypted
NAME PROPERTY VALUE SOURCE
rpool/encrypted encryption aes-256-gcm -
rpool/encrypted keylocation prompt local
rpool/encrypted keystatus available -