Ich habe vor ein paar Tagen mit dem Artikel „Google macht SSHD sicher“ über einen Artikel aus meinem Feedreader berichtet. Nun habe ich das ganze selbst ausgetestet und bin begeistert.
The Google Authenticator project includes implementations of one-time passcode generators for several mobile platforms, as well as a pluggable authentication module (PAM). One-time passcodes are generated using open standards developed by the Initiative for Open Authentication (OATH) (which is unrelated to OAuth).
These implementations support the HMAC-Based One-time Password (HOTP) algorithm specified in RFC 4226 and the Time-based One-time Password (TOTP) algorithm currently in draft.
Vorab zur Information:
– In den Sourcen des Modules für PAM gibt es keinerlei Kontaktaufnahme zu einem Google-Server
– Der einzige Aufruf befindet sich in der Datei ./google-authenticator.c um einen QR-Code zu generieren, dazu später mehr
– Die Androidapp nimmt kein Kontakt in das Netz auf, das einzige was sie möchte ist vibrieren.
– Wenn kein Zugang zu dem Smartphone besteht hat man noch Emergency Scratchcodes.
– Die Software ist eine Erweiterung der Sicherheit des sshd und es sollte nicht sonst ein passwortloser Login erlaubt werden
Ich gehe davon aus, dass der openssh-server und Compiler installiert sind.
root@xbmc:~/# mkcd ga
root@xbmc:~/ga# aptitude install mercurial libpam0g-dev -y
root@xbmc:~/ga# hg clone google-authenticator
cd google-authenticator/libpam/
root@xbmc:~/ga/google-authenticator/libpam# make
root@xbmc:~/ga/google-authenticator/libpam# make install
cp pam_google_authenticator.so /lib/security
cp google-authenticator /usr/local/bin
sudo chmod 755 /lib/security/pam_google_authenticator.so
/usr/local/bin/google-authenticator
Da wir uns nicht als root per ssh anmelden, so etwas gehört sich nicht, nehmen wir substitude user und wechseln den Account zur generieren des Codes:
root@xbmc:~/ga/google-authenticator/libpam# su seraphyn
seraphyn@xbmc:/root/ga/google-authenticator/libpam$ google-authenticator
https://www.google.com/chart?chs=200x200&chld=ETCETCETCETC
Your new secret key is: BLABLABLABLA
Your verification code is NUMBERSNUMBERSNUMBERS
Your emergency scratch codes are:
MORENUMBERS
Do you want me to update your "~/.google_authenticator" file (y/n) y
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y
seraphyn@xbmc:/root/ga/google-authenticator/libpam$ exit
Nicht vergessen die ganze Ausgabe abzuspeichern, denn die URL und vor allen die Codes werden später noch gebraucht.
Ich gehe nicht davon aus, dass auf einem Server eine GUI ist.
Jetzt müssen nur noch der SSH-Server und PAM konfiguriert werden um Google Authentication zu nutzen.
In der Datei /etc/pam.d/sshd muss noch pam_google_authenticator.so hinzugefügt werden:
# /etc/default/locale, so read that as well.
auth required pam_env.so envfile=/etc/default/locale
auth required pam_google_authenticator.so
und in der Datei /etc/ssh/sshd_config das Challenge-Response-Verfahren aktiviert werden:
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
Nach der Installation von Google Authenticator auf Android startet man diesen.
Wenn man die aus der Shell generiert URL in seinem Desktopbrowser aufruft bekommt man einen QR-Code, welcher mit dem auf Android installiertem Google Authenticator per Menü > Scan account barcode ausgelesen wird.
Der 6stellige Code generiert sich alle 30 Sekunden neu und man kann in Ruhe die App auflassen und sich davon überzeugen ツ
Auf der Maschine die nun pam-google-authenticator nutzt kann der SSH-Server neu gestartet werden.
Beim erneuten Einloggen erscheint nun:
Verification code:
Password:
Als erstes soll man den auf dem Smartphone angegebenen Code eingeben, danach das normale Passwort.
Wenn nun das Smartphone nicht vorhanden ist, dann kann einer der 6 emergency scratch codes genommen werden.
Achtung: Falls der User keinen generierten Schlüssel in seinem $HOME hat (.google_authenticator) wird dieser nicht der Zweistufenauthenifizierung unterzogen.