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:

  1. Es wird ein verschlüsselter Container erstellt (Festplattenpartition, USB-Stick, Container­datei). 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).

  2. Ein oder mehrere Keyslots von LUKS werden mit Hardware Token vorbereitet und in der täglichen Arbeit genutzt. Zur Unterstützung sind ein paar kleine Scripte hilfreich.
  3. 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

Variante A: LUKS mit Nitrokey

Der Nitrokey ist eine GnuPG Smartcard im Format eines USB-Sticks. Es können natürlich auch andere GnuPG Smartcards wie Yubikey oder GnuK verwendet werden.

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:

  1. Ein frischer Nitrokey ist erstmal einzurichten (Schlüssel erzeugen, PIN ändern usw.) > gpg2 --card-edit
    ...
    gpg/card> admin
    Admin-Befehle sind erlaubt

    gpg/card> help
    ...
    gpg/card> quit

    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.

  2. Da die folgenden Operationen als root durchgeführt werden, ist der OpenPGP Schlüssel des Nitrokey zu exportieren und im Schlüsselring von root zu importieren. Außerdem ist ein re-bind des privaten Schlüssel der Nitrokey Smartcard anzustoßen: > gpg2 --export "User-ID" > /tmp/luks-pgp-key.pgp
    > sudo gpg2 --import /tmp/luks-pgp-key.pgp
    > sudo gpg2 --card-status
    > rm /tmp/luks-pgp-key.pgp
  3. Es wird ein 4k großes Keyfile mit Zufallszahlen erzeugt (z. B. /root/.gnupg/luks-key.bin): > sudo dd if=/dev/urandom of=/root/.gnupg/luks-key.bin bs=512 count=8
  4. Das Keyfile wird als Schlüssel für den Container in nächsten freien Keyslot eingefügt. Es wird dabei eine gültige Passphrase für das Öffnen des Containers abgefragt: > sudo cryptsetup luksAddKey <device> /root/.gnupg/luks-key.bin
  5. Das Keyfile wird mit GnuPG verschlüsselt und das Orginal sicher gelöscht: > sudo gpg2 --encrypt --recipient /root/.gnupg/luks-key.bin
    > sudo shred -u /root/.gnupg/luks-key.bin
  6. Zum Öffnen des Container werden folgende Kommandos verwendet, die man sich als Script ablegen kann. <device> und <mount-point> sind anzupassen. <name> kann beliebig gewählt werden und dient nur zur Identifikation im Devicemapper: > sudo su
    # gpg2 --decrypt /root/.gnupg/luks-key.bin.gpg | cryptsetup open <device> <name>
    # mount /dev/mapper/<name> <mount-point>
    # exit
    Mit KDialog oder Zenity könnte man das Script grafisch aufpeppen und einen Starter auf den Desktop legen. Kreativität und Spieltrieb sind dabei keine Grenzen gesetzt. Wenn man das grafisch aufgepeppte Script ohne ein Terminal im Hintergrund nutzen möchte, dann muss man die Option "--no-tty" bei dem gpg2 Kommando hinzufügen: gpg2 --no-tty --decrypt /root/.gnupg/luks-key.bin.gpg | cryptsetup ...

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 Firma Purism stellt ein Script bereit, das alle notwendigen Schritte automatisiert.

Man muss nur das Script smartcard-key-luks herunter laden, den public Key als Datei bereitstellen, das Script aufrufen und danach den Rechner neu starten: > gpg2 --armor --export "User-ID" > pub-key-fuer-luks.asc

> sudo install -d /usr/local/sbin   (falls das Verzeichnis noch nicht existiert)

> sudo wget -o /usr/local/sbin/smartcard-key-luks https://source.puri.sm/pureos/packages/smartcard-key-luks/-/raw/master/smartcard-key-luks

> sudo chmod +x /usr/local/sbin/smartcard-key-luks

> sudo smartcard-key-luks pub-key-fuer-luks.asc

Reboot - Fertig!

Für Arch Linux User gibt es die Alternative initramfs-sencrypt bei Github.com. 

Variante B: LUKS mit Yubikey

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.

  1. Die Software kann mit dem bevorzugten Paketmanager installiert werden: > sudo apt install yubikey-luks yubikey-personalisation
  2. Der zweite PW-Slot des Yubikey wird für Challende-Response vorbereitet: > ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible
  3. Das Challenge-Response Passwort wird in einen freien Keyslot des LUKS Containers eingetragen. Es gibt ein Script, dass die Aufgabe übernimmt. Es wird dabei 2x das neue Challenge Passwort für den Yubikey und eine gültige Passphrase für das Öffnen des LUKS Containers abgefragt: > sudo yubikey-luks-enroll -d <device> -s <key-slot> Falls man den Überblick verloren hat, welche Keyslots im LUKS Container noch frei sind, kann man sich die Belegung mit folgendem Kommando anzeigen lassen: > sudo cryptsetup luksDump
    LUKS header information for <device>
    ...
    Key Slot 0: ENABLED
    Key Slot 1: DISABLED
    ...
    Key Slot 7: DISABLED
  4. Zukünftig kann man zum Öffnen des Containers den Yubikey anschließen und nur das einfache Challenge Passwort in der Passwortabfrage eingeben. Andere Methoden zum Öffnen des Container bleiben davon unberührt und stehen weiter zur Verfügung.

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 Festplatten­partition 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:

  1. Zuerst das BACKUP der Daten aktualisieren, falls man estwas kaputtspielt!
  2. Am einfachsten identifiziert man den Root-Container mit einem Blick in die Datei /etc/crypttab. In der ersten Zeile das zweite Element ist die Kennung für das <device>, welches für das Kommando "yubikey-luks-enroll" zu verwenden ist.
  3. Danach ist die Datei /etc/crypttab anzupassen. In der (ersten) Zeile für den Root Container ist das Schlüssel­wort "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.
  4. Danach ist noch das Bootimage neu zu bauen mit: > sudo update-initramfs -u
  5. Wenn man den Rechner neu bootet, kann man statt der bisherigen (hoffentlich starken und komplexen) Passphrase, die man bei der Installtion vergeben hat, auch den Yubikey anschließen und das einfachere Challenge Passwort eingeben.

Als zusätzliches Sicherheitsfeature könnte man "yubikey-luks-suspend" aktivieren. Der Daemon sorgt dafür, dass bei einem Suspend des Rechners alle LUKS Container geschlossen und die Schlüssel aus dem RAM gelöscht werden. Der Daemon wird mit folgenden Kommandos gestartet und für zukünftige Restarts des Linux Systems aktiviert: > sudo systemctl start yubikey-luks-suspend
> sudo systemctl enable yubikey-luks-suspend
(Das funktioniert natürlich nicht bei einem vollständig verschlüsselten System!!!)