Artikelformat

„The key to the cloud“

Mit dieser Überschrift habe ich das ungetilte Interesse aller Buzzword-Freunde, aber für den Rest gibt es auch interessante Informationen. Ich möchte heute den Yubikey der Firma Yubico vorstellen. Es handelt sich dabei um ein OTP-Token, das man eigentlich an jedem Computer mit USB-Anschluß nutzen kann. Keine Treiber sind notwendig, aber der Nutzen ist – wie ich meine – enorm. Da ich von dieser Firma ja nicht gesponsort werde, ist die Hardware nur die Spielerei für eine simple PHP-Bibliothek, die man für eine Two-Factor-Authentication nutzen kann.

Die Hardware:
Der Yubikey ist ein kleiner USB-Stick, der ca 1cm x 2cm x 2mm groß bzw klein ist. Es gibt ein Loch, um den Key an einem Schlüsselbund zu befestigen. Kontakte für den USB-Anschluß und einen Knopf zur „Aktivierung“ gibt es auch. Der Yubikey erzeugt – und das ist die Hauptaufgabe – One-Time-Passwords. RSA-Tokens kennt man ja bereits von Ebay oder Paypal, aber dieser Stick arbeitet anders. Er gibt sich als Tastatur aus und durch tippen auf den Knopf, wird ein OTP „eingetippt“. Die Tastenkommandos kommen auch mit einer leichten Verzögerung, sodass das Betriebssystem damit klarkommt. Die Verzögerung ist aber so gering, dass die Zeichen sehr schnell auf dem Bildschirm erscheinen.
Wie man ja weiß, muss es bei einem OTP auch eine Gegenstelle geben, die überprüft, ob das Passwort gültig ist und ob es sich nicht um eine Wiederholung handelt. Jemand könnte das Passwort ja abfangen! Diese Gegenstelle ist der Yubico Server (bzw sind es afaik 5). Wenn man Yubico nicht traut, oder einfach nur einen Gegenstelle im lokalen Intranet benötigt, kann man diese Infrastruktur mit Java oder PHP nachbilden. Für beide Sprachen bietet Yubico OpenSource Server an. Dann muss man den Schlüssel aber umprogrammieren, was mit einem Windows und Macos Tool sehr einfach geht.
Der Yubikey ist preislich noch locker im „Kann man ruhig mal zum Spielen kaufen“-Rahmen, nämlich bei 25$, die RFID Version – mit der ich mich nicht weiter auseinander gesetzt habe – liegt bei 35$.

Funktionsweise:
Um den Yubikey zu nutzen, gibt es mehrere Arten. Ich beschreibe nun zwei, die ich ganz praktisch finde. Hierfür benötigt man immer eine Verbindung ins Internet – ist aber bei PHP-Seiten üblicherweise gegeben (ja, im Intranet nicht ;)). Methode 1 nutzt den KeyGenius-Server. Dieser ist eine Passwortablage. Jedes Passwort wird über den eindeutigen Key-Identifier und ein Zufallspasswort verschlüsselt, dass bei der Ablage einmalig erzeugt wird. Jeder Key hat somit eine eigene Verschlüsselung. Auf der Client Seite benötigt man im Browser Greasemonkey. Für dieses Plugin gibt es ein Javascript, dass die Passworteingabe auf der angesurften Seite sucht und durch eine eigene ersetzt. Man gibt nun sein Login ein und anstelle des herkömmlichen Passworts einen Yubikey-OTP. Das Greasemonkey Skript betreibt jetzt im Hintergrund viel Magie. Der Key wird an den Keygenius Server inkl. Adresse und Login geschickt, dieser validiert das OTP über den yubico Server und sendet das echte Passwort zurück, dieses wird im Passwortfeld eingesetzt und ein Submit des Login Formulars durchgeführt. Der Keygenius Server liegt auch im Quellcode vor, benötigt aber Symfony. Die eigentliche Logik zu extrahieren ist aber recht simpel, so kann man ein plain-PHP5 kompatible Version basteln.
Nun die Methode 2, die etwas spannender ist und die endlich als Überleitung zum heutige PHP-Source dient. Hierbei wird eine kleine Bibliothek genutzt, die man in seine eigene Applikation einbaut. Das übliche Login Formular wird angepasst. Hier kann man entweder dem Benutzer einen Key Identifier zuordnen und diesen sozusagen als Passwort nutzen. Oder man nutzt eine Two-Factor-Authentication und hat neben dem herkömmlichen Passwort Feld noch ein zweites Passwort Feld, dass ein OTP erwartet. Für welche Variante man sich entscheidet, benötigt man auf jeden Fall eine Bibliothek, um die Validierung des Yubikeys durchführen zu können. Die von Yubico angebotene ist in PHP4 geschrieben und das passt mir natürlich nicht. Eine Alternative ist die PHP5 Variante, die in Keygenius genutzt wird. Heute stelle ich eine 3. Möglichkeit vor. Eine simple PHPMonkeys-Yubico Validierungsbibliothek.

