SSH mit Zwei-Faktor-Authentifizierung

Auch wenn wir empfehlen, den SSH-Zugang mit Hilfe von Public Keys zu nutzen und standardmäßig auch gar kein Passwort für ihn vergeben (was natürlich nicht heißt, dass man sich dann ohne Passwort einloggen könnte, sondern vielmehr, dass man sich überhaupt nicht per Passwort einloggen kann), so wissen wir, dass nicht wenige User dennoch lieber Passwörter nutzen wollen. Dabei forcieren wir zwar schon eine gewisse Mindeststärke; es geht aber auch noch sicherer, nämlich mit Zwei-Faktor-Authentifizierung, die du optional mit deinem Account benutzen kannst.

In einem anderen Zusammenhang haben wir bereits einmal - zumindest oberflächlich - erläutert, mit welchen Methoden man sich normalerweise so authentifiziert, womit jetzt durchaus nicht nur Uberspaces gemeint sind: Auch an seinem Auto authentifiziert man sich schließlich als berechtigte Person, eben mit einem Autoschlüssel. Zur Auffrischung die drei üblichen Verfahren:

  1. Geheimes Wissen (z. B. ein Passwort)
  2. Besitz (z. B. ein Haustürschlüssel)
  3. Biometrie (körperliche Merkmale, die in der Regel nur schwer kopierbar oder fälschbar sind)

Als besonders sicher gelten dabei Verfahren, die wenigstens zwei Mechanismen miteinander verbinden. Public Keys erfüllen dies; jedenfalls dann, wenn der zugehörige Private Key verschlüsselt gespeichert wird. Bei Uberspace.de bieten wir dir aber noch eine zweite Möglichkeit, nämlich eine Anbindung an den Google Authenticator. Hierbei wird beim Login nicht nur das SSH-Passwort abgefragt, sondern zusätzlich ein dynamisch generierter Code, der sich alle 30 Sekunden ändert und der dir von einer App auf deinem Smartphone ausgegeben wird. Damit liegt dann auch hier eine Kombination aus geheimem Wissen (deinem SSH-Passwort) und Besitz (deinem codegenerierenden Smartphone) vor.

Direkt vorweg, um möglicher Paranoia vorzubeugen: Google ist lediglich der Herausgeber der Software. Weder ist ein Google-Account Voraussetzung für die Nutzung, noch werden irgendwelche Daten an Google übertragen. Die entsprechende App zur Code-Generierung ist auch nicht nur für Android, sondern auch für iOS und Blackberry verfügbar - mit offenem Quellcode.

Und so funktioniert's:

App installieren

Installiere zunächst die für deine Smartphone-Plattform passende App.

Account initialisieren

Melde dich dann per SSH an deinem Uberspace an, und gib dort den Befehl google-authenticator ein. Hierbei wird dann ein geheimer Schlüssel für dich generiert, der dir als QR-Code dargestellt wird, außerdem fünf „scratch codes“, mit denen du dich einloggen kannst, wenn dir dein Smartphone mal abhanden kommen sollte, und du kannst einige Konfigurationseinstellungen vornehmen. So sieht das aus:

[elise@argon ~]$ google-authenticator 
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/elise@argon.uberspace.de%3Fsecret%3DXXXXXXXXXXXXXXXX
[... riesiger QR-Code ...]
Your new secret key is: XXXXXXXXXXXXXXXX
Your verification code is 111111
Your emergency scratch codes are:
  11111111
  22222222
  33333333
  44444444
  55555555

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

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) n

Die erste Frage solltest du mit y beantworten, denn du willst ja die Zwei-Faktor-Authentifizierung aktivieren. Die zweite Frage kannst du ebenfalls mit y beantworten; sie verringert wie beschrieben das Risiko von Man-in-the-middle-Attacken. Die dritte Frage solltest du mit n beantworten können, weil sowohl dein Smartphone (via GSM) als auch unsere Hosts (via NTP) korrekte Uhrzeiten haben sollten. Die vierte Frage kannst du ebenfalls mit n beantworten, denn wir haben bereits unsererseits iptables-Regeln gegen SSH-Scan-Versuche.

Scratch Codes notieren

Die fünf angezeigten achtstelligen Scratch Codes solltest du dir irgendwo hinterlegen - in einer Datei, auf einem Zettel im Portemonnaie, … bewahre sie sicher, aber bedenke: Mit den Codes allein kann niemand etwas anfangen. Ein Angreifer müsste zunächst wissen, für welchen Account sie überhaupt gedacht sind, und er müsste zusätzlich ja immer noch dein SSH-Passwort kennen.

App initialisieren

Die App auf deinem Smartphone braucht nun den geheimen Schlüssel als Basis. Starte daher nun die App und konfiguriere sie auf den 16-stelligen Schlüssel. Das geht sehr bequem, in dem du den dargestellten QR-Code abfotografierst - er repräsentiert deinen Account mitsamt des geheimen Schlüssels. Danke an frubi für den Hinweis auf dieses nicht offiziell dokumentierte Feature des Google Authenticators!

Wenn das nicht funktionieren sollte, kannst du die direkt zu Beginn genannte URL in deinem Browser einfügst - sie generiert mittels Google Charts einen QR-Code, den du aus der App heraus abscannen kannst. Scytale weist aber zurecht darauf hin, dass Google in diesem Fall - via Google Charts - Kenntnis vom geheimen Schlüssel erlangt, was in der Tat nicht wirklich optimal ist, zumal in der URL ja außerdem noch der Accountname enthalten ist, um den es geht. Zum einen sollte es aber möglich sein, den Accountnamen in der URL zu anonymisieren (wichtig ist nur der geheime Schlüssel), so dass Google keine Zuordnung zu deinem Uberspace-Account kennen kann; zum anderen bringt der Code allein ja noch keinen Login - Google müsste zusätzlich auch noch dein SSH-Passwort kennen. Inwieweit du Google hier vertraust, dass sie den geheimen Schlüssel aus der URL nicht bei sich speichern, bleibt dir überlassen - im Zweifel übertrage ihn manuell in deine App.

Testen und benutzen

Das war's schon! Wenn du dich nun per SSH einloggst, wirst du zusätzlich zum Passwort noch nach einem Verification Code gefragt - das ist entsprechend der achtstellige Code, den dir dein Smartphone alle 30 Sekunden wechselnd anzeigt, oder eben einer der Scratch Codes, wenn dein Smartphone nicht verfügbar sein sollte. So sieht das aus:

[someuser@somehost ~]$ ssh elise@argon.uberspace.de
Verification code: 
Password: 
Last login: ...

Zwei-Faktor-Authentifizierung abstellen

Möchtest du die Zwei-Faktor-Authentifizierung nicht mehr nutzen? Kein Problem. Logge dich einfach per SSH ein (das muss noch mit einem dynamischen generierten Code oder einem von deiner Notfall-Liste passieren), und lösche dann die betreffende Konfigurationsdatei:

[elise@argon ~]$ rm -f ~/.google_authenticator

Das war's schon - ab sofort reicht dann wieder ein Passwort für den Login aus.

cool/twofactorauth.txt · Zuletzt geändert: 2011/08/07 17:16 von uber
Zuletzt angesehen: start cool twofactorauth
Recent changes RSS feed Driven by DokuWiki Valid XHTML 1.0 Valid CSS