Verschlüsseltes ZFS-Dataset erstellen

Datum

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

Laut man-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 rawkey 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 den keystatus, 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>
...

Autor
Kategorien ZFS, Server

PRTG Map