Verschlüsselte zfs-Datasets übertragen (send/receive)

Datum

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 manPage:
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

Autor
Kategorien ZFS, Backup

PRTG Map