Ich suche schon seit längerem nach einer Möglichkeit, ZFS zu verschlüsseln. Es ist angekündigt, dass ZFS noch in diesem Jahr mit einer Verschlüsselungsoption ausgestattet wird, aber ich will nicht noch länger warten. Infos zu dem Projekt gibt es hier http://opensolaris.org/os/project/zfs-crypto.
Nun aber zu dem Workaround, anders kann man das wirklich nicht nennen (auch weil die Performance nicht so der Hit ist). Es gibt ein Tool namens lofi, mit dem man Dateien loopback mounten kann und eben auch Support für Verschlüsselung und Kompression mitbringt. Also können wir eine Platte auf Blockebene verschlüsseln, und darauf einen zpool installieren. Dadurch haben wir einen verschlüsselten zpool.
Aber der Reihe nach. Ich habe mich entschieden, Keyfiles zu benutzen. Ich will diese dann auf einem verschlüsselten USB-Stick speichern. Zuerst erzeugen wir die Schlüssel, die wir für die Verschlüsselung benutzen:
root@opensolaris:~# pktool genkey keystore=file outkey=/lofi.key keytype=aes keylen=256 print=y
Key Value ="bedb8b90dfe20307a9169fd0016cbe6317fbb3b2e3fa6e82ff9a6413c10f35d5"
root@opensolaris:~# pktool genkey keystore=file outkey=/lofi2.key keytype=aes keylen=256 print=y
Key Value ="d8a0bea56fe3c07c707bec18068320515b82b1dca891c532a8c7df4ad917e6d4"
Das hat komischerweise nur funktioniert, wenn man den Key direkt in / ablegt, danach kann der Key aber an eine beliebige andere Stelle verschoben werden. Ich habe sie nach /root/ verschoben. Nun benutzen wir diese Keys um die Festplatten zu verschlüsseln:
root@opensolaris:~# lofiadm -a /dev/dsk/c7d1p0 -c aes-256-cbc -k /root/lofi.key
/dev/lofi/1
root@opensolaris:~# lofiadm -a /dev/dsk/c8d1p0 -c aes-256-cbc -k /root/lofi2.key
/dev/lofi/2
Dadurch werden Devices in /dev/lofi/ erzeugt, normalerweise /dev/lofi/1 und /dev/lofi/2. Der gleiche Befehl wird im nachhinein auch benutzt, um die Platte zu entschlüsseln. Leider gibt es keine Überprüfung, ob der Key stimmt, die Entschlüsselung funktioniert dann einfach nicht. Als nächstes erzeugen wir einen zpool auf diesen verschlüsselten Devices:
root@opensolaris:~# zpool create crypt mirror /dev/lofi/1 /dev/lofi/2
root@opensolaris:~# zpool status crypt
pool: crypt
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
crypt ONLINE 0 0 0
mirror ONLINE 0 0 0
/dev/lofi/2 ONLINE 0 0 0
/dev/lofi/1 ONLINE 0 0 0
errors: No known data errors
Nun kann man beginnen, mit dem zpool zu arbeiten. Nach einem Neustart kann dieser Pool natürlich nicht benutzt werden, weil die Festplatten unter dem Dateisystem ja nicht entschlüsselt sind.
root@opensolaris:~# zpool status crypt
pool: crypt
state: UNAVAIL
status: One or more devices could not be used because the label is missing
or invalid. There are insufficient replicas for the pool to continue
functioning.
action: Destroy and re-create the pool from a backup source.
see: http://www.sun.com/msg/ZFS-8000-5E
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
crypt UNAVAIL 0 0 0 insufficient replicas
mirror UNAVAIL 0 0 0 insufficient replicas
/dev/lofi/1 FAULTED 0 0 0 corrupted data
/dev/lofi/2 FAULTED 0 0 0 corrupted data
Man muss also die Platten entschlüsseln und danach den zpool neu initialisieren:
root@opensolaris:~# lofiadm -a /dev/dsk/c7d1p0 -c aes-256-cbc -k /root/lofi.key
/dev/lofi/1
root@opensolaris:~# lofiadm -a /dev/dsk/c8d1p0 -c aes-256-cbc -k /root/lofi2.key
/dev/lofi/2
root@opensolaris:~# zpool export crypt
root@opensolaris:~# zpool import -d /dev/lofi crypt
root@opensolaris:~# zpool status crypt
pool: crypt
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
crypt ONLINE 0 0 0
mirror ONLINE 0 0 0
/dev/lofi/2 ONLINE 0 0 0
/dev/lofi/1 ONLINE 0 0 0
errors: No known data errors
Jetzt ist der Pool wieder verfügbar. Es gibt sicherlich auch noch eine andere Möglichkeit, export und import scheint mir da irgendwie übertrieben, aber anders hab ich es nicht hingekriegt. Jetzt muss man sich nur noch überlegen, wo man den Key abspeichert um seine Daten vor unbefugtem Zugriff zu schützen. Ich werde wohl einen USB-Stick benutzen, auf dem die Keys liegen und der ebenfalls mit lofi verschlüßelt ist. Allerdings nicht mit einem Keyfile, sondern mit einem Passwort. Das ganze packt man in ein Skript und dann sind die Daten auf der relativ sicheren Seite und einigermaßen stressfrei verwalten. Wenn dazu noch jemand Infos haben will, dann meldet euch in den Kommentaren.