Die Validierungs-Lib:
Für die Validierung wird ein Webservice angefragt, der zu den gegebenen GET-Parametern eine einfache Seite zurückgibt, die einer Txt-Datei entspricht. In unserer simplen Variante wird eine ID, ein OTP und ein „Nonce“ benötigt. ID entspricht dem Api-Key, den man sich als Yubikey Besitzer gratis bei Yubico erstellen lassen kann. Hier bekommt man auch den Signature-Key (in Base64 codiert) – dazu später mehr. Das One-Time-Passwort ist selbstverständlich und der/die/das Nonce wird als zusätzliche Sicherheit benutzt, dass die Antwort auch zur Anfrage gehört, da dieser String vom Server einfach wieder zurückgegeben wird. Nun hört sich die ganze Geschichte recht unsicher an, aber dafür gibt es noch ein Hash-Parameter. Dabei handelt es sich um einen HMAC (Hash-based Message Authentication Code). Yubico nutzt hier einen HMAC-Sha1, das bedeutet, dass Sha1 für die Hashbildung genutzt wird. Die Nachricht, deren Echtheit man überprüfen will, ist der QueryString der GET Anfrage ohne den Hash (ist ja auch logisch). Man nutzt aber nicht einfach Sha1, weil man noch einen Signature-Key nutzen will. Dieser wird beim generieren der API-ID miterzeugt und ist das shared Secret, das sowohl bei Yubico, als auch beim Nutzer der Bibliothek bekannt ist. Der String wird in der Übertragung nirgends erwähnt und somit kann ein Angreifer die Nachricht nicht authentifizieren und somit auch nicht Parameter ändern. Weder in Richtung Server, noch vom Server zum Client.
Der Server baut sich nun aus den gegebenen Daten einen eigenen Hash und vergleicht diesen mit dem übermittelten, so kann man feststellen, wenn die Daten auf dem Weg („Man-in-the-middle“) manipuliert wurden. Der Server antwortet nun auf eine solche Anfrage mit einem Text, der aus Key-Value-Paaren besteht die durch ein Gleichheitszeichen getrennt sind. In jeder Zeile findet sich ein solches Paar. Als Antwort erhält man natürlich einen HMAC-Sha1. Dann gibt es den Status, die Nonce und ein Timestamp. Über den Timestamp kann man die Anfrage noch an ein Zeitfenster binden. Die simple Bibliothek, die ich vorstelle hat dieses Feature (noch) nicht. Als Client kann man diese Infos nun parsen, verschiedene Vergleiche anstellen und damit die Antwort des Servers bestätigen. Dieser sendet im Status Feld ein „OK“, falls alles passt. Beliebt, vor allem beim Testen, ist der REPLAYED_OTP Status. Dies tritt auf, wenn man den Key bereits erfolgreich validiert hat und es ein zweites mal versucht. Ist ja schließlich ein One-Time-Password. Andere Status kann man der Webservice API entnehmen. Es ist eigentlich jeder Fall abgedeckt.

Die kleine Bibliothek finde man hier oder wie immer auch im SVN. Dort gibt es auch ein kleines Beispiel, wie so ein Aufruf aussieht.

2 Kommentare

  1. Ich find den Exkurs zu der Thematik sehr interessant und ich gucke mir das Ganze vielleicht auch mal an.

    Wollte nur anmerken, der Name des Artikels klingt nicht soo super, weil ich dachte erst, der Artikel hat was mit Cloud Computing zu tun und das finde ich hier nicht wirklich so. Eher irgendwas mit Authentifizierung.

    Sonst echt schön, wenn auch teilweise schwer vorzustellen 🙂

    Antworten
    • Der Titel ist der Slogan des Herstellers zu dem Yubikey – von daher ist er schon okay 🙂

      Vielleicht sollte ich noch ein paar Bilder hinzufügen … ich denke mal darüber nach.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.