ADMIN

2023

09

2023-08-30T12:00:00

Hochverfügbarkeit und Monitoring

PRAXIS

058

Open-Source-Tipp

Sicherheit

Verschlüsselung

Datenträger bequem entschlüsseln mit LUKS und Yubikey

Schneller Zugriff

von Thorsten Scherf

Veröffentlicht in Ausgabe 09/2023 - PRAXIS

Verschlüsselte Datenträger sind mittlerweile Standard, und das ist auch gut so. Etwas nervig ist jedoch, bei jedem Neustart des Systems immer wieder die hinreichend komplexe Passphrase zum Entschlüsseln des Datenträgers eingeben zu müssen. Dabei existieren eine Vielzahl weiterer Methoden, um einen Datenträger zu entsperren. In diesem Monat zeigen wir Ihnen, wie Sie einen Yubikey für diese Aufgabe verwenden.

Gerade bei mobilen Endgeräten oder Datenträgern ist eine Verschlüsselung der Festplatte Pflicht. Dies geht in der Regel mit einem Passwort einher, das Sie bei jedem Systemstart eintippen müssen. Aber beginnen wir mit der Verschlüsselung selbst. Hierfür stehen Ihnen zumeist zwei Varianten zur Verfügung. Um lediglich einige Dateien oder Ordner verschlüsselt zu speichern, bietet sich Software wie GnuPG [1] oder EncFS [2] an. Sollen stattdessen gleich die komplette Festplatte oder einzelne Volumes geschützt werden, stellt das Linux Unified Key Setup (LUKS) [3] hierfür den Standard für Linux-Systeme dar.
LUKS setzt für die Verschlüsslung der Datenträger auf das Kernel-basierte dm-crypt-DeviceMapper-Target [4], das zur transparenten Verschlüsselung von Block-Devices, also Festplatten oder anderen Datenträgern, zum Einsatz kommt. LUKS stellt eine Erweiterung von dm-crypt dar und verwendet einen eigenen Header auf den Volumes, in dem Informationen zum jeweils verschlüsseltem Laufwerk aufgeführt sind.
Ein LUKS-Header stellt mehrere Slots zur Verfügung, in denen Sie unterschiedliche Passphrases für den Zugriff auf den eigentlichen Key zum Entschlüsseln des Volumes hinterlegen können. Des Weiteren finden Sie im LUKS-Header auch kryptografisch relevante Informationen, beispielsweise welche Algorithmen für die Verschlüsselung des Volumes zum Einsatz kommen.
Gerade bei mobilen Endgeräten oder Datenträgern ist eine Verschlüsselung der Festplatte Pflicht. Dies geht in der Regel mit einem Passwort einher, das Sie bei jedem Systemstart eintippen müssen. Aber beginnen wir mit der Verschlüsselung selbst. Hierfür stehen Ihnen zumeist zwei Varianten zur Verfügung. Um lediglich einige Dateien oder Ordner verschlüsselt zu speichern, bietet sich Software wie GnuPG [1] oder EncFS [2] an. Sollen stattdessen gleich die komplette Festplatte oder einzelne Volumes geschützt werden, stellt das Linux Unified Key Setup (LUKS) [3] hierfür den Standard für Linux-Systeme dar.
LUKS setzt für die Verschlüsslung der Datenträger auf das Kernel-basierte dm-crypt-DeviceMapper-Target [4], das zur transparenten Verschlüsselung von Block-Devices, also Festplatten oder anderen Datenträgern, zum Einsatz kommt. LUKS stellt eine Erweiterung von dm-crypt dar und verwendet einen eigenen Header auf den Volumes, in dem Informationen zum jeweils verschlüsseltem Laufwerk aufgeführt sind.
Ein LUKS-Header stellt mehrere Slots zur Verfügung, in denen Sie unterschiedliche Passphrases für den Zugriff auf den eigentlichen Key zum Entschlüsseln des Volumes hinterlegen können. Des Weiteren finden Sie im LUKS-Header auch kryptografisch relevante Informationen, beispielsweise welche Algorithmen für die Verschlüsselung des Volumes zum Einsatz kommen.
Setup eines Volumes
Um ein verschlüsseltes Volume zu erzeugen, bieten die meisten Linux-Distributionen ein grafisches Tool an oder erlauben das Setup bereits als Teil der Systeminstallation. In diesem Beispiel kommt das Kommandozeilentool crypt­setup zum Einsatz, das in jeder Linux-Distribution enthalten ist. Listing 1 zeigt ein einfaches Beispiel, wie Sie eine bestimmte Partition einer Festplatte verschlüsseln. Das DeviceMapper-LUKS-Volume heißt in diesem Fall "luks_data" und steht nach erfolgreicher Initialisierung über den Pfad "/dev/mapper/luks_data" zur Verfügung.
Listing 1: LUKS-Volume erstellen
cryptsetup --verify-passphrase -v luksFormat /dev/nvme0n1p2
cryptsetup luksOpen /dev/nvme0n1p2 luks_data
mkfs.xfs /dev/mapper/luks_data
cryptsetup luksClose /dev/mapper/luks_data
Möchten Sie im Anschluss auf das Volume "/dev/mapper/luks_data" zugreifen, ist hierfür die Eingabe der von Ihnen gewählten Passphrase notwendig. Weitere Kennwörter fügen Sie mit dem Kommando cryptsetup luksAddKey /dev/nvme0n1p2 hinzu. Die LUKS-Version 2 unterstützt bis zu 32 unterschiedliche Keyslots. Die Anzahl der bereits verwendeten Slots ermitteln Sie via cryptsetup luksDump /dev/nvme0n1p2.
Entsperren beim Systemstart
Damit das Volume beim Systemstart entsperrt wird, fehlt noch ein entsprechender Eintrag in der Datei "/etc/crypttab":
# cat /etc/crypttab
luks_data UUID=023fb9b7-1c42-4312-8f8a-5b1dcfb906e4
Mit diesen Zeilen verbinden Sie das DeviceMapper-LUKS-Volume "luks_data" mit der eigentlichen Partition Ihrer Festplatte. Anstatt den Device-Namen anzugeben, bietet es sich an, die UUID oder das Label der Partition zu verwenden. Beide Informationen bekommen Sie mit Hilfe des Kommandos blkid angezeigt. Starten Sie das System nun neu, werden Sie aufgefordert, die zuvor ausgewählte Passphrase zum Entsperren des Volumes einzugeben. Im Hintergrund kümmert sich dann zumeist der systemd-Service "systemd-cryptsetup" um das Entsperren des Volumes.
Nun ist das manuelle Eingeben eines Kennworts natürlich nicht sehr komfortabel. Von daher gibt es eine Reihe von Möglichkeiten, wie Sie das Volume automatisch entsperren, ohne hierfür zuerst eine Passphrase eingeben zu müssen. Am einfachsten, aber auch am unsichersten ist es, die Passphrase einfach in einer Key-Datei abzuspeichern und diese auf einem anderen Datenträger, beispielsweise einem USB-Stick, abzulegen. Damit systemd-cryptsetup weiß, wo diese Schlüsseldatei liegt, geben Sie in der Datei "/etc/crypttab" diese einfach mit der Option "keyfile" an, zum Beispiel:
uks_data UUID=023fb9b7-1c42-4312-8f8a-5b1dcfb906e4 keyfile:LABEL=usbstick
Daneben können Sie den Key für den Zugriff auf das LUKS-Volume aber auch von einem PKCS#11-, TPM- oder FIDO-Device beziehen und somit eine automatisierte, aber sichere Entsperrung des LUKS-Volumes vornehmen. Ferner besteht die Möglichkeit, das Volume mittels der Software Clevis und Tang an ein Netzwerk zu binden. Diese Variante war bereits Thema des Open-Source-Tipps im Mai 2017. Im Folgenden werfen wir einen Blick auf das LUKS-Setup in Kombination mit einem Yubikey FIDO2-Gerät.
LUKS und FIDO2
Sind Sie im Besitz eines FIDO2-Tokens, also beispielsweise eines aktuellen Yukikey [5], können Sie das LUKS-Volume an das FIDO2-Gerät binden. Dadurch verwenden Sie einen Schlüssel für den Zugriff auf das LUKS-Volume, der lediglich auf dem FIDO2-Gerät vorliegt und dieses auch nicht verlässt. Der Enrollment-Vorgang findet sehr einfach mithilfe des systemd-Tools "systemd-cryptenroll" statt. Im einfachsten Fall rufen Sie das Werkzeug wie folgt auf:
# systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
Natürlich ist auch in diesem Fall wieder der Device-Name entsprechend anzupassen. Achten Sie ebenfalls darauf, dass das Token vor dem Aufruf des Kommandos eingesteckt ist. Die Angabe der Option "fido2-device=auto" bewirkt, dass das Token automatisch erkannt wird, wenn dieses mit dem Rechner verbunden ist.
Sie werden nun aufgefordert die aktuelle Passphrase für das LUKS-Volume einzugeben, und im Anschluss startet die Initialisierung. Hierfür wird auf dem FIDO2-Token ein neuer Schlüssel generiert und ein neuer Keyslot im LUKS-Headers mit den notwendigen Informationen aktualisiert (Listing 2). Des Weiteren fängt das Token während der Initialisierungsphase an zu blinken und Sie müssen Ihre Präsenz durch Berührung des Tokens bestätigen.
Listing 2: Aktualisierter LUKS-Header für FIDO2
sudo systemd-cryptenroll --fido2-device auto /dev/nvme0n1p2
Please enter current passphrase for disk /dev/nvme0n1p2: *************
Initializing FIDO2 credential on security token.
Generating secret key on FIDO2 security token.
In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 1.
Ob Sie nun den soeben erzeugten FIDO2-Schlüssel für den Zugriff auf das LUKS-Volume einsetzen können, testen Sie mit dem folgenden Befehl:
# /usr/lib/systemd/systemd-cryptsetup attach luks-023fb9b7-1c42-4312-8f8a-5b1dcfb906e4 /dev/nvme0n1p2 -fido2-device=auto
Hat dies geklappt, erweitern Sie die Datei "/etc/crypttab" um den FIDO2-Eintrag beziehungsweise erzeugen einen neuen Eintrag wie folgt:
# echo "luks-023fb9b7-1c42-4312-8f8a-5b1dcfb906e4 /dev/nvme0n1p2 -fido2-device=auto" > /etc/crypttab
Initramfs aktualisieren
Damit ein Entsperren des LUKS-Volumes während des Bootvorgangs möglich ist, müssen Sie schließlich dafür sorgen, dass das fido2-Dracut-Modul geladen wird. Erzeugen Sie hierfür zuerst eine neue Dracut-Konfigurationsdatei:
# echo "add_dracutmodules+=\"fido2 \"" | /etc/dracut.conf.d/fido2.conf
Eine neue Initramfs erstellen Sie dann ganz einfach mit dracut -f. Booten Sie nun das System neu, fängt das FIDO2-Token an zu blinken, sobald das Laufwerk entsperrt werden soll. Durch eine Berührung des Tokens leiten Sie die automatische Entsperrung ein. Sollte das Token durch eine PIN geschützt sein, müssen Sie diese zuvor noch eingeben. Und falls etwas schiefläuft, haben Sie immer noch die Möglichkeit, das LUKS-Volume durch die zuvor eingerichtete Passphrase freizuschalten.
Fazit
Mobile Datenträger sind ein leichtes Ziel für Diebe. Umso wichtiger ist die Verschlüsselung der darauf befindlichen Daten. Mithilfe der dm-crypt-Erweiterung LUKS gelingt es sehr einfach, komplette Blockgeräte auf sichere Art und Weise zu schützen. Für den Zugriff ist dann jedoch die manuelle Eingabe einer Passphrase notwendig. Natürlich muss diese hinreichend komplex sein, um ein Knacken zu verhindern.
Um sich das mühsame Eintippen zu ersparen, können Sie das Entsperren des Laufwerks durch einen Hardware-Token wie beispielsweise FIDO2 automatisieren. Damit sind Ihre vertraulichen Daten sicher und Sie müssen sich keine umständliche Zeichenfolge merken.
(dr)
Link-Codes
[1] GnuPG-Projektseite: https://gnupg.org/
[2] EncFS-GitHub-Repository: https://github.com/vgough/encfs
[3] LUKS-GitLab-Repository: https://gitlab.com/cryptsetup/cryptsetup