Moritz Marquardt IT-Projekte zwischen Embedded & Web

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:

Quelle Titelbild: Yubico auf Vimeo

Nächster Beitrag Vorheriger Beitrag