Arch Linux: LUKS-Volume mit TPM2 inkl. PIN entschlüsseln
Mit systemd-cryptenroll bietet systemd eine einfache Möglichkeit, PKCS#11-, FIDO2- und/oder TPM2-Token-/Geräte zum Entschlüsseln von LUKS2-Volumes einzurichten. Mit der neuesten Version von systemd v251 lässt sich für die Verwendung eines TPM2-Chips auch noch eine zusätzliche PIN festlegen. Dadurch muss zum Entschlüsseln des LUKS-Volume nicht nur der TPM-Speicher (PCR-Status) korrekt sein, sondern es muss auch die korrekte PIN eingegeben werden.
Für mein Notebook mit Arch Linux verwende ich die TPM2+PIN-Lösung nun zum Entschlüsseln meines mit LUKS vollverschlüsselten Systems (Root-LVM-Partition). Was ich dafür tun musste, erfahrt ihr in diesem Beitrag.
Voraussetzungen
Nebst Rechner mit TPM2-Chip muss das LUKS-Volume vom Typ LUKS2 sein und eine normale Passphrase bzw. einen Recovery-Key hinterlegt haben. Zudem benötigt ihr systemd ab Version 251 sowie das Paket tpm2-tools . Des Weiteren müsst ihr, wenn ihr wie ich eure LUKS-Root-Partition entsprechend entschlüsseln wollt, sicherstellen, dass euer initramfs die Module systemd und sd-encrypt verwendet. Ich hatte bisher, wie z.B. in meinem Beitrag zur Installation von Arch Linux beschrieben, nur das encrypt-Modul eingesetzt.
TPM2 + PIN mit systemd-cryptenroll für LUKS-Volume einrichten
Um den TPM2-Chip inkl. PIN als Key für ein LUKS-Volume festzulegen, reicht ein Befehl. Bei mir war das entsprechende LUKS-Volume z.B. /dev/sda2, welches meine Root-Partition inkl. LVM beinhaltet. Der Befehl dazu sieht dann so aus:
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-with-pin=yes /dev/sda2
Please enter current passphrase for disk /dev/sda2:
Please enter TPM2 PIN:
Please enter TPM2 PIN (repeat):
New TPM2 token enrolled as key slot 1Für Details zum Befehl schaut am besten auf die entprechende systemd-cryptenroll-Seite.
initramfs-Module laden
Wie im Abschnitt "Voraussetzungen" erwähnt, musste ich für mein System noch die Generierung des initramfs anpassen, damit die benötigten systemd-Module beim Booten geladen werden. Das ist letztendlich aber nur relevant, wenn es sich bei dem zu entschlüsselenden LUKS-Volume um die Root-Partition handelt. Dazu habe ich die HOOKS=()-Zeile in /etc/mkinitcpio.conf wie folgt angepasst:
HOOKS=(base systemd autodetect keyboard sd-vconsole modconf block sd-encrypt lvm2 filesystems fsck)Anschließend ist das initramfs-Image neu zu generieren:
sudo mkinitcpio -P
Kernel-Cmdline/-Parameter oder /etc/crypttab anpassen
Damit zum Entschlüsseln des LUKS-Volume der TPM2+PIN-Key verwendet werden kann, muss in der /etc/crypttab-Datei eine entsprechende Zeile hinzugefügt werden. Wenn es sich um die Root-Partition handelt, dann ist /etc/crypttab.initramfs zu verwenden. Für Details zur "crypttab"-Variante siehe: Arch-Linux-Doku: TPM - systemd-cryptenroll. Alternativ, und so habe ich es bei mir umgesetzt, kann man auch direkt die Kernel-Cmdline anpassen. Im Normalfall lässt sich das über die Konfiguration des jeweiligen Bootloaders konfigurieren (siehe Arch-Linux-Doku: Kernel parameters). In meinem Fall habe ich also die Kernel-Cmdline bzw. die Kernel-Parameter wie folgt angepasst:
rd.luks.name=Root-Partition-UUID=rootlvm rd.luks.options=tpm2-device=auto,tpm2-pin=yes root=LABEL=root rw [...]Vergesst nicht anschließend noch eure Bootloader-/Kernel-Dateien neu zu generieren.
Rechner neustarten und mit TPM2 und PIN entschlüsseln
Anschließend kann der Rechner neugestartet werden und anstatt der Abfrage zur Eingabe der normalen Passphrase, werdet ihr nun aufgefordert eure TPM2-PIN einzugeben.
Fazit
Dank systemd ist es mittlerweile auch unter Linux relativ einfach - analog zu Windows und Bitlocker - die verschlüsselte Systempartition mittels TPM2-Chip und zusätzlicher PIN zu entschlüsseln. Alternativ kann man aber z.B. auch einen FIDO2-Security-Token, wie z.B. einen YubiKey, nutzen.