SSH: Zwei-Faktor-Authentifizierung mit Google Authenticator, FreeOTP, etc.

Auf vielen Webseiten oder auch zum Login für Spiele gibt es mittlerweile Zwei-Faktor-Authentifizierung. Auch in Firmen ist es oft üblich, dass der Zugang zum Intranet von außen möglich ist – aber nur mit Zwei-Faktor-Authentifizierung.
Warum sollte man also nicht auch SSH mit Zwei-Faktor-Authentifizierung sicherer machen?

Im folgenden werde ich ausführlich erklären, wie man SSH für Zwei-Faktor-Authentifizierung mit FreeOTP bzw. Google Authenticator (bzw. andere TOTP-Generatoren) einrichtet.

Voraussetzungen

  • Ich gehe davon aus, dass ihr schon einen installierten SSH-Daemon auf eurem System betreibt.
  • Ich nehme an, dass Pubkey-Authentifizierung für mindestens einen Nutzer eingerichtet ist
  • Außerdem erläutere ich die Einrichtung hier anhand eines Debian Wheezy (7.8) auf einem Raspberry Pi. Gleichermaßen oder ähnlich sollte die Einrichtung auch unter anderen System funktionieren.

Limitierungen

Vorab möchte ich ein paar Grenzen für diesen Artikel stecken. Wir wollen einrichten:

  • Login mit Passwort + Verifizierungs-Code oder als Alternative Login mit Pubkey
  • Login mit Pubkey + Verifizierungs-Code ist nicht vorgesehen, dies ist erst ab OpenSSH 6.2 möglich

Hintergrund ist, dass ich von Remote auf mein Raspi zu Hause verbinden möchte ohne meinen Key auf einem USB-Stick oder ähnlichem dabei haben zu müssen. Mein Handy habe ich aber sehr wohl dabei.

Einrichtung der Zwei-Faktor-Authentifizierung

1. Installation des PAM-Moduls: # apt-get install libpam-google-authenticator
Das Modul heißt zwar google-authenticator, aber funktioniert ebenso für FreeOTP.


google-authenticator output

2. Für jeden Nutzer der 2-Faktor-Authentifizierung benutzen können soll, muss als dieser Benutzer $ google-authenticator ausgeführt werden. Der generierte Code kann nun mit Hilfe der Handykamera abgescannt werden, in FreeOTP geht das z.B. über das QR-Code-Symbol (siehe Screenshot).


QR-Code scannen mit FreeOTP

3. Aktivieren des PAM-Moduls für SSH-Login:
# nano /etc/pam.d/sshd
Dort am besten ganz oben einfügen:
auth required pam_google_authenticator.so
Die Reihenfolge in der Datei bestimmt, ob zuerst der Verification Code (also das OTP) oder das Passwort abgefragt wird. Egal wie rum man es konfiguriert: Die zweite Eingabe wird unabhängig davon abgefragt, ob die erste richtig oder falsch war. Ein potenzieller Angreifer wird also nicht erfahren, ob sein eingegebener Code oder das Passwort richtig war, außer beide Eingaben sind korrekt (denn dann ist der Login ja erfolgreich).
Achtung: Da ich hier den Modus auf „required“ setze, können sich danach nur noch Benutzer anmelden, für die entweder ein zweiter Faktor oder aber Pubkey-Authentizierung eingerichtet ist. Sofern nur ein Nutzer auf dem System existiert, für den ihr SSH-Zugriff erlauben wollt, ist das kein Problem. Keinesfalls solltet ihr „required“ durch „optional“ ersetzen. Dann ist ein Login auch ohne zweiten Faktor, also ohne Google Authenticator bzw. FreeOTP möglich. Das gilt auch für Benutzer, die Zwei-Faktor-Authentifizierung eingerichtet haben, d.h. bei „optional“ genügt das richtige Passwort und ein beliebiger (falscher) Verifizierungscode.
Update: Um einen Login auch von Benutzern zu erlauben, die (noch) keine Zwei-Faktor-Authentifizierung eingerichtet haben, könnt ihr die Option „nullok“ angeben:

auth required pam_google_authenticator.so nullok

Achtung: Das funktioniert nur mit Versionen von libpam-google-authenticator die nach Dezember 2011 erstellt wurden. Auf einem RaspberryPi mit Debian Wheezy habt ihr somit Pech, denn hier erfährt man durch dpkg -l libpam-google-authenticator, dass die verwendete Version von April 2011 stammt.
Ebenso wird in /var/log/auth.log die Information auftauchen, dass „nullok“ eine unbekannte Option sei, falls ihr es doch versucht.

4. Aktivieren von Challenge-Respone-Authentifizierung für SSH:

# nano /etc/ssh/sshd_conf
ChallengeResponseAuthentication yes

Außerdem wollen wir ja den 2. Faktor zusätzlich zum Passwort verwenden, also muss auch

PasswordAuthentication yes

gesetzt sein.

Das Ergebnis

Wie oben erwähnt habe ich die Einstellungen sorum gewählt, dass zuerst der Verfication-Code abgefragt wird, den ich mit FreeOTP auf dem Handy generiere. Danach kommt die Abfrage des Benutzerpassworts. Das Ergebnis ist auf dem Bild zu sehen.
SSH Zwei-Faktor-Authentifizierung in Aktion

Wenn dir diese Anleitung gefallen hat oder du Fragen bzw. Anmerkungen hast, freue ich mich über deinen Kommentar.