Ein FIDO2-Sicherheitsschlüssel lässt sich unter Linux nicht nur für Webdienste wie GitHub, Google oder andere Passkey-kompatible Angebote verwenden. Über das PAM-Modul pam-u2f können Sie einen FIDO2-Schlüssel auch direkt in die Authentifizierung des Linux-Systems integrieren.
Damit lässt sich der Sicherheitsschlüssel beispielsweise für sudo, su oder den grafischen Login verwenden. Statt ein Passwort einzugeben, stecken Sie den Schlüssel ein und bestätigen die Authentifizierung durch eine Berührung. Der Schlüssel übernimmt damit eine zentrale Rolle bei der Anmeldung.
Die Anleitung gilt grundsätzlich für Nitrokey FIDO2, YubiKeys und andere kompatible U2F-/FIDO2-Authenticatoren. pam-u2f unterstützt ausdrücklich neben YubiKeys auch andere Geräte, die den U2F- oder FIDO2-Standard unterstützen.
Hinweis: Getestet wurde die hier beschriebene Konfiguration ausschließlich mit einem Nitrokey FIDO2 unter TUXEDO OS 24.04. Bei anderen FIDO2-Schlüsseln, Ubuntu- oder Debian-Derivaten sowie anderen Display Managern können einzelne Schritte oder Konfigurationsdateien abweichen.
In dieser Anleitung richten Sie den FIDO2-Schlüssel für drei Anwendungsfälle ein:
- Authentifizierung mit sudo
- Benutzerwechsel mit su
- grafischer Login über SDDM
Die Beispiele verwenden den Linux-Benutzer tux. Am Ende des Artikels finden Sie zudem einen Exkurs zur Frage, warum sich ein FIDO2-Schlüssel unter TUXEDO OS derzeit nicht ohne Weiteres für die LUKS-Entsperrung beim Systemstart nutzen lässt.
PAM und pam-u2f für Linux
Die Abkürzung PAM steht für „Pluggable Authentication Modules“. Dabei handelt es sich um eine Linux-Infrastruktur, über die Programme die Authentifizierung an separate Module auslagern können. Dadurch müssen Anwendungen die einzelnen Authentifizierungsmethoden nicht selbst implementieren.
Statt beispielsweise selbst zu prüfen, ob ein Passwort, eine Smartcard oder ein FIDO2-Schlüssel verwendet wird, übergibt ein Programm die Authentifizierung an PAM. Dadurch können unterschiedliche Anwendungen dieselben Authentifizierungsmethoden verwenden, ohne diese jeweils separat implementieren zu müssen.
Für die Authentifizierung mit einem FIDO2-Schlüssel ist in diesem Fall das Modul pam_u2f zuständig. Es stammt aus dem Projekt pam-u2f von Yubico. Trotz der Bezeichnung unterstützt das Modul neben dem älteren U2F-Standard auch moderne FIDO2-Authenticatoren.
Benötigte Pakete installieren
Unter TUXEDO OS lässt sich pam-u2f direkt aus den Paketquellen installieren. Öffnen Sie dazu ein Terminal und installieren Sie die benötigten Pakete:
sudo apt update
sudo apt install libpam-u2f pamu2fcfg
Das Paket libpam-u2f enthält das eigentliche PAM-Modul. pamu2fcfg dient dazu, einen FIDO2-Schlüssel zu registrieren und die dafür benötigte Konfiguration zu erzeugen. Beide Pakete werden auch in der offiziellen Dokumentation von pam-u2f für Ubuntu genannt.
Optional können Sie zusätzlich die FIDO2-Werkzeuge installieren. Diese helfen unter anderem dabei, angeschlossene Sicherheitsschlüssel zu erkennen und deren Eigenschaften zu überprüfen:
sudo apt install fido2-tools
Mit fido2-token -L lässt sich anschließend prüfen, ob das System den angeschlossenen Schlüssel erkennt:
fido2-token -L
(out)/dev/hidraw1: vendor=0x20a0, product=0x42b1 (Nitrokey Nitrokey FIDO2 2.4.0)
Alternativ können Sie mit lsusb nachsehen, ob der Sicherheitsschlüssel am USB-Bus erkannt wird:
lsusb
(out)[...]
(out)Bus 003 Device 007: ID 20a0:42b1 Clay Logic Nitrokey FIDO2 2.4.0
FIDO2-Schlüssel registrieren
Im nächsten Schritt registrieren Sie den FIDO2-Schlüssel für Ihren Linux-Benutzer. Stecken Sie den Nitrokey dazu ein und führen Sie als Benutzer tux folgenden Befehl aus:
pamu2fcfg -u $USER
Das Programm fordert Sie anschließend dazu auf, den Sicherheitsschlüssel zu berühren. Nach erfolgreicher Registrierung gibt pamu2fcfg eine Konfigurationszeile aus. Sie enthält unter anderem das kryptografische Credential des FIDO2-Schlüssels:
tux:3...d/5FA==,es256,+presence
Die tatsächliche Zeile ist deutlich länger. Die Angabe +presence bedeutet, dass bei der Authentifizierung die physische Anwesenheit des Benutzers geprüft wird. Sie müssen den Sicherheitsschlüssel also tatsächlich bedienen, normalerweise durch eine Berührung.
Diese Prüfung verwendet pamu2fcfg standardmäßig. Mit -P beziehungsweise --no-user-presence lässt sie sich deaktivieren. Für einen physischen Sicherheitsschlüssel sollten Sie diese Option normalerweise nicht verwenden, da dadurch eine zusätzliche Sicherheitsprüfung entfällt.
Credential-Datei anlegen
pam-u2f benötigt eine Zuordnung zwischen dem Linux-Benutzer und dem registrierten FIDO2-Credential. Standardmäßig kann diese beispielsweise im Home-Verzeichnis des Benutzers unter ~/.config/Yubico/u2f_keys gespeichert werden.
Für mehrere PAM-Dienste ist eine zentrale Datei jedoch praktischer. In dieser Anleitung verwenden wir dafür /etc/u2f_mappings. Die Datei kann anschließend von sudo, su und dem Display Manager gemeinsam verwendet werden.
Legen Sie die Datei zunächst mit passenden Eigentümern und Zugriffsrechten an:
sudo install -o root -g root -m 600 /dev/null /etc/u2f_mappings
Anschließend schreiben Sie die zuvor erzeugte Registrierung direkt in die Datei:
pamu2fcfg -u $USER | { cat; printf '\n'; } | sudo tee -a /etc/u2f_mappings
Dazu muss der Nitrokey angeschlossen und bei entsprechender Aufforderung berührt werden. Die Datei enthält anschließend beispielsweise folgende Zeile:
tux:3...d/5FA==,es256,+presence
Die tatsächliche Credential-Zeile sollte nicht veröffentlicht oder an andere Personen weitergegeben werden. Die Datei /etc/u2f_mappings ist deshalb mit den Zugriffsrechten 600 ausschließlich für root lesbar.
pam-u2f unterstützt auch mehrere FIDO2-Authenticatoren. Sie können daher später beispielsweise einen zweiten Sicherheitsschlüssel als Reserve registrieren. Die zusätzlichen Credentials werden dabei ebenfalls in der Zuordnungsdatei hinterlegt.
FIDO2 für sudo konfigurieren
Nun aktivieren Sie den Nitrokey für sudo. Die entsprechende PAM-Konfiguration befindet sich in der Datei /etc/pam.d/sudo.
Warnung: Bevor Sie Änderungen an PAM vornehmen, sollten Sie unbedingt eine zweite Root-Shell oder zumindest eine weitere funktionierende Anmeldung offen halten. Eine fehlerhafte PAM-Konfiguration kann den Zugriff auf Benutzerkonten oder Root-Rechte verhindern.
Öffnen Sie die Datei beispielsweise mit:
sudoedit /etc/pam.d/sudo
Suchen Sie nach der vorhandenen Zeile:
@include common-auth
Fügen Sie davor folgende Zeile ein:
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
Der relevante Abschnitt sieht anschließend beispielsweise so aus:
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
@include common-auth
Damit kann sudo zunächst versuchen, den FIDO2-Schlüssel zu verwenden. Eine erfolgreiche Authentifizierung reicht aus. Ist der Schlüssel nicht verfügbar oder schlägt die FIDO2-Authentifizierung fehl, greift anschließend die normale Authentifizierung über common-auth.
Sie erhalten damit zwei Wege: Nitrokey angeschlossen » Nitrokey berühren » Authentifizierung erfolgreich oder Nitrokey nicht verfügbar » Passwort eingeben » Authentifizierung erfolgreich. Damit können Sie beispielsweise den folgenden Befehl ausführen, ohne das Benutzerpasswort einzugeben:
sudo apt update
Voraussetzung ist, dass der Nitrokey angeschlossen ist und die Authentifizierung durch Berührung bestätigt wird.
sudo testen
Testen Sie nach der Änderung zunächst ausschließlich sudo. Mit sudo -k löschen Sie einen eventuell vorhandenen Authentifizierungs-Cache:
sudo -k
sudo -v
Anschließend sollte sudo den FIDO2-Schlüssel erkennen und eine Berührung anfordern. Bestätigen Sie die Authentifizierung durch eine Berührung des Nitrokeys.
Prüfen Sie danach auch den Passwort-Fallback. Ziehen Sie dazu den Nitrokey ab, führen Sie erneut sudo -k aus und starten Sie anschließend einen sudo-Befehl. Nun sollte die normale Passwortabfrage erscheinen.
Beide Authentifizierungswege sollten funktionieren, bevor Sie mit den nächsten PAM-Konfigurationen fortfahren.
FIDO2 für su konfigurieren
Auch su verwendet PAM und kann deshalb über pam_u2f authentifiziert werden. Die entsprechende Konfiguration befindet sich in der Datei /etc/pam.d/su. Ergänzen Sie im auth-Abschnitt ebenfalls die folgende Zeile:
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
Eine typische Konfiguration kann beispielsweise so aussehen:
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
Die vorhandene Zeile mit pam_rootok.so sollte erhalten bleiben. Sie ermöglicht root, ohne weitere Authentifizierung über su den Benutzer zu wechseln.
Beachten Sie außerdem, dass das Credential des Benutzers tux nicht automatisch für root gilt. Soll der Nitrokey auch für einen Wechsel zu root dienen, benötigt root ein eigenes Credential.
FIDO2 für root konfigurieren
Bei folgendem Befehl wechseln Sie zum Benutzer root (für den Login geben Sie das dedizierte Root-Passwort ein, das Sie unter TUXEDO OS mittels sudo passwd root setzen).
su -
Soll der FIDO2-Schlüssel dabei die Authentifizierung übernehmen, registrieren Sie zunächst ein Credential für root:
pamu2fcfg -u root | { cat; printf '\n'; } | tee -a /etc/u2f_mappings
Die ausgegebene Zeile landet als zusätzliches Credential in /etc/u2f_mappings. Die Datei enthält dann beispielsweise:
cat /etc/u2f_mappings
(out)tux:rL...0Q==,es256,+presence
(out)root:43...Dg==,es256,+presence
Damit kann der FIDO2-Schlüssel auch für die Authentifizierung als root verwendet werden. In der Praxis sollten Sie allerdings prüfen, ob Sie su tatsächlich benötigen. Auf Ubuntu und darauf basierenden Systemen ist sudo üblicherweise die bevorzugte Methode für administrative Aufgaben.
FIDO2 für den grafischen Login konfigurieren
Als Nächstes können Sie den FIDO2-Schlüssel für die grafische Anmeldung verwenden. TUXEDO OS mit KDE Plasma setzt dafür standardmäßig auf den SDDM (Simple Desktop Display Manager). Auch SDDM nutzt PAM für die Authentifizierung. Die entsprechenden Konfigurationen dafür stehen in der Datei /etc/pam.d/sddm.
Ergänzen Sie auch hier im auth-Abschnitt vor @include common-auth folgende Zeile:
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
Ersetzen Sie dabei nicht die komplette vorhandene PAM-Konfiguration. Die bestehenden Einträge bleiben erhalten. Ergänzen Sie lediglich die FIDO2-Zeile an geeigneter Stelle im Authentifizierungsabschnitt. Der Kopf der Datei sollte nach der Bearbeitung in etwa so aussehen:
#%PAM-1.0
# Block login if they are globally disabled
auth requisite pam_nologin.so
auth required pam_succeed_if.so user != root quiet_success
# auth sufficient pam_succeed_if.so user ingroup nopasswdlogin
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
@include common-auth
# gnome_keyring breaks QProcess
-auth optional pam_gnome_keyring.so
-auth optional pam_kwallet5.so
[...]
Grundsätzlich ergibt sich damit folgender Ablauf: SDDM » Benutzer auswählen » Nitrokey einstecken » Nitrokey berühren » Eingabe drücken » KDE Plasma startet. Da common-auth als Fallback erhalten bleibt, können Sie sich grundsätzlich auch weiterhin mit dem normalen Benutzerpasswort anmelden, wenn der Nitrokey nicht verfügbar ist.
Warum eine zentrale Datei sinnvoll ist
Für sudo kann eine Credential-Datei im Home-Verzeichnis des Benutzers ausreichen. Beim grafischen Login ist das jedoch weniger praktisch, da der Display Manager die Authentifizierung bereits vor dem Start der eigentlichen Benutzersitzung abwickelt.
Eine zentrale Datei wie /etc/u2f_mappings ist deshalb für diesen Anwendungsfall sinnvoll. Sie steht den verschiedenen PAM-Diensten unabhängig vom Home-Verzeichnis zur Verfügung und kann gemeinsam von sudo, su und SDDM verwendet werden.
Außerdem erleichtert die zentrale Datei die Verwaltung mehrerer Sicherheitsschlüssel. Möchten Sie einen zweiten FIDO2-Authenticator als Reserve verwenden, können Sie dessen Credential ebenfalls in dieser Datei hinterlegen.
Nitro-/Yubikey oder Passwort?
Die hier beschriebene Konfiguration verwendet bewusst das PAM-Kontrollflag sufficient:
auth sufficient pam_u2f.so authfile=/etc/u2f_mappings
Eine erfolgreiche FIDO2-Authentifizierung reicht damit aus. Schlägt sie fehl oder steht der Schlüssel nicht zur Verfügung, kann die nachfolgende Passwortauthentifizierung über common-auth greifen.
Das ist keine klassische Zwei-Faktor-Authentifizierung. Stattdessen stehen zwei alternative Authentifizierungswege zur Verfügung: Also entweder über Nitrokey + Berührung oder über das gewohnte Eingeben des Passworts.
Bei einer echten Zwei-Faktor-Konfiguration würden beispielsweise zunächst das Passwort und anschließend der FIDO2-Schlüssel verlangt. Das ist ebenfalls möglich, erfordert aber eine entsprechend andere PAM-Konfiguration.
PIN und User Verification
FIDO2 kann neben der Benutzeranwesenheit auch eine PIN beziehungsweise eine „User Verification (UV)“ verwenden. Damit lässt sich die Authentifizierung zusätzlich absichern.
Mit folgendem Befehl registrieren Sie ein Credential, das eine PIN-Verifikation verlangt:
pamu2fcfg -u tux -N
pamu2fcfg unterstützt unter anderem folgende Optionen:
pamu2fcfg --help
(out)[...]
(out) -P, --no-user-presence Allow the credential to be used without ensuring the
(out) user's presence (default=off)
(out) -N, --pin-verification Require PIN verification during authentication
(out) (default=off)
(out) -V, --user-verification Require user verification during authentication
(out)[...]
Für die hier beschriebene Konfiguration genügt normalerweise eine Registrierung mit Benutzeranwesenheit. Das ausgegebene Credential enthält dann +presence.
Welche Variante sinnvoll ist, hängt vom gewünschten Sicherheitsniveau und vom verwendeten FIDO2-Authenticator ab. Die Unterstützung einzelner Funktionen kann sich außerdem zwischen verschiedenen Sicherheitsschlüsseln unterscheiden.
Hinweise und Tipps
Was passiert bei einem verlorenen Nitrokey?
Wenn Sie einen Sicherheitsschlüssel für die Linux-Anmeldung verwenden, sollten Sie sich bereits bei der Einrichtung Gedanken über einen Ausfall machen. Ein verlorener, beschädigter oder gerade nicht verfügbarer Schlüssel sollte nicht dazu führen, dass Sie sich dauerhaft aus Ihrem System aussperren.
Die einfachste Möglichkeit ist deshalb, das Passwort als Fallback beizubehalten. Die hier beschriebene Konfiguration mit auth sufficient erlaubt genau dieses Verhalten.
Noch sicherer ist ein zweiter FIDO2-Authenticator als Reserve. pam-u2f unterstützt mehrere Authenticatoren, sodass Sie beispielsweise einen Schlüssel täglich verwenden und einen zweiten an einem sicheren Ort aufbewahren können.
Eine zweite Root-Sitzung offen halten
Während der Einrichtung sollten Sie zusätzlich eine funktionierende Root-Shell geöffnet lassen:
sudo -i
Schließen Sie diese Shell erst, wenn die Änderungen erfolgreich getestet wurden. Das gilt insbesondere für Änderungen an /etc/pam.d/sudo, /etc/pam.d/su und /etc/pam.d/sddm. Alle hier geschilderten Konfigurationsänderungen sind ohne Neustart wirksam.
Sollte eine PAM-Konfiguration einen Fehler enthalten, können Sie über die noch geöffnete Root-Shell die entsprechende Datei korrigieren. Damit vermeiden Sie, sich durch eine fehlerhafte Konfiguration selbst aus dem System auszusperren.
Was tun, wenn der Login nicht mehr funktioniert?
Sollte eine fehlerhafte PAM-Konfiguration den grafischen Login verhindern, können Sie je nach System auf eine virtuelle Konsole wechseln. Unter TUXEDO OS lässt sich diese beispielsweise mit Strg+Alt+F3 öffnen.
Melden Sie sich dort mit einem noch funktionierenden Benutzer an und korrigieren Sie anschließend die betreffende PAM-Konfiguration. Falls auch die Anmeldung an einer virtuellen Konsole nicht mehr möglich ist, kann ein Recovery-System oder ein Live-System erforderlich sein.
Insbesondere bei Änderungen an /etc/pam.d/sddm sollten Sie deshalb die bestehende grafische Sitzung erst schließen, nachdem Sie den FIDO2-Login erfolgreich getestet haben.
Konfiguration nicht blind auf andere Systeme übertragen
PAM-Konfigurationen unterscheiden sich je nach Distribution, Version und eingesetztem Display Manager. Auch die verfügbaren Paketversionen können voneinander abweichen. Die hier gezeigten Pfade und Einstellungen beziehen sich deshalb auf die beschriebene Testumgebung.
Getestet wurde die Konfiguration mit TUXEDO OS, KDE Plasma, SDDM, pam-u2f und einem Nitrokey FIDO2. Die grundlegende Methode lässt sich auch auf andere Distributionen wie Debian, Ubuntu und andere Linux-Distributionen mit PAM übertragen.
Das Verfahren funktioniert grundsätzlich auch mit einem YubiKey sowie anderen U2F-/FIDO2-kompatiblen Sicherheitsschlüsseln. Unterschiede können sich jedoch abhängig vom Modell, der FIDO-Unterstützung, der Distribution und der verwendeten PAM-Version ergeben.
Exkurs: FIDO2 für die LUKS-Entsperrung beim Systemstart
Die bisher beschriebene Konfiguration greift erst, wenn das System bereits läuft. Naheliegend ist deshalb die Frage, ob sich auch eine mit LUKS (Linux Unified Key Setup) verschlüsselte Systempartition per FIDO2-Schlüssel entsperren lässt. Die Grundlage dafür ist vorhanden: Mit systemd-cryptenroll binden Sie einen FIDO2-Authenticator in einen LUKS2-Container ein, die nötigen Daten liegen danach im LUKS2-Header.
Der Haken sitzt eine Ebene tiefer, im Initramfs. Debian und die darauf aufbauenden Distributionen erzeugen es mit initramfs-tools, und dessen Cryptsetup-Anbindung kennt die Option fido2-device in /etc/crypttab nicht. Beim Erzeugen des Initramfs erscheint stattdessen die Meldung ignoring unknown option 'fido2-device'. Das ist kein Verhalten, das TUXEDO OS eigen wäre, sondern eine offene Lücke in Debian selbst: Sie ist seit November 2022 als Fehlerbericht gegen das Paket cryptsetup-initramfs dokumentiert und bis heute nicht geschlossen.
Hinweis: Als Umweg kursiert der Wechsel von initramfs-tools auf dracut. Dracut greift beim Entsperren auf systemd-cryptsetup zurück und kommt deshalb mit fido2-device zurecht. Der Weg funktioniert, tauscht aber den Initrd-Generator des gesamten Systems aus. Für einen Eingriff dieser Tiefe in die Boot-Kette sehen wir auf einem Arbeitsgerät keinen vertretbaren Nutzen. Wir empfehlen ihn daher nicht.
Wer die LUKS-Entsperrung dennoch verfolgen möchte, findet mit fido2luks einen deutlich weniger einschneidenden Ansatz. Das Projekt klinkt sich über ein Keyscript in initramfs-tools ein, statt den Initrd-Generator zu ersetzen. Es liest die von systemd-cryptenroll im LUKS2-Header hinterlegten FIDO2-Daten und kann den Sicherheitsschlüssel damit bereits während des Systemstarts verwenden. Eingetragen wird das Keyscript in /etc/crypttab, anschließend erzeugen Sie das Initramfs neu.
Achtung: fido2luks (weitere Informationen auf GitHub) gehört nicht zur unterstützten Konfiguration von TUXEDO OS. In Debian liegt das Paket bislang nur in Testing und Unstable, nicht in den stabilen Paketquellen. Wer es einsetzt, verlässt den von uns getesteten Weg und kann dafür keinen Support erwarten.
Änderungen an LUKS, /etc/crypttab und dem Initramfs können dazu führen, dass das System nicht mehr startet. Halten Sie deshalb einen funktionierenden zweiten LUKS-Schlüssel sowie ein Live-System zur Wiederherstellung bereit, bevor Sie das Initramfs neu erzeugen.
Für diese Anleitung bleibt es damit bei pam-u2f für sudo, su und den grafischen Login. Diese drei Anwendungsfälle haben wir unter TUXEDO OS getestet, sie kommen ohne Eingriff in die Boot-Kette aus, und das Passwort bleibt als Rückfallweg erhalten.