Public-Key-SSH mit Yubikey als zweiten Faktor
Die Yubikeys sind ziemlich coole USB-Hardware-Tokens für Zwei-Faktor-Authentifizierung, und seit einigen Tagen bin ich stolzer Besitzer eines Yubikey Neo.
Mit yubico-pam sollte es nun eigentlich recht einfach sein, einen Yubikey als zweiten Faktor für SSH zu verwenden, auf ein paar Hürden bin ich aber doch gestoßen. Und so geht's:
Installation
Unter Ubuntu geht das ganz problemlos mit sudo apt install libpam-yubico
, für andere Linux-Versionen gibt es die Anleitung zur Installation auf der Seite von yubico-pam.
Einrichtung der Yubikeys
Die erlaubten Yubikeys müssen in der Yubico Cloud registriert sein. Das sind sie standardmäßig, aber wenn man mit dem Yubikey Personalization Tool einen neuen Key erstellen möchte, sollte man "Quick" und nicht "Advanced" unter "Yubico OTP" auswählen, und dann mit "Upload to Yubico" den neuen öffentlichen Schlüssel registrieren.
Jetzt benötigt man zuerst einmal eine Client ID und einen Client Key für die Yubico API. Beides gibt's auf https://upgrade.yubico.com/getapikey/ nach Eingabe einer E-Mail-Adresse und eines Tokens vom Yubikey.
Außerdem ist die der öffentliche Schlüssel (Public Identity) des Yubikey relevant. Den bekommt man, indem man einen Token erzeut und die letzten 32 Zeichen löscht. Wer das nicht abzählen will, kann ihn auch einfach hier einfügen:
Yubikey Token: Public Identity:
Die Public Identity muss jetzt in /etc/yubikey_mappings
einem Benutzer zugewiesen werden, beispielsweise so:
root:identity1:identity2:…
user:identity2
SSH-Konfiguration
In der Datei /etc/ssh/sshd_config
müssen folgende Optionen gesetzt werden:
UsePAM yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive:pam
# Wenn root-Login erlaubt sein soll, MUSS PermitRootLogin auf "yes" gesetzt sein. Bei "without-password" erhält man den Fehler "Internal error: PAM auth succeeded when it should have failed"
PermitRootLogin yes
# Damit hat man effektiv das gleiche wie mit "without-password", im Idealfall ist aber sowieso PasswordAuthentication für alle Benutzer auf "no" gesetzt.
Match User root
PasswordAuthentication no
Einrichtung PAM
In /etc/pam.d/sshd
kann man jetzt den Yubikey als Faktor hinzufügen. Dazu fügt man ganz am Anfang folgende Zeile ein:
auth required pam_yubico.so id=1234 key=abcd authfile=/etc/yubikey_mappings mode=client nullok verbose_otp
1234
wird durch die Client ID ersetzt,abcd
durch den Client Key.- Mit
verbose_otp
wird der Token während der Eingabe angezeigt, lässt man das Argument weg wird er wie ein Passwort nicht angezeigt. nullok
bedeutet, dass Nutzer ohne definierten Yubikey sich trotzdem anmelden können.
Mit dieser Konfiguration wird nach dem Token immer noch das Benutzerpasswort abgefragt. Um das zu deaktivieren, kann man die Zeile @include common-auth
auskommentieren.
Da in dieser Datei jetzt Client ID und Secret liegen, sollte man den Lesezugriff für Nutzer außer root unterbinden:
$ sudo chmod go-r /etc/pam.d/sshd
Neustart des SSH-Daemons
Um die Änderungen anzuwenden, muss jetzt noch SSH mit sudo systemctl restart sshd.service
neugestartet werden.
Verbindet man sich jetzt mit dem Server (bitte in einem neuen Konsolen-Tab, falls irgendetwas schiefgelaufen ist), sieht das wiefolgt aus: