Seit der vor kurzem erschienenen ZFS-Version 0.8.0 ist es möglich Datasets nativ zu verschlüsseln.
Installation der aktuellsten zfs-Version (CentOS)
In CentOS installieren wir zfs in der Version 0.8.0
, indem wir das zfs-testing
-Repo temporär verwenden:
Dazu installieren wir das offizielle ZFS on Linux
Repo für unsere CentOS-Version (7.6):
yum install http://download.zfsonlinux.org/epel/zfs-release.el7_6.noarch.rpm
und nun steht uns auch das zfs-testing
Repo zur Verfügung:
[root@localhost ~]# yum --enablerepo=zfs-testing info zfs
Verfügbare Pakete
Name : zfs
Architektur : x86_64
Version : 0.8.0
Ausgabe : 1.el7
Größe : 470 k
Quelle : zfs-testing/x86_64
Zusammenfassung: Commands to control the kernel modules and libraries
URL : http://zfsonlinux.org/
Lizenz : CDDL
Beschreibung: This package contains the core ZFS command line utilities.
Folglich lautet der Befehl zur Installation: yum --enablerepo=zfs-testing install zfs
Nun wird zfs per DKMS installiert:
...
Loading new zfs-0.8.0 DKMS files...
Building for 3.10.0-957.12.2.el7.x86_64
Building initial module for 3.10.0-957.12.2.el7.x86_64
Done.
...
zfs.ko.xz:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.10.0-957.12.2.el7.x86_64/extra/
Im Anschluss daran sollte zfs auf dem System installiert sein und das entsprechende Kernel-Modul geladen.
Sollte dies nicht der Fall sein, z.B. erkennt man die an der Fehlermeldung The ZFS modules are not loaded.
, kann man das zfs-Modul mit dem Befehl modprobe zfs
entsprechend laden.
[root@localhost ~]# modprobe zfs
[root@localhost ~]# zfs version
zfs-0.8.0-1
zfs-kmod-0.8.0-1
Erstellen eines verschlüsselten Datasets
Lautman
-Page haben wir folgende Verschlüsselungsalgorithmen zur Auswahl:
- aes-128-ccm (Standard)
- aes-192-ccm
- aes-256-ccm
- aes-128-gcm
- aes-192-gcm
- aes-256-gcm
Erstellen eines zfs-pools
Um ein verschlüsseltes Dataset zu erstellen, erstelle ich mir zuerst einmal einen zfs pool
und verwende dafür eine zusätzliche HDD (/dev/sdb
).
[root@localhost ~]# zpool create pool1 /dev/sdb
[root@localhost ~]# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
pool1 29,5G 358K 29,5G - - 0% 0% 1.00x ONLINE -
Um zu prüfen ob der neu erstellte Pool die Verschlüsselung unterstützt, verwendet man folgenden Befehl:
[root@localhost ~]# zpool get all pool1 | grep encryption
pool1 feature@encryption active local
ein per Passwort verschlüsseltes Dataset erstellen
Der Parameter, welcher angibt das wir hier ein Passwort (oder ein Keyfile) verwenden wollen lautet keyformat
.
Aus der man
-Page:
keyformat=raw|hex|passphrase
Controls what format the user's encryption key will be provided as. This property is only set when the dataset is encrypted.
Nun erstellen wir ein Dataset mit Namen test
in unserem Pool pool1
und verschlüsseln dieses mit einem Passwort:
[root@localhost ~]# zfs create -o encryption=aes-256-gcm -o keyformat=passphrase pool1/test
Enter passphrase:
Re-enter passphrase:
Noch ein kurzer Blick ob alles geklappt hat:
[root@localhost ~]# zfs list pool1/test
NAME USED AVAIL REFER MOUNTPOINT
pool1/test 98K 28,6G 98K /pool1/test
[root@localhost ~]# zfs get encryption pool1/test
NAME PROPERTY VALUE SOURCE
pool1/test encryption aes-256-gcm -
Hierbei muss man natürlich beachten, dass das Dataset nicht automatisch nach einem Neustart des Systems gemountet wird, da erst manuell ein Passwort eingegeben werden muss.
Um das Passwort zu ändern verwendet man die Option change-key
:
[root@localhost ~]# zfs change-key pool1/test
Enter new passphrase for 'pool1/test':
Re-enter new passphrase for 'pool1/test':
ein per (raw)key verschlüsseltes Dataset erstellen
Auszug aus der man
-Page:
Raw keys and hex keys must be 32 bytes long (regardless of the chosen encryption suite) and must be randomly generated
Einen raw
key kann man mit folgendem Befehl erstellen:
[root@localhost ~]# dd if=/dev/urandom of=/root/zfs_key bs=32 count=1
1+0 Datensätze ein
1+0 Datensätze aus
32 Bytes (32 B) kopiert, 0,000730223 s, 43,8 kB/s
Um nun ein Dataset mit Namen test2
zu erhalten, verwendet man den entsprechenden Befehl:
zfs create -o encryption=aes-256-gcm -o keyformat=raw -o keylocation=file:///root/zfs_key pool1/test2
Hierbei ist besonders auf das file:// vor der Pfadangabe des Keyfiles zu achten.
[root@localhost ~]# zfs get encryption
NAME PROPERTY VALUE SOURCE
pool1 encryption off default
pool1/test encryption aes-256-gcm -
pool1/test2 encryption aes-256-gcm -
Es besteht ebenfalls die Möglichkeit ein entsprechendes Passwort oder (raw)key-File per GET
Request von einem anderen Server zu holen.
Bsp.:
zfs create -o encryption=on -o keysource=raw,https://keys.example.com/mykey <pool/dataset>
Prüfen ob die Keys geladen sind
Hierbei verwendet man denkeystatus
, welche 3 Status ausgibt:
off
(unverschlüsseltes Dataset)available
(Schlüssel für das Dataset ist geladen)unavailable
(Schlüssel für das Dataset ist nicht geladen)
Eine entsprechende Abfrage sieht wie folgt aus:
[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/test2 encryption aes-256-gcm -
pool1/test2 keystatus available -
Beispiel wenn ein Key nicht geladen ist:
[root@localhost ~]# zfs get -p encryption,keystatus pool1/test
NAME PROPERTY VALUE SOURCE
pool1/test encryption aes-256-gcm -
pool1/test keystatus unavailable -
Hier ist es nun auch nicht möglich das Dataset zu mounten:
[root@localhost ~]# zfs mount pool1/test
cannot mount 'pool1/test': encryption key not loaded
Key laden
Hierfür wird die Option load-key
verwendet:
[root@localhost ~]# zfs load-key pool1/test
Enter passphrase for 'pool1/test':
Nun ist der Key wieder geladen und das Dataset kann gemountet werden.
[root@localhost ~]# zfs get -p encryption,keystatus pool1/test
NAME PROPERTY VALUE SOURCE
pool1/test encryption aes-256-gcm -
pool1/test keystatus available -
Informationen anzeigen
Um sich einzelne Parameter der Pools/Datasets anzuschauen verwendet man zfs get
und dann per Komma getrennt die Auflistung der anzuzeigenden Parameter.
Bsp.:
[root@localhost ~]# zfs get -p encryption,keystatus,keyformat,keylocation,encryptionroot
NAME PROPERTY VALUE SOURCE
pool1 encryption off default
pool1 keystatus - -
pool1 keyformat none default
pool1 keylocation none default
pool1 encryptionroot - -
pool1/test encryption aes-256-gcm -
pool1/test keystatus available -
pool1/test keyformat passphrase -
pool1/test keylocation prompt local
pool1/test encryptionroot pool1/test -
pool1/test2 encryption aes-256-gcm -
pool1/test2 keystatus available -
pool1/test2 keyformat raw -
pool1/test2 keylocation file:///root/zfs_key local
pool1/test2 encryptionroot pool1/test2 -
Welche Parameter hierbei unterstützt werden erfährt man mit zfs get
:
[root@localhost ~]# zfs get
missing property argument
usage:
get [-rHp] [-d max] [-o "all" | field[,...]]
[-t type[,...]] [-s source[,...]]
<"all" | property[,...]> [filesystem|volume|snapshot|bookmark] ...
The following properties are supported:
PROPERTY EDIT INHERIT VALUES
available NO NO <size>
clones NO NO <dataset>[,...]
compressratio NO NO <1.00x or higher if compressed>
createtxg NO NO <uint64>
creation NO NO <date>
...