Mit einem YubiKey lässt sich die Benutzer-Anmeldung an einem Linux-PC ebenfalls mit einem zweiten Faktor (U2F) absichern. Den U2F kann man dabei global für jede Benutzeranmeldung, sei es die grafische Anmeldung, via SSH, etc. vorgeben. Auch eine feine Granulierung nach Anmeldeverfahren ist möglich.
Der Aufwand ist ein wenig höher als bei einem Windows-System, aber überschaubar und auch relativ schnell erledigt.
Der Login eines virtualisiertes Systems kann so ebenfalls mit dem Hardwaretoken ergänzt werden. Voraussetzung ist, dass der Host-Rechner den YubiKey vollständig an das Gast-System durchreicht.
In diesem Beispiel verwende ich ein virtualisiertes Ubuntu-System in einer Oracle VirtualBox.
Die Anleitung für ein Windows findet ihr ebenfalls hier im Blog
➡ YubiKey 11 – Windows System anpassen zur Anmeldung mit einem YubiKey an einem Linux-Server
Inhaltsverzeichnis
Ubuntu vorbereiten
PAM-Modul installieren
Ubuntu und YubiKey für Login vorbereiten
Ubuntu – Login auf YubiKey umstellen
Anmeldung mit YubiKey funktioniert
Ubuntu vorbereiten
Eine Anleitung für die Vorbereitung einer VirtualBox findet ihr hier im Blog.
➡ YubiKey 05 – VirtualBox für die Erstellung des OpenPGP-Schlüsselpaars und zum Anschluss des YubiKeys vorbereiten
Wichtig ist, dass das über den USB-Controller der YubiKey vom Host- an das Gast-System durchgereicht wird.
Mit dem folgenden Befehl lassen sich die angeschlossenen USB-Geräte auflisten. Der YubiKey sollte dann angezeigt werden.
lsusb

