Facebook
Twitter
Google+
Kommentare
0

2-Faktor-Authentifizierung mit dem Google Authenticator

Viele größere Webdienste bieten mittlerweile die 2-Faktor-Authentifizierung an, PayPal, Amazon, Facebook und nicht zuletzt Google. Mit der 2-Faktor-Authentifizierung muss neben dem Benutzernamen und Passwort auch noch ein Einmal-Passwort, ein sogenanntes One-Time-Token eingegeben werden, das von einem Gerät unabhängig vom PC generiert wird und nur einmal gültig ist. Sollte es also jemand schaffen und das Passwort erraten oder mitschneiden, hilft es dem Angreifer wenig denn er muss auch noch Zugriff auf das Hardwaregerät bekommen, und das sollte schwierig sein.

Die Generierung von solchen Codes ist nicht sonderlich schwer, beide Parteien (das Gerät und die Webseite) müssen nur ein gemeinsames “shared secret” kennen (auch Seed genannt), und aufbauend auf diesem dann sich immer ändernde Codes generieren können. Dazu gibt es RFCs, beispielsweise RFC 4226.

Ich habe ja bereits letztes Jahr den Yubikey vorgestellt, heute möchte ich den Google Authenticator vorstellen und zeigen wie man seine eigene Webseite um diesen 2-Faktor-Login erweitern kann mittels PHP.

Der Google Authenticator ist als App für Handys konzipiert, man muss also keine Hardware kaufen sondern einfach nur ein App installieren, den Google Authenticator gibt es für Android, IPhone/iPad, Blackberry und weiteren Plattformen. Es gibt auch Umsetzungen für Windows, Java und Palm OS. Es ist Open Source.

Die Installation des Google Authenticators ist denkbar einfach und kann bei Google nachgelesen werden. Normalerweise geht das ganz einfach über den Market/AppStore.

Es gibt schon einige Umsetzungen in PHP da draußen, aber ich wollte meine eigene haben ;-) . Und habe mir eine Klasse gebaut (GoogleAuthenticator auf Github) die alles kann was ich brauche:

  1. Ein neues Secret generieren
  2. Den aktuellen Code errechnen für ein gegebenes Secret
  3. Einen Code gegenchecken für ein gegebenes Secret (inklusive variabler Zeit-Abweichungs-Toleranz)
  4. Eine QR-Code-URL zurückgeben für ein QR-Code-Bild für ein gegebenes Secret
You need cURL installed to use GitHub_Code_Viewer

Die Webseite generiert nun also auf Anfrage ein Secret für einen Kunden, speichert dieses in einer Datenbank, und präsentiert dem Kunden dann entweder direkt das Secret das er dann abtippen muss, oder zeigen ihm den QR-Code der das Secret beinhaltet. Dieser QR-Code kann mit dem Google Authenticator bequem eingescannt werden, und schon werden auf dem Handy Codes angezeigt.

Die Webseite muss nun natürlich für einen aktivierten Benutzer noch ein weiteres Formular(feld) beim Login anzeigen in den ein gültiger Code einzugeben ist. Wenn dieser gültig war muss er unbedingt gespeichert werden und darf nicht erneut genutzt werden, denn sonst könnte ihn ein Mithörer in den nächsten Sekunden nutzen und sich damit auch anmelden. Nach einigen Minuten (je nach Einstellung der Toleranzgrenze) können diese alten benutzten Codes gelöscht werden.

Secret/Seed: OQB6ZZGYHCPSX4AK

Je nach Sicherheitslevel muss der Code bei jedem Login eingegeben werden, oder es wird ein Cookie gespeichert sodass nur alle X Tage der Code eingegeben werden muss. Auf einem neuen PC oder in einem anderen Browser wird der Code natürlich anfangs wieder benötigt. Je nachdem wie sicher bzw. bequem man es haben möchte.
Man kann das ganze optional anbieten, sodass nur Benutzer die es eingerichtet haben, nutzen können, oder verpflichtend für alle Benutzer einfordern. Auch hier ist das abhängig von der Sicherheitsstrategie der Seite/Firma.

Mögliche Fallstricke bzw. wichtige Dinge an die man denken sollte:

  1. Wichtig bei der Umsetzung des Google Authenticators ist die Zeitsynchronisierung. die Uhren von Server und Client dürfen nicht allzuweit auseinander liegen, sonst schlägt die AUthentifizierung immer fehl. Aus diesem Grund sollte man nicht nur die standardmäßig erlaubten 30 Sekunden Toleranz bieten sondern eventuell 1:30 oder 4:00 Minuten. Dazu berechnet der Server einfach die vorherigen und nächsten Codes und nimmt diese alle zum Vergleich.
  2. Wie oben bereits geschrieben müssen Replay-Attacken vermieden werden. Einmal benutzte Codes müssen also für den Benutzer auf eine Blacklist, sodass sie in den nächsten Minuten nicht nochmals verwendet werden können.
  3. Allgemein gilt natürlich auch hier ein Schutz gegen Brute-Force. Falls man 6 Zeichen Länge nimmt wie Google sind das nicht allzuviele Möglichkeiten die man durchprobieren müsste. Man muss also zwingend die Versuche pro Minute begrenzen.
  4. Falls das Handy verloren geht oder gestohlen wird, sollte man natürlich trotzdem noch eine Möglichkeit haben sich in den Account einzuloggen und das Secret zu widerrufen. Dazu kann man entweder ein zweites Mal auf einem Ersatzhandy den Google Authenticator einrichten, oder andere Wege wie Notfall-Codes festlegen, das Handy eines Freundes angeben um sich per SMS ein neues Passwort zuschicken zu lassen, oder oder.

Eine interessante Seite um etwas mit dem Secret, dem QR-Code und dem Code herumzuspielen ist diese Javascript-Umsetzung.

Für WordPress gibt es ein Plugin für die Google Authenticator Unterstützung, ich nehme an dass es für die (anderen) großen CMS etc. auch welche gibt.

Ähnliche Artikel:

  1. Mit Wetterdaten arbeiten: Google Weather API
  2. Google’s Cloud kostenlos als CDN nutzen
  3. Verteiltes Rechnen mit Javascript und Google Gears
Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen