Konfigurieren Sie Ubuntu 22.04 (ZFS) für die automatische LUKS-Entsperrung beim Booten über ein USB-Laufwerk

Konfigurieren Sie Ubuntu 22.04 (ZFS) für die automatische LUKS-Entsperrung beim Booten über ein USB-Laufwerk

Ich habe Ubuntu 22.04 neu installiert und die Option zur vollständigen Laufwerkverschlüsselung ZFS+LUKS des Installationsprogramms verwendet.

Ich habe im Internet nach einer Möglichkeit gesucht, das Laufwerk so zu konfigurieren, dass es beim Booten automatisch entsperrt wird, wenn ein USB-Schlüssel erkannt wird (LUKS-Entsperrschlüssel auf dem USB-Stick), anstatt bei jedem Booten des Systems eine Entschlüsselungspassphrase einzugeben.

Ich habe jede Menge Anleitungen gefunden, aber keine der Anweisungen scheint auf die Art und Weise anwendbar zu sein, wie 22.04 die Partitionierungsstrukturen auf dem Laufwerk festlegt, wenn sowohl ZFS als auch LUKS verwendet werden.

Die Anleitung, der ich am nächsten komme, ist diese: https://tqdev.com/2022-luks-with-usb-unlock

Alles scheint gut zu laufen, bis ich an den Punkt komme, an dem ich den Schlüssel zum LUKS-Laufwerk hinzufügen muss (Schritt sechs) – weil zwei Laufwerke als LUKS-Laufwerke aufgeführt sind.

root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0

Ich bin nicht sicher, wie ich von hier aus weitermachen soll.

Antwort1

Video-Komplettlösung:

Update: 20. März 2024:Wenn Ubuntu eine Zwischenversion herausbringt (z. B. 22.04.3 > 22.04.4), werden diese Änderungen zurückgesetzt und erfordern eine erneute Ausführung von Schritt 13 und Schritt 20.

  1. Installieren Sie den Ubuntu 22.04-Desktop mit ZFS und Verschlüsselung mithilfe des Ubuntu-Installationsprogramms. Stellen Sie sicher, dass Sie die Verschlüsselungspassphrase für die Verwendung in einem späteren Schritt sicher aufzeichnen. Ich habe im Installationsprogramm keinen Wiederherstellungsschlüssel eingerichtet, daher weiß ich nicht, ob diese Schritte bei Verwendung eines Wiederherstellungsschlüssels funktionieren. Ihre Ergebnisse können abweichen.

  2. Formatieren Sie nach der Installation ein USB-Laufwerk und erstellen Sie eine neue Partition mit dem ext4-Standard (ich habe das Festplatten-Dienstprogramm in Ubuntu verwendet). Nennen Sie die Partition „linux-key“.

  3. Stellen Sie sicher, dass das USB-Laufwerk gemountet ist. Verwenden Sie die Anwendung „Dateien“, um zu überprüfen, ob das USB-Laufwerk in der linken Spalte des Dateifensters gemountet ist.

  4. Starten Sie ein Terminal und geben Sie die folgenden Befehle ein, um zum Root-Benutzer und dann zum USB-Laufwerk zu wechseln:

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. Sie sollten eine leere Verzeichnisliste erhalten, die anzeigt, dass das USB-Laufwerk leer ist.

    root@ubuntu:/media/bob/linux-key$ ls -la
    total 29
    drwx------  3 bob  bob   4096 Jan 25 15:07 .
    drwxr-x---+ 3 root root     3 Jan 25 15:08 ..
    drwx------  2 root root 16384 Jan 25 15:07 lost+found
    
  6. Geben Sie Folgendes ein, um LUKS-Partitionen in Ihrem System anzuzeigen. Die Standardpartition, die wir ändern müssen, ist normalerweise /dev/zd0. Stellen Sie sicher, dass sie angezeigt wird, wenn Sie den folgenden Befehl ausführen.

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. Erstellen Sie die neue Verschlüsselungsschlüsseldatei.

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. Stellen Sie sicher, dass die Schlüsseldatei vorhanden ist. Sie sollten die Datei in der Liste sehen.

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. Konfigurieren Sie die Schlüsseldatei für die Arbeit mit der Partition und geben Sie dann die zuvor im Installationsprogramm konfigurierte Entschlüsselungspassphrase ein.

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. Überprüfen Sie, ob der Schlüssel erfolgreich eingefügt wurde, indem Sie sicherstellen, dass Schlüsselsteckplatz 1 gefüllt ist.

    cryptsetup luksDump /dev/zd0;
    
        ...
        Area offset:32768 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
      1: luks2 <------------- the key you just added
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        ...
    
  11. Passen Sie die Schlüsseldateiberechtigungen an

    chmod 400 linux.key
    
  12. Navigieren Sie als Nächstes zum Ordner „initramfs scripts“ und öffnen Sie die Datei „zfs“. Sie können jeden beliebigen Texteditor verwenden. (Ich verwende nanoin diesem Beispiel)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. Suchen Sie die folgende Zeile und ersetzen Sie sie durch den folgenden Text.

    Finden Sie diese Zeile

    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
    

    Ersetzen Sie durch dieses

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. Speichern und schließen Sie die Datei.

  15. Erstellen Sie im selben Verzeichnis eine neue Datei namens „usb-unlock“.

    nano usb-unlock
    
  16. Fügen Sie das Skript aus diesem Gist ein – es sucht nach einer USB-Laufwerkpartition namens „linux-key“, sucht nach einer Datei namens „linux.key“ und versucht, diese zum Entschlüsseln der Partition zu verwenden.

  17. Speichern und schließen Sie die Datei.

  18. Passen Sie die Berechtigungen für das USB-Unlock-Skript an

    chmod 755 usb-unlock
    
  19. Listen Sie das Verzeichnis des Skripts auf. Stellen Sie sicher, dass die beiden Dateien, mit denen Sie gerade gearbeitet haben, dem Root-Benutzer mit einem Berechtigungssatz von 755 gehören.

    $ ls -la  # you should see these files...
    -rwxr-xr-x  1 root root   550 Dec 22 20:38 usb-unlock
    -rwxr-xr-x  1 root root 31665 Dec 22 20:40 zfs
    
  20. Aktualisieren Sie abschließend initramfs, sodass das Skript beim Booten ausgeführt wird.

    update-initramfs -u
    
  21. Starten Sie Ihren Computer neu und stellen Sie sicher, dass das USB-Laufwerk eingesteckt ist. Wenn es eingesteckt ist, müssen Sie Ihre Entschlüsselungspassphrase nicht eingeben. Wenn sie fehlt, fragt das Skript nach einer Passphrase, die Sie eingeben müssen.

