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.
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).
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:
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:
Außerdem wollen wir ja den 2. Faktor zusätzlich zum Passwort verwenden, also muss auch
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.
Wenn dir diese Anleitung gefallen hat oder du Fragen bzw. Anmerkungen hast, freue ich mich über deinen Kommentar.