Neben der Erstellung verschlüsselter Datasets (siehe Techgoat-Artikel Verschlüsseltes ZFS-Dataset erstellen) gibt es seit dem neusten zfs-Release (0.8.0) auch die Möglichkeit verschlüsselte Datasets per send
/ receive
zu übertragen.
Vorbereitungen
Mein Ausgangspunkt ist folgender:
Ich habe einen Server welcher einen zfs-Pool pool1
hat, welcher ein verschlüsseltes Dataset test
besitzt.
[root@localhost ~]# zfs get mountpoint pool1/test
NAME PROPERTY VALUE SOURCE
pool1/test mountpoint /pool1/test default
[root@localhost ~]# zfs get -p encryption,keystatus pool1/test
NAME PROPERTY VALUE SOURCE
pool1/test encryption aes-256-gcm -
pool1/test keystatus available -
In dem gemounteten Ordner dazu gefindet sich zu Testzwecken eine „wichtige“ Datei:
[root@localhost ~]# ll /pool1/test
insgesamt 654915
-rw-r--r--. 1 root root 670040064 27. Apr 13:19 debian-9.9.0-amd64-xfce-CD-1.iso
Dieses verschlüsselte Dataset mit der „wichtigen“ Datei soll an einen anderen Server mit einem anderen zfs-Pool übertragen werden.
[root@anderer_server ~]# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
anderer_pool1 7,50G 358K 7,50G - - 0% 0% 1.00x ONLINE -
Snapshot erstellen
Als erstes erstellen wir einen Snapshot von dem Dataset und nennen diesen migrate
:
[root@localhost ~]# zfs snapshot -r pool1/test@migrate
[root@localhost ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool1/test@migrate 0B - 98K -
Nun haben wir einen Snapshot, welcher genauso verschlüsselt ist wie das Dataset von dem er erstellt wurde.
[root@localhost ~]# zfs get -p encryption,keystatus
NAME PROPERTY VALUE SOURCE
pool1 encryption off default
pool1 keystatus - -
pool1/test encryption aes-256-gcm -
pool1/test keystatus available -
pool1/test@migrate encryption aes-256-gcm -
pool1/test@migrate keystatus available -
Übertragen des Snapshots
Die Besonderheit bei der Übertragung des eben erstellten Snapshots ist die Option -w
.
Ein Auszug aus der man
-Page:
-w, --raw
For encrypted datasets, send data exactly as it exists on disk. This allows backups to be taken even if encryption keys are not currently loaded.
Der Befehl zum übertragen des Snapshots in den Pool eines anderen Server lautet wie folgt:
zfs send -w pool1/test@migrate | ssh root@192.168.2.62 zfs recv anderer_pool1/test
Hier wird nun der Snapshot migrate
vom verschlüsselten Dataset pool1/test
per zfs send -w
gesendet und dieser wird auf der entsprechenden Gegenseite per zfs recv <POOL/Dataset-Name>
empfangen.
Vor der Übertragung (Gegenseite):
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
anderer_pool1 132K 7,27G 24K /anderer_pool1
Nach dem Empfang des Snapshots:
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
anderer_pool1 640M 6,64G 24K /anderer_pool1
anderer_pool1/test 640M 6,64G 640M /anderer_pool1/test
$ zfs get -p encryption,keystatus
NAME PROPERTY VALUE SOURCE
anderer_pool1 encryption off default
anderer_pool1 keystatus - -
anderer_pool1/test encryption aes-256-gcm -
anderer_pool1/test keystatus unavailable -
anderer_pool1/test@migrate encryption aes-256-gcm -
anderer_pool1/test@migrate keystatus unavailable -
Mounten des verschlüsselten Datasets
Um das neue verschlüsselte Dataset anderer_pool1/test
zu mounten muss zu erst der Key geladen werden. D.h. Da bei der Verschlüsselung ein Passwort eingegeben wurde, muss dieses hier nun auch zum entschlüsseln des Datasets verwendet werden.
Auszug aus der man
Page:
Upon being received, the dataset will have the same encryption keys as it did on the send side, although the keylocation property will be defaulted to prompt if not otherwise provided.
Anschließend lässt sich das Dataset unter dem als mountpoint
eingestellten Ordner mounten.
[root@anderer_server ~]# zfs get mountpoint
NAME PROPERTY VALUE SOURCE
anderer_pool1 mountpoint /anderer_pool1 default
anderer_pool1/test mountpoint /anderer_pool1/test default
anderer_pool1/test@migrate mountpoint - -
[root@anderer_server ~]# zfs load-key anderer_pool1/test
Enter passphrase for 'anderer_pool1/test':
[root@anderer_server ~]# zfs mount anderer_pool1/test
Nun haben wir die „wichtige“ Datei sicher übertragen:
[root@anderer_server ~]# ll /anderer_pool1/test
insgesamt 654908
-rw-r--r--. 1 root root 670040064 27. Apr 13:19 debian-9.9.0-amd64-xfce-CD-1.iso