Die Passphrase ist der schwächste Punkt bei der Verwendung moderner Verfahren zur Verschlüsselung von Datenträgern, insbesondere wenn man im täglichen Gebrauch einfach zu merkende Passphrasen geringer Komplexität bevorzugt.
Im folgenden werden einige Möglichkeiten vorgestellt, die Sicherheit der Verschlüsselung durch Verwendung von Hardware Token (Nitrokey, Yubikey, USB-Stick) zu verbessern.
Bei allen Varianten ist folgendes Grundkonzept empfehlenswert:
Es wird ein verschlüsselter Container erstellt (Festplattenpartition, USB-Stick, Containerdatei). Dabei wird eine echt knackige und komplexe Passphrase verwendet, die bei einem Brute-Force Angriff von hochpotenten Angreifern mehrere Jahre standhält.
Diese Passphrase benötigt man im nächsten Schritt zum Hinzufügen von Hardware Token und sie dient als Backup zum Öffnen des Containers, wenn das HW Token verloren geht. Sie wird off site in einem Tresor hinterlegt (digital oder auf Papier).
Wenn man zwei oder mehr HW Token zum Öffnen des Container definiert hat (mind. ein Backup Token!), könnte man die initiale Passphrase im Keyslot "0" auch löschen: > cryptsetup luksKillSlot <device> 0
FIDO2 Security Token wurden für den sicheren, passwortlosen Login entwickelt , um die unsicheren Username/Passwort Kombinationen zu ersetzen (siehe: WebAuthn/FIDO2).
Moderne Linux Distributionen mit systemd Version 2.48+ können diese FIDO2 Token auch zum passwortlosen Entsperren von LUKS2 Containern verwenden, die die Token die HMAC-Secret Erweiterung unterstützen (z.B. Nitrokey FIDO2, Yubikey ab Version 5).
Um zu prüfen, ob systemd hinreichend aktuell ist und die Option "--fido2-device" unterstützt wird, ruft man am einfachsten "sudo systemd-cryptenroll --help" auf.
Im ersten Schritt erstellt man den LUKS2(!) Container (verschlüsselten USB-Stick, Partition oder Containerdatei) und schützt ihn mit einer knackigen, starken Passphrase:
> sudo cryptsetup luksFormat --type luks2 <device>Hinweis: Container im älteren LUKS1 Format können nicht mit FIDO2 Token geöffnet werden. Man könnte versuchen, einen vorhandenen LUKS1 Container nach LUKS2 zu konvertieren:
> sudo cryptsetup convert <device> --type luks2Danach wird der Container einmal mit der knackigen Passphrase geöffnet:
> sudo cryptsetup open --type luks <device> <name>Im nächsten Schritt wird ein FIDO2 Security Token zum Öffnen hinzugefügt. Das Token muss dabei eingesteckt sein und es darf nur ein FIDO Token gesteckt sein:
> sudo systemd-cryptenroll --fido2-device=auto <device>Mehrere FIDO2 Token fügt man entweder nacheinander hinzu oder man steckt alle verfügbaren Token gleichzeitig ein und verwendet folgendes Kommando, um alle hinzuzufügen:
> sudo systemd-cryptenroll --fido2-device=list <device>Statt dessen muss man in der Datei /etc/crypttab für das Boot Device in der vierten Spalte die Option "fido2-device=auto" einzufügen:
<Name> <Gerät> - luks,fido2-device=auto...Die bereits vorhandenen Parameter variieren bei den unterschidlichen Linux Distributionen. Danach ist noch das Bootimage neu zu bauen mit:
> sudo update-initramfs -uZukünftig muss man keine hochkomplizierte Passphrase mehr eintippen sondern steckt beim Booten einfach das FIDO2 Token rein, das man natürlich nicht verlieren darf.
Wenn ein Token verloren geht, muss man es natürlich entfernen. Das folgende Kommando löscht alle FIDO2 Token. die für den LUKS2 Container authorisiert wurden:
> sudo systemd-cryptenroll --wipe-slot=fido2 <device>Die weiterhin gültigen Token kann man danach wieder hinzufügen (3.) oder man kombiniert das Löschen und Hinzufügen, indem man alle weiterhin gültigen FIDO2 Token anschließt und:
> sudo systemd-cryptenroll --wipe-slot=fido2 --fido2-device=list <device>Moderne Linux Distributionen mit systemd Version 2.48+ können auch PKCS#11 Token zum Entsperren von LUKS Containern verwenden, wenn das Token die PIV Erweiterung unterstützt.
Zuerst ist das PKCS#11 Token vorzubereiten (RSA Schlüsselpaar erzeugen, PINs ändern…)
Im nächsten Schritt erstellt man den LUKS2(!) Container (USB-Stick, verschlüsselte Partition oder Containerdatei) und schützt ihn mit einer knackigen, starken Passphrase (siehe oben).
Danach wird der Container einmal mit der knackigen Passphrase geöffnet:
> sudo cryptsetup open --type luks <device> <name>Im nächsten Schritt wird ein PKCS#11 Token zum Öffnen des Containers hinzugefügt. Das Token muss dabei eingesteckt sein:
> sudo systemd-cryptenroll --pkcs11-token-uri=auto <device> Es können nacheinander mehrere Token hinzugefügt werden oder alle gleichzeitig mit: > sudo systemd-cryptenroll --pkcs11-token-uri=list <device>Statt dessen muss man in der Datei /etc/crypttab für das Boot Device in der vierten Spalte die Option "pkcs11-uri" einzufügen:
<Name> <Gerät> - luks,pkcs11-uri=auto...Die bereits vorhandenen Parameter variieren bei den unterschidlichen Linux Distributionen. Danach ist noch das Bootimage neu zu bauen mit:
> sudo update-initramfs -uZukünftig muss man keine hochkomplizierte Passphrase mehr eintippen sondern steckt beim Booten einfach das PKCS#11 Token rein, das man natürlich nicht verlieren darf.
Wenn ein Token verloren geht, muss man es natürlich entfernen. Das folgende Kommando löscht alle PKCS#11 Token. die für den LUKS2 Container authorisiert wurden:
> sudo systemd-cryptenroll --wipe-slot=pkcs11 <device> Die weiterhin gültigen Token kann man danach wieder hinzufügen. Das Löschen und Hinzufügen der weiterhin gültigen PKCS\#11 Token kann auch hier mit einem Kommando erfolgen. Die gültigen Token müssen dabei angeschlossen sein: > sudo systemd-cryptenroll --wipe-slot=pkcs11 --pkcs11-token-uri=list <device>GnuPG Smartcard im Format eines USB-Sticks gibt es bei Nitrokey, Yubikey oder GnuK.
Die Idee ist einfach erklärt: Es wird die Keyfile für das Öffnen des LUKS Containers verwendet, das mit dem OpenPGP Key des Nitrokey verschlüsselt wurde. Zum Öffnen des Containers wird das Keyfile mit gpg2 entschlüsselt und via Pipe an cryptsetup übergeben.
Eine kurze Anleitung, die sich auf das Wesentliche beschränkt:
Neue Schlüssel erstellt man mit "generate", die PIN und Admin-PIN kann man mit "passwd" ändern und mit "unblock" den Zähler für Fehlversuche zurück setzen.
Full Disc Encryption: Wenn man bei der Installation das System vollständig verschlüsselt hat, kann man den Nitrokey auch zum Öffnen des Root-Containers beim Booten verwenden.
Die Nitrokey GmbH stellt dafür eine ausführliche Anleitung für Ubuntu und Debian bereit.
Wichtig ist, dass man sein System schon bei der Installation passend vorbereitet und nicht die automatische Partitionierung der Festplatte nutzt! Es darf nur eine unverschlüsselte /boot Partition und eine verschlüsselte Root-Partition erstellt werden. Anderenfalls kommt es zu Fehlern.
Die Firma Yubico bietet mit "yubikey_luks" eine Software zur Nutzung ihrer Yubikeys als Schlüssel für einem LUKS Container, die mit einem Challenge-Response Verfahren arbeitet.
Die Passphrase wird als Challenge an den Yubikey gesendet, der mit kryptografischem Voodoo einen Response abgeleitet, der als Schlüssel zum Öffnen des Container dient. Die Passphrase (Challenge) kann dabei einfach und leicht merkenbar sein, da der Yubikey als zweiter Faktor für das Öffnen des Container nötig ist und ein starkes PW ableitet.
Full Disc Encryption: Wenn man bei der Installation das System vollständig verschlüsselt hat, kann man den Yubikey auch zum Öffnen des Root-Containers beim Booten verwenden.
Dafür ist die Festplattenpartition mit dem verschlüsselten Root-Container zu ermitteln und der Yubikey als Hardware Token zum Öffnen hinzuzufügen, wie oben beschrieben. Die folgenden Schritte funktionieren auf einem Debian System und davon abgeleiteten Derivaten:
Danach ist die Datei /etc/crypttab anzupassen. In der (ersten) Zeile für den Root Container ist das Schlüsselwort "luks" mit dem vollständigen Pfad zu "ykluks-keyscript" zu ergänzen, also "... luks,keyscript=/usr/share/yubikey-luks/ykluks-keyscript ...".
Also: aus der Zeile... cryptroot UUID=xxxx ... luks ... wird diese Zeile: cryptroot UUID=xxxx ... luks,keyscript=/usr/share/yubikey-luks/ykluks-keyscript Alle anderen Parameter bleiben so erhalten, wie bei der Installation konfiguriert.