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:
- Installation der Pakete: libnitrokey, pamu2fcfg, pam-u2f, pynitrokey (via pip)
- Test des Nitrokey mittel pynitrokey nk3 test → Test erfolgreich
- Erstellen der Schlüssel mittels pamu2fcfg > ~/.config/Nitrokey/u2f_keys
- Verschieben der Schlüsseldatei nach /etc/Nitrokey
Die Schlüsseldate enthält Inhalt im folgenden Muster: :, - /etc/pam.d/common-auth nach Vorgabe aus der Nitrokey Dokumentation ergänzt
- /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 postloginaccount required pam_nologin.so
account include password-authpassword 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