%20f%C3%BCr%20die%20automatische%20LUKS-Entsperrung%20beim%20Booten%20%C3%BCber%20ein%20USB-Laufwerk.png)
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
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.
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.
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“.
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.
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
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
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
Erstellen Sie die neue Verschlüsselungsschlüsseldatei.
dd if=/dev/urandom bs=1 count=256 > linux.key
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
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
Ü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 ...
Passen Sie die Schlüsseldateiberechtigungen an
chmod 400 linux.key
Navigieren Sie als Nächstes zum Ordner „initramfs scripts“ und öffnen Sie die Datei „zfs“. Sie können jeden beliebigen Texteditor verwenden. (Ich verwende
nano
in diesem Beispiel)cd /usr/share/initramfs-tools/scripts nano zfs
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}"
Speichern und schließen Sie die Datei.
Erstellen Sie im selben Verzeichnis eine neue Datei namens „usb-unlock“.
nano usb-unlock
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.
Speichern und schließen Sie die Datei.
Passen Sie die Berechtigungen für das USB-Unlock-Skript an
chmod 755 usb-unlock
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
Aktualisieren Sie abschließend initramfs, sodass das Skript beim Booten ausgeführt wird.
update-initramfs -u
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-initramfs
genauer 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.