Nitrokey 3A Fedora 35 PAM Konfiguration

Moin,

ich versuche bisher erfolglos meinen Nitrokey 3A als Login Methode meines Fedora 35 Systems einzurichten. Da ich für Fedora 35 und Nitrokey kein eins zu eins passendes HowTo gefunden habe, habe ich mich u.a. an folgenden orientiert (sorry für die Formatierung, ich darf nur 2 Links hinzufügen:

https://docs.nitrokey.com/nitrokey3/linux/desktop-login.html
https://www.reddit.com/r/Fedora/comments/akck9m/authenticating_with_gdm_and_sudo_with_a_u2f/
https:// developers yubico com yubico-pam/

Mein Vorgehen kurz zusammengefasst:

  1. Installation der Pakete: libnitrokey, pamu2fcfg, pam-u2f, pynitrokey (via pip)
  2. Test des Nitrokey mittel pynitrokey nk3 test → Test erfolgreich
  3. Erstellen der Schlüssel mittels pamu2fcfg > ~/.config/Nitrokey/u2f_keys
  4. Verschieben der Schlüsseldatei nach /etc/Nitrokey
    Die Schlüsseldate enthält Inhalt im folgenden Muster: :,
  5. /etc/pam.d/common-auth nach Vorgabe aus der Nitrokey Dokumentation ergänzt
  6. /etc/pam.d/sudo und /etc/pam.d/gdm-passwd angepasst um common-auth anzuwenden

Wenn ich nun versuche einen sudo Befehl auszuführen oder mich einzuloggen, wird der Nitrokey erkannt und es erfolgt die Aufforderung den Key zu berühren. Sobald ich die Berührung durchführe passiert aber nichts weiter und nach einer kurzen Zeit erfolgt die Aufforderung das Passwort einzugeben.

Hier meine common-auth:

auth sufficient pam_u2f.so authfile=/etc/Nitrokey/u2f_keys cue prompt nouserok

Hier meine sudo:

auth include common-auth (dese Zeile habe ich ergänzt)
auth include system-auth
account include system-auth
password include system-auth
session optional pam_keyinit.so revoke
session required pam_limits.so
session include system-auth

Hier meine gdm-passwd:

auth [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth include common-auth (dese Zeile habe ich ergänzt)
auth substack password-auth
auth optional pam_gnome_keyring.so
auth include postlogin

account required pam_nologin.so
account include password-auth

password substack password-auth
-password optional pam_gnome_keyring.so use_authtok

session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
session required pam_namespace.so
session include password-auth
session optional pam_gnome_keyring.so auto_start
session include postlogin

Ich habe daraufhin auch mal die Debug flag in common-auth gesetzt, folgend der Output. Alles was nach Keys oder ähnlichem aussieht habe ich natürlich entfernt. Als fiktiven user benutze ich folgend xyz. key1 und key2 sind identisch zu denen aus der Schlüsseldatei

Hier der Debug output von pam_u2f

debug(pam_u2f): pam-u2f.c:99 (parse_cfg): called.
debug(pam_u2f): pam-u2f.c:100 (parse_cfg): flags 32768 argc 4
debug(pam_u2f): pam-u2f.c:102 (parse_cfg): argv[0]=authfile=/etc/Nitrokey/u2f_keys
debug(pam_u2f): pam-u2f.c:102 (parse_cfg): argv[1]=cue
debug(pam_u2f): pam-u2f.c:102 (parse_cfg): argv[2]=debug
debug(pam_u2f): pam-u2f.c:102 (parse_cfg): argv[3]=nouserok
debug(pam_u2f): pam-u2f.c:104 (parse_cfg): max_devices=0
debug(pam_u2f): pam-u2f.c:105 (parse_cfg): debug=1
debug(pam_u2f): pam-u2f.c:106 (parse_cfg): interactive=0
debug(pam_u2f): pam-u2f.c:107 (parse_cfg): cue=1
debug(pam_u2f): pam-u2f.c:108 (parse_cfg): nodetect=0
debug(pam_u2f): pam-u2f.c:109 (parse_cfg): manual=0
debug(pam_u2f): pam-u2f.c:110 (parse_cfg): nouserok=1
debug(pam_u2f): pam-u2f.c:111 (parse_cfg): openasuser=0
debug(pam_u2f): pam-u2f.c:112 (parse_cfg): alwaysok=0
debug(pam_u2f): pam-u2f.c:113 (parse_cfg): authfile=/etc/Nitrokey/u2f_keys
debug(pam_u2f): pam-u2f.c:114 (parse_cfg): authpending_file=(null)
debug(pam_u2f): pam-u2f.c:115 (parse_cfg): origin=(null)
debug(pam_u2f): pam-u2f.c:116 (parse_cfg): appid=(null)
debug(pam_u2f): pam-u2f.c:117 (parse_cfg): prompt=(null)
debug(pam_u2f): pam-u2f.c:169 (pam_sm_authenticate): Origin not specified, using “pam://fedora”
debug(pam_u2f): pam-u2f.c:180 (pam_sm_authenticate): Appid not specified, using the same value of origin (pam://fedora)
debug(pam_u2f): pam-u2f.c:192 (pam_sm_authenticate): Maximum devices number not set. Using default (24)
debug(pam_u2f): pam-u2f.c:210 (pam_sm_authenticate): Requesting authentication for user xyz
debug(pam_u2f): pam-u2f.c:221 (pam_sm_authenticate): Found user xyz
debug(pam_u2f): pam-u2f.c:222 (pam_sm_authenticate): Home directory for xyz is /home/xyz
debug(pam_u2f): pam-u2f.c:271 (pam_sm_authenticate): Using authentication file /etc/Nitrokey/u2f_keys
debug(pam_u2f): util.c:105 (get_devices_from_authfile): Authorization line: xyz:key1,key2
debug(pam_u2f): util.c:110 (get_devices_from_authfile): Matched user: xyz
debug(pam_u2f): util.c:137 (get_devices_from_authfile): KeyHandle for device number 1: key1
debug(pam_u2f): util.c:156 (get_devices_from_authfile): publicKey for device number 1: key2
debug(pam_u2f): util.c:167 (get_devices_from_authfile): Length of key number 1 is 65
debug(pam_u2f): util.c:194 (get_devices_from_authfile): Found 1 device(s) for user xyz
debug(pam_u2f): pam-u2f.c:340 (pam_sm_authenticate): Using file ‘/var/run/user/1000/pam-u2f-> authpending’ for emitting touch request notifications
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
now trying with timeout 2
now trying with timeout 4
USB read rc read 64
USB recv: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
device /dev/hidraw0 discovered as ‘Nitrokey 3’
version (Interface, Major, Minor, Build): 2, 0, 0, 0 capFlags: 5
debug(pam_u2f): util.c:277 (do_authentication): Device max index is 0
debug(pam_u2f): util.c:311 (do_authentication): Attempting authentication with device number 1
debug(pam_u2f): util.c:335 (do_authentication): Challenge: { “keyHandle”: “key1”, “version”: “U2F_V2”, “challenge”: “Folge aus Zahlen und Buchstaben”, “appId”: “pam://fedora” }
JSON: { “keyHandle”: “key1”, “version”: “U2F_V2”, “challenge”: “Folge aus Zahlen und Buchstaben”, “appId”: “pam://fedora” }
JSON challenge URL-B64: Folge aus Zahlen und Buchstaben
client data: { “challenge”: “Folge aus Zahlen und Buchstaben”, “origin”: “pam://fedora”, “typ”: “navigator.id.getAssertion” }
JSON: { “keyHandle”: “key1”, “version”: “U2F_V2”, “challenge”: “Folge aus Zahlen und Buchstaben”, “appId”: “pam://fedora” }
JSON app_id pam://fedora
JSON: { “keyHandle”: “key1”, “version”: “U2F_V2”, “challenge”: “Folge aus Zahlen und Buchstaben”, “appId”: “pam://fedora” }
JSON keyHandle URL-B64: key1
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
USB send: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB write returned 65
now trying with timeout 2
now trying with timeout 4
now trying with timeout 8
USB read rc read 64
USB recv: Folge aus Zahlen und Buchstaben, sieht base64 encoded aus
USB data (len 2): 6985
Please touch the device.

Anschließend wiederholen sich die JSON Zeilen einmal sowie die USB send, USB write und Timeout Zeilen bis der Key berührt wird. Ab der Berührung erfolt für einige Sekunden kein Debug output mehr. Der Prozess schließt dann mit folgenden Output:

USB data (len 2): 6a80
debug(pam_u2f): util.c:364 (do_authentication): Unable to communicate to the device, timeout error
USB send: Folge aus Zahlen und Buchstaben
USB write returned 65
now trying with timeout 2
now trying with timeout 4
USB read rc read 64
USB recv: Folge aus Zahlen und Buchstaben, dieses mal identisch mit USB write
debug(pam_u2f): pam-u2f.c:371 (pam_sm_authenticate): do_authentication returned -1
debug(pam_u2f): pam-u2f.c:410 (pam_sm_authenticate): done. [Fehler bei Authentifizierung]

Hinweise:

  • Alle ‘challenge’ einträge sind identisch, die Zeichenkette findet sich aber sonst nirgends
  • Die USB send und recv Einträge sind in den Iterationen identisch
  • Nach berühren des Nitrokey sind die Einträge USB data, USB send und USB recv von den vorherigen Iterationen abweichend.

Dinge die ich zusätzlich probiert habe sind:

Die Schlüsseldatei als Eigentum von root ausweisen:

$ ls -l /etc/Nitrokey/u2f_keys
-rw-rw-r–. 1 root root 385 10. Dez 09:09 /etc/Nitrokey/u2f_keys

Den Fix zum Thema SeLinux aus der Yubico Dokumentation.

Mit meinem Linux Latein bin ich jetzt am Ende. Ich muss aber auch dazu sagen, dass ich mich jetzt das erste mal mit pam beschäftigt habe, ich will also nicht ausschließen, dass ich doch irgendwo was falsch konfguriert habe. Hat noch jemand Erfahrungen/Ideen?
Bei Bedarf kann ich auch gerne noch weitere Details nachliefern.

Besten Dank

Hallo CoCoL0r3s,

Wenn ich nun versuche einen sudo Befehl auszuführen oder mich einzuloggen,
wird der Nitrokey erkannt und es erfolgt die Aufforderung den Key zu berühren.
Sobald ich die Berührung durchführe passiert aber nichts weiter und nach einer
kurzen Zeit erfolgt die Aufforderung das Passwort einzugeben.

Bei mir funktioniert es - ich habe die Zeile aus common-auth als
erste Zeile in die Datei login kopiert (die Dateien sudo und gdm-passwd habe ich nicht geändert), bin dann mit Strg+Alt+F3 zum Linux-Terminal gewechselt
und habe mich angemeldet

  • mit einem in der Datei u2f_keys enthaltenen Benutzer durch Berühren des Nitrokeys
  • mit einem in der Datei u2f_keys nicht enthaltenen Benutzer ohne Berühren des Nitrokeys und ohne Kennwort

Zurück zur grafischen Oberfläche geht es via Alt-F2.

Probiere das doch mal.

1 Like

Hallo FraktaleWelten,

nur in die login datei schreiben hat bei mir nicht funktioniert. Wenn ich aber meinen Weg belasse, also Zeile in die common-auth und diese in gdm-password und sudo inkludiere und dann zusätzlich auch noch, wie von Dir beschrieben, die Zeile aus common-auth in login kopiere funktioniert es. Ich kann mich nun bei GDM und sudo mit dem Key authentifizieren.

Vielen Dank!

Also nochmal zusammengefasst für alle Fedora user:
Zusätzlich zur Nitrokey Anleitung für Ubuntu den Eintrag

auth sufficient pam_u2f.so authfile=/etc/Nitrokey/u2f_keys cue prompt nouserok

noch in

/etc/pam.d/login

einfügen und für Verwendung bei GDM und sudo die Zeile

auth include common-auth

in die Dateien

/etc/pam.d/gdm-password
/etc/pam.d/sudo

einfügen. Falls nur einer der beiden Dienste mit dem Nitrokey funktionieren soll entsprechend nur in eine Datei einfügen.

Hallo CoCoL0r3s,

danke für die Rückmeldung, so habe ich es nun auch bei mir konfiguriert.

Dabei wird diese Zeile verwendet:

auth required pam_u2f.so authfile=/etc/Nitrokey/u2f_keys nouserok cue [cue_prompt=Stick berühren]

GDM zeigt den Text “Stick berühren” bei der Anmeldung an -
das ist auf einem Bildschirmphoto unter Desktop-Anmeldung und Linux-Benutzerauthentifizierung — Nitrokey Documentation
zu sehen, dort heißt es “Please touch the device.”.

Die Protokollierung einschalten geht mit “debug debug_file=syslog” und die Ausgabe findet sich in /var/log/secure.

Kann das Berühren des Sticks ausgeschaltet werden, so daß nur das Vorhandensein des Nitrokeys erforderlich ist? Ich habe die Parameter userpresence=0 und userverification=0 gesetzt, aber das hat nicht geholfen.

Moin,

die sufficient Option werde ich bei mir auch noch gegen required tauschen sobald alles stabil funktioniert und NFC gefixed ist.

Das Berühren des Key ist, soweit ich weiß, ein Teil des FIDO U2F Standards. Daher glaube ich nicht, dass man das abschalten kann.

Grüße