Zum Inhalt

YubiKey - Benutzer-Anmeldung an Linux/Ubuntu nur mit einem YubiKey erlauben

Foto von FLY:D auf Unsplash

Mit einem YubiKey lässt sich die Benutzeranmeldung an einem Linux-PC mit einem zweiten Faktor (U2F) absichern. Den U2F kann man dabei global für jede Benutzeranmeldung, sei es die grafische Anmeldung oder via SSH, vorgeben.

Auch eine feinere 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 an einem virtualisierten 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:

👉 Windows System anpassen zur Anmeldung mit einem YubiKey an einem Linux-Server

Ubuntu vorbereiten

Eine Anleitung für die Vorbereitung einer VirtualBox findet ihr hier im Blog. 👉 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 angezeigt werden.

lsusb

Angeschlossene USB-Geräte auflisten

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 zu "pam-u2f" finden sich auf:

Ubuntu und YubiKey für Login vorbereiten

Es wird ein neues Verzeichnis im Home-Verzeichnis des Benutzers benötigt. 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 weiteren YubiKey, also ein Backup-Token, kann man ebenfalls auslesen und in die Datei eintragen lassen. Dazu ist der Befehl nur geringfügig anzupassen.

pamu2fcfg -n >> ~/.config/YubiKey/u2f_keys

Habt ihr bereits die "u2f_keys" in ein anderes Verzeichnis verschoben, dann lt. der Befehl

sudo pamu2fcfg -n >> /etc/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❗️

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!

In der Terminal-Sitzung muss die Datei /etc/pam.d/sudo geöffnet bleiben, um die Änderungen ggf. rückgängig zu machen.

Wird die Session geschlossen gibt es KEINE Möglichkeit mehr "sudo" ohne YubiKey zu nutzen.

Deshalb ist die Datei nur zu SPEICHERN! --> Strg + O

Der Editor darf NICHT verlassen werden❗️

Nun ist die Ergänzung in der "/etc/pam.d/sudo" vorzunehmen.

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.

Nur SPEICHERN

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 Screenshot zu sehen.

In der offiziellen Dokumentation steht dazu:

cue Set to prompt a message to remind to touch the device.

Nun kann die Konfiguration getestet werden.

Im Screenshot seht ihr das Vorgehen:

/etc/pam.d/sudo editieren

Terminal-Sitzung 1: Bleibt immer geöffnet!

Das Terminal 1 bleibt IMMER geöffnet❗️

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 und somit die Metallkontakte nicht gedrückt werden konnten.

Terminal-Sitzung 3: 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 alle Anmeldung am System und gilt u.a. für SSH-Sessions.

sudo nano /etc/pam.d/common-auth

Fügt am Ende der Datei die folgenden beiden Zeilen ein.

#YubiKey required for login
auth    required   pam_u2f.so nouserok authfile=/etc/YubiKey/u2f_keys cue

Die Option nouserok geben wir noch mit, was eine Abweichung von der offiziellen Yubico-Dokumentation darstellt.

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.

Durch die Option können sich auch andere Benutzer noch anmelden, die über keinen YubiKey verfügen. Wenn sich alle Benutzer ausschließlich mit einem YubiKey anmelden müssen, dann ist die Option nouserok einfach wegzulassen.

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 ein Drücken der Metallkontakte des YubiKeys erforderlich ist.

Wer das nicht möchte, kann das Deaktivieren. Dann wird wieder beim Verwenden von sudo wieder nach dem Passwort anstatt nach dem Hardwaretoken gefragt.

Es ist die Datei /etc/pam.d/sudo zu editieren und ein paar Anpassungen vorzunehmen.

  1. Die Zeile *@include common-auth ist auszukommentieren.
  2. Die Zeile, die wir weiter oben für das Testen eingefügt haben, ist ebenfalls auszukommentieren.
  3. Der Inhalt aus der /etc/pam.d/common-auth ist unterhalb der aus zu kommentierten 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 verwendet.

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

Passwortabfrage bei sudo-Befehle aktivieren

Anmeldung mit YubiKey funktioniert

Nach der ganzen Konfiguration testen wir den Login ...

Login mit YubiKey

... und siehe da, es wird nach dem YubiKey gefragt. 😀

Mehrplatzrechner

Möchte man an einem Mehrplatzrechner für alle Benutzer die Anmeldung mit einem YubiKey vorgeben, ist das auch sehr einfach möglich.

Wenn ihr meine Anleitung von oben befolgt habt, dann ist die Datei /etc/YubiKey/u2fkeys bereits vorhanden. Die Datei könnt ihr weiterverwenden, um dort alle YubiKeys euer Benutzer zu hinterlegen.

Die Dateiberechtigungen sind aber zwingend zu prüfen. Stimmen die nicht überein, dann erhalten die Benutzer beim Login keinen Zugriff auf die Datei, um den hinterlegten YubiKey-Schlüssel zu verifizieren.

Habt ihr die Datei, wie in der Anleitung angelegt, dann ist der Eigentümer der Datei euer Benutzer. Hier im Beispiel heißt der Benutzer einfach benutzer

-rw-rw-r--  1 benutzer  benutzer  ... u2f_keys

Das müsst ihr unbedingt ändern:

sudo chown root:root /etc/YubiKey/u2f_keys

Nach der Änderung sehen die Berechtigungen dann so aus

-rw-rw-r--  1 root  root  ... u2f_keys

In die Datei nehmt ihr alle YubiKeys euer Benutzer auf. Tragt einfach jeden Benutzer in eine neue Zeile ein und schreibt dahinter den YubiKey.

benutzer:18927497...
benutzer2:247971...
benutzer3:387357

Jeder Benutzer kann auch ganz einfach den Eintrag selber erzeugen:

pamu2fcfg > benutzer-yubikey.txt

Die Datei wird im Home-Verzeichnis des Benutzers angelegt und enthält bereits die korrekte Formatierung und die YubiKey-Informationen.

Die Datei kann an einen Admin weitergegeben werden, der dann mit sudo-Rechten die Informationen in die /etc/YubiKey/u2f_keys einfügen kann.

Wenn alle YubiKeys der Benutzer in der u2f_keyseingetragen, dann kann die Option nouserok in der /etc/pam.d/sudo ganz weggelassen oder auf alwaysok umgestellt werden.

Fehlermeldungen

Ich hatte das Problem, dass ich den YubiKey zwar ansprechen und die PIN eingeben konnte, jedoch wurde die nicht akzeptiert.

pamu2fcfg > ~/.config/Yubico/u2f_keys
Enter PIN for /dev/hidraw2: 
error: fido_dev_make_cred (52) FIDO_ERR_PIN_AUTH_BLOCKED

Das Problem war schnell gelöst. Mein YubiKey war über ein USB-Kabel am PC angeschlossen. Ein Umstecken an eine USB-Schnittstelle direkt am Gerät brachte Abhilfe, der Key wurde erkannt, die PIN-Abfrage und -Eingabe war erfolgreich und der YubiKey hat sich wie oben beschrieben für die Anmeldung einrichten lassen.

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Source

Foto von FLY:D auf Unsplash