TPM2 Autodecrypt auf Arch Linux mit UKI und Secure Boot

Schritt-für-Schritt-Anleitung zum passwortlosen LUKS2-Entschlüsseln via TPM2 auf Arch Linux mit Unified Kernel Images, systemd-boot und sbctl.

Voraussetzungen

Bevor wir starten, müssen folgende Bedingungen erfüllt sein:

AnforderungPrüfbefehl
LUKS2 (nicht LUKS1)cryptsetup luksDump /dev/nvme1n1p2 | grep "Version:"
TPM2-Chip vorhandensystemd-cryptenroll --tpm2-device=list
Secure Boot aktiv (User Mode)bootctl status | grep "Secure Boot"
systemd-boot als Bootloaderbootctl status
UKI-basierter Bootls /boot/EFI/Linux/*.efi

⚠️ Wichtig: Diese Anleitung gilt speziell für Systeme, die Unified Kernel Images (UKI) verwenden – also .efi-Dateien unter /boot/EFI/Linux/ statt klassischer Loader-Entries unter /boot/loader/entries/. Bei klassischen Setups mit Loader-Entries weicht das Vorgehen ab.

Hintergrund: Warum UKI + sd-encrypt?

Ein Unified Kernel Image bündelt Kernel, Initramfs, Microcode und Kernel-Cmdline in einer einzigen signierten .efi-Datei. Zusammen mit Secure Boot entsteht so eine vollständige Vertrauenskette: Die Firmware prüft die Signatur des UKI, bevor der Kernel überhaupt startet.

Der TPM2-Chip nutzt sogenannte PCR-Register (Platform Configuration Registers), um den Systemzustand zu messen. Durch Bindung des LUKS-Keys an PCR 0 (Firmware-Integrität) und PCR 7 (Secure Boot State) wird der Schlüssel nur freigegeben, wenn das System im erwarteten Zustand bootet – also mit aktivem Secure Boot und unveränderter Firmware.

Der klassische encrypt-Hook in mkinitcpio unterstützt TPM2 nicht. Dafür ist der sd-encrypt-Hook nötig, der auf systemd-cryptsetup basiert und /etc/crypttab für seine Konfiguration nutzt.

Schritt 1: TPM2-Key enrollen

systemd-cryptenroll schreibt einen TPM2-gebundenen Key direkt in den LUKS2-Header. Das bestehende Passwort bleibt als Fallback immer erhalten.

1
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme1n1p2

Enrollment prüfen:

1
sudo systemd-cryptenroll /dev/nvme1n1p2

Erwartete Ausgabe:

1
2
3
SLOT  TYPE
   0  password
   2  tpm2

Schritt 2: /etc/crypttab befüllen

Dies ist der häufigste Fehler bei gescheiterten Setups: Der sd-encrypt-Hook liest zwingend aus /etc/crypttab – ist diese Datei leer, findet er die LUKS-Partition nicht und der Boot schlägt fehl.

Zuerst die UUID der LUKS-Partition ermitteln:

1
sudo blkid -s UUID -o value /dev/nvme1n1p2

Dann in /etc/crypttab eintragen:

1
sudo nano /etc/crypttab
1
2
# <name>   <device>                                      <password>  <options>
root        UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    -           tpm2-device=auto

⚠️ Den name (hier root) genau so wählen, wie die LUKS-Partition aktuell gemappt ist – prüfbar mit lsblk.

Schritt 3: Kernel-Cmdline bereinigen

Die Kernel-Parameter für UKIs werden aus /etc/kernel/cmdline eingebettet. Der cryptdevice=-Parameter gehört zum alten encrypt-Hook und muss entfernt werden – sd-encrypt kennt ihn nicht.

1
sudo nano /etc/kernel/cmdline

Vorher:

1
cryptdevice=PARTUUID=xxxx:root root=/dev/mapper/root rootflags=subvol=@ rw rootfstype=btrfs

Nachher:

1
root=/dev/mapper/root rootflags=subvol=@ rw rootfstype=btrfs

⚠️ Alles muss in einer einzigen Zeile stehen, kein abschließender Zeilenumbruch.

Schritt 4: mkinitcpio Hooks anpassen

1
sudo nano /etc/mkinitcpio.conf

Vorher:

1
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)

Nachher:

1
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)

Die Änderungen im Überblick:

AltNeuGrund
udevsystemdBasis für alle sd-*-Hooks
keymap consolefontsd-vconsolesystemd-äquivalent, liest aus /etc/vconsole.conf
encryptsd-encryptTPM2-Unterstützung via systemd-cryptsetup

Schritt 5: Nur das Haupt-UKI neu bauen

Wenn ein LTS-Kernel installiert ist, empfiehlt es sich, nur das Haupt-UKI neu zu bauen und das LTS-UKI als Fallback zu behalten. So kann man bei Problemen mit dem LTS-Kernel und Passwort booten.

1
sudo mkinitcpio -p linux

Schritt 6: UKI mit sbctl signieren

Da Secure Boot aktiv ist, muss das neu gebaute UKI signiert werden, bevor die Firmware es akzeptiert:

1
2
sudo sbctl sign /boot/EFI/Linux/arch-linux.efi
sudo sbctl verify

Schritt 7: Neustart und Test

1
sudo reboot

Bei erfolgreichem Setup: kein Passwort-Prompt, direktes Booten durch TPM2-Unlock.

Falls doch ein Passwort abgefragt wird: Das ist der normale Fallback – der TPM hat den Key nicht freigegeben. Die häufigste Ursache ist ein falscher PCR-Zustand (z. B. Secure Boot deaktiviert oder Firmware-Update).

Schritt 8 (nach erfolgreichem Test): LTS-UKI ebenfalls aktualisieren

1
2
sudo mkinitcpio -p linux-lts
sudo sbctl sign /boot/EFI/Linux/arch-linux-lts.efi

Fehlerbehebung

TPM gibt den Key nicht frei

1
2
# Systemd-cryptsetup Log prüfen
journalctl -b -u systemd-cryptsetup@root

Häufige Ursachen:

  • crypttab leer oder falsch konfiguriert
  • cryptdevice= noch in der Kernel-Cmdline vorhanden
  • Firmware-Update hat PCR 0 verändert → neues Enrollment nötig

Enrollment zurücksetzen und neu machen

1
2
3
4
5
6
7
8
9
# TPM2-Slot entfernen
sudo systemd-cryptenroll --wipe-slot=tpm2 /dev/nvme1n1p2

# Neu enrollen
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme1n1p2

# UKI neu bauen und signieren
sudo mkinitcpio -p linux
sudo sbctl sign /boot/EFI/Linux/arch-linux.efi

Das war’s. Das System bootet nun ohne Passwortabfrage – solange Secure Boot aktiv ist und die Firmware unverändert bleibt. Das LUKS-Passwort ist jederzeit als Fallback nutzbar.