In der Liste ist auch der YubiKey enthalten. Er wird also korrekt vom Host an den Gast durchgereicht.
PAM-Modul installieren
“PAM” steht für “Pluggable Authentication Modules” ….
sudo apt install libpam-u2f
Weitere Informationen zum “pam-u2f“-Paket finden sich auf
- https://github.com/Yubico/pam-u2f
- https://developers.yubico.com/pam-u2f/
- https://manpages.ubuntu.com/manpages/cosmic/man8/pam_u2f.8.html
Ubuntu und YubiKey für Login vorbereiten
Es wird ein neues Verzeichnis im Home-Verzeichnis der Benutzers benötigt. Es lässt sich mit dem Befehl anlegen.
Besteht bereits ein solches Verzeichnis, könnt ihr diesen Schritt überspringen.
mkdir ~/.config/YubiKey
Im nächsten Schritt wird ein angeschlossener YubiKey für die Registrierung vorbereitet.
pamu2fcfg > ~/.config/YubiKey/u2f_keys
Denkt daran die Metallkontakte am YubiKey zu drücken, sonst erhaltet ihr die Fehlermeldung
“Unable to generate registration challenge, timeout error (-7)”
In der “manpage” ist zu “mapu2fcfg” zu lesen:
“DESCRIPTION
Perform a U2F registration procedure using a connected U2F token and output a configuration line that can be used with the U2F PAM module.
”
Mit diesem Befehl wurde euer YubiKey-Schlüssel ausgelesen und in die Datei “~/.config/YubiKey/u2f_keys” geschrieben.
Einen weitern YubiKey, also ein Backup-Tocken, kann man ebenfalls auslesen und in die Datei eintragen lassen. Dazu ist der Befehl nur geringfügig anzupassen.
pamu2fcfg -n >> /etc/YubiKey/u2f_keys
Habt ihr bereits die “u2f_keys” in ein anderes Verzeichnis verschoben, dann lt. der Befehl so
sudo pamu2fcfg -n >> ~/.config/YubiKey/u2f_keys
Die Zugriffsrechte der Datei lassen sich mit anzeigen.
ls -la ~/.config/YubiKey/u2f_keys
Mit einem Editor könnt ihr die Datei auch einsehen und editieren.
nano ~/.config/YubiKey/u2f_keys
Das kann ein Sicherheitsrisiko darstellen, da normale Benutzer ohne Adminrechte in der Lage sind den Key zu modifizieren. Soll der Schlüssel davor geschützt werden, kann er in ein anderes Verzeichnis verschoben werden und die Zugriffsrechte auf die Datei geändert werden.
Die “u2f_keys“-Datei verschieben wird deshalb in einen neuen Ordner mit dem Namen “YubiKey” im Verzeichnis “/etc” verschoben.
Im offiziellen YubiKey Manual wird beschrieben, wie die Datei “/etc/pam.d/sudo” bearbeitet wird. Durch diese Änderung lassen sich keine “sudo“-Befehle mehr ohne den YubiKey ausführen!!!
➡ https://support.yubico.com/hc/en-us/articles/360016649099-Ubuntu-Linux-Login-Guide-U2F
Ubuntu – Login auf YubiKey umstellen
Achtung
Nach diesem Schritt ist eine Anmeldung wirklich nur noch mit dem YubiKey möglich. Verliert ihr den Schlüssel, dann ist ein Login nicht mehr möglich. Legt deshalb zu Sicherheit gleich einen zweiten Schlüssel in der Datei an.
sudo mkdir /etc/YubiKey
cd /etc/YubiKey/
sudo mv ~/.config/YubiKey/u2f_keys /etc/YubiKey/
Die Datei wurde mit dem letzten Befehl in das Verzeichnis “/etc/YubiKey/” verschoben und lässt sich ab jetzt nur noch mit “sudo” bearbeiten. Für alle anderen ist die Datei nur noch lesend zugänglich.
ls -la /etc/YubiKey/
###################################
Ab hier besondere Vorsicht!
Die Terminal-Sitzung die ihr gerade benutzt muss offen bleiben!
Die Terminal-Sitzung die ihr gerade benutzt muss die Datei “/etc/pam.d/sudo” geöffnet lassen. Wird die Session geschlossen und der YubiKey funktioniert nicht, gibt es keine Möglichkeit mehr “sudo” ohne den hinterlegten YubiKey zu nutzen.
Deshalb ist die Datei nur zu SPEICHERN!
–> Strg + O
Der Editor darf NICHT verlassen werden!
###################################
Nun fehlt die Ergänzung in der “/etc/pam.d/sudo” vornehmen.
sudo nano /etc/pam.d/sudo
Nach der Zeile “@include common-auth ist der Verweis auf die “u2f_keys” einzutragen.
auth required pam_u2f.so authfile=/etc/YubiKey/u2f_keys cue
Datei nur zu SPEICHERN!
–> Strg + O und in der Terminal-Sitzung geöffnet lassen.

In dieser Zeile gibt es eine Abweichung zur offiziellen Dokumentation von Yubico. Es wird am Ende der Zeile ein “cue” angehängt. Dadurch wird “Please touch the device.” ausgegeben, wie unten im Screenhsot zu sehen.
In der offiziellen Dokumentation steht dazu:
“cue Set to prompt a message to remind to touch the device. ”
https://developers.yubico.com/pam-u2f/
Nun kann die Konfiguration getestet werden.
Im Screenshot seht ihr das Vorgehen:

Das Terminal 1 bleibt IMMER geöffnet!
Öffnet ein neues Terminal-Fenster und gebt dort den Befehl ein.
Terminal-Sitzung 2: YubiKey ist nicht angeschlossen
Mit dem Befehl “lsusb” wird abgefragt, ob der YubiKey am System angeschlossen ist.
sudo echo test
Nach einer dreimaligen Eingabe des richtigen Passworts wird abgebrochen, da der YubiKey nicht erkannt wurde.
Terminal-Sitzung 2: YubiKey ist angeschlossen
Mit dem Befehl “lsusb” wird abgefragt, ob der YubiKey am System angeschlossen ist.
Ihr seht, der YubiKey wird erkannt.
sudo echo test
Und siehe da, nach dem Drücken der Metallkontakte wird der Befehl ausgeführt.
Nach diesem Test sieht man, dass die Konfiguration korrekt ist und der YubiKey zum Ausführen der “sudo“-Befehle zwingend benötigt und auch erkannt wird.
Für die zwingende Abfrage des YubiKeys bei der Anmeldung ist das Skript “/etc/pam.d/common-auth” zu editieren.
Die Datei ist die globale Konfigurationsdatei für die Anmeldung und gilt, z.B. auch für SSH-Sessions.
Das ist auch eine weitere Abweichung von der offiziellen Yubico-Dokumentation.
#YubiKey required for login
auth required pam_u2f.so nouserok authfile=/etc/YubiKey/u2f_keys cue
Die Option “nouserik” geben wird noch mit.
In der Dokumentation steht dazu:
“Set to enable authentication attempts to succeed even if the user trying to authenticate is not found inside authfile or if authfile is missing/malformed. ”
das bedeutet
“Wird gesetzt, damit Authentifizierungsversuche auch dann erfolgreich sind, wenn der Benutzer, der sich zu authentifizieren versucht, nicht in der auth-Datei gefunden wird oder wenn die auth-Datei fehlt/falsch ist. ”
Damit können sich auch Benutzer noch anmelden, die über keinen YubiKey verfügen.
sudo-Befehle ohne YubiKey
Weiter oben haben wir zum Testen eine Zeile in der “/etc/pam.d/sudo” hinzugefügt, damit beim Ausführen von “sudo“-Befehlen zwingend eine YubiKey erforderlich ist.
Wer das nicht möchte, kann das deaktivieren, dann wird wieder nach dem Passwort anstatt nach dem Hardwaretoken gefragt.
Es ist die Datei “/etc/pam.d/sudo” zu editieren und ein paar Anpassungen vorzunehmen.
- Die Zeile “@include common-auth” ist auszukommentieren.
- Die Zeile, die wir weiter oben für das Testen eingefügt haben, ist ebenfalls auszukommentieren.
- Der Inhalt aus der “/etc/pam.d/common-auth” ist unterhalb der auskommentierten Zeile “@include common-auth” einzufügen.
Durch die Änderungen werden die globalen Vorgaben aus der “common-auth” überschrieben und nur die Einstellungen der “sudo“-Datei ziehen.
Der Inhalt der Datei sieht dann so aus
#%PAM-1.0
session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
#@include common-auth
# Content of commom-auth
# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_sss.so use_first_pass
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
# end of pam-auth-update config
#YubiKey required for login
#auth required pam_u2f.so nouserok authfile=/etc/YubiKey/u2f_keys cue
@include common-account
@include common-session-noninteractive

Auf diese Weise lässt sich der Zwang für den YubiKey auch für andere Protokolle deaktivieren, z.B. SSH.
Dafür ist die Datei “/etc/pam.d/sshd” zu editieren und die Anpassung vorzunehmen wie oben beschrieben.
Anmeldung mit YubiKey funktioniert
Nach der ganzen Konfiguration teste wir den Login …

.. und siehe da, es wird nach dem YubiKey gefragt. 🙂
Seit Anfang des Jahrtausends absolut Linux-begeistert und Fan von Open Source. Raspberry Pi Bastler der ersten Stunde und nach wie vor begeistert von dem kleinen Stück Hardware, auf dem
er tolle Projekte umsetzt. Teilt hier seine Erfahrungen mit Nextcloud, Pi-hole, YubiKey und zu anderen spannenden IT-Themen. Nutzt
beruflich viel Excel. Sitzt vor einem riesen 49″ Monitor, nutzt Windows zum Arbeiten, Linux auf seinen Servern und virtuellen Maschinen und hört dabei Spotify und Musik über seinen RadioPi.
(**) Produktpreise und -verfügbarkeit sind zum angegebenen Datum / Uhrzeit korrekt und können sich ändern. Alle Preis- und Verfügbarkeitsinformationen auf https://www.amazon.de/ zum Zeitpunkt des Kaufs gelten für den Kauf dieses Produkts.