Antwort2

Es handelt sich um versteckte „Magie“ in initramfs – zfs-initramfsgenauer gesagt im Paket.

Suchen Sie in /usr/share/initramfs-tools/script/zfs nach der folgenden Zeile:

# Open and mount luks keystore for any pools using one

Das Verhalten ist wie folgt:

Nach dem Importieren des Pools (z. B. rpool) steht das darin enthaltene unverschlüsselte Volume (zvol) als zur Verfügung /dev/zvol/rpool/keystore.

Dieses Zvol-Gerät ist immer noch verschlüsselt.

Die Crypttab-Einträge für diese Luks-verschlüsselten zvols ( zfs list -t volume) werden während des Systemstarts spontan in /cryptroot/crypttab erstellt.

Die Passphrasen für diese Einträge werden dann vom Benutzer abgefragt.

Anschließend werden die Geräte entsperrt und unverschlüsselt unter gemountet /run/rpool/keystore.

Da der Rpool selbst verschlüsselt ist und sein Schlüsselspeicherort auf diesen Speicherort verweist, kann der Schlüssel für den Rpool geladen und der Bootvorgang fortgesetzt werden.

Wahrscheinlich sollte das jemand ordentlich dokumentieren ;)


Zu Ihrer ursprünglichen Frage könnten Sie versuchen, das Verhalten mit den möglichen Erweiterungspunkten für Initramfs so zu optimieren, dass /etc/initramfs-tools/scripts/local-*/dasselbe erreicht wird, und entweder das Zvol selbst mit der Passphrase von Ihrem USB-Gerät mounten oder den Schlüssel für Rpool irgendwie direkt bereitstellen.

verwandte Informationen