Gute Passwörter sind schwer zu merken und aufwändig einzutippen. Das nimmt der USB-Stick Open Kubus bastelfreudigen Anwendern ab und implementiert zudem Einmalpasswörter.
Wenn es darum geht, einen Benutzer zu authentifizieren, nutzt das Gros der Linux-Anwender Passwörter. Die haben aber eine Reihe von Problemen: Denkt es sich der Benutzer aus, ist es oft zu kurz und lässt sich einfach erraten. Erzeugt es ein Zufallsgenerator, ist es so kompliziert, dass Benutzer es vergessen oder irgendwo notieren. Außerdem müssen Passwörter geheim bleiben, denn gerade in fremden Umgebungen drohen Keylogger oder neugierige Blicke über die Schulter. Einmalpasswörter lösen das Dilemma, sie sind nach einmaligem Gebrauch ungültig, sodass es nur wenig stört, wenn sie jemand abhört [1].
Einfach umzusetzen sind Kennwortlisten. Generatoren erzeugen Listen mit vielen Kennwörtern, hinterlegen eine Kopie auf dem Server, auf dem die Anwender sich authentifizieren sollen. Dazu tragen sie eine zweite Ausfertigung mit sich herum. Die meisten Banken sichern mit diesem TAN-Verfahren Überweisungen beim Onlinebanking.
Meldet sich der Anwender an, kann das System beispielsweise nach dem zehnten Passwort fragen. Wer die Kennwortliste besitzt, schaut das passende Passwort nach und authentifiziert sich so erfolgreich. Nachteil: Im Alltag erweist sich das Verfahren als unpraktisch. Benutzer müssen die Liste immer parat haben, sie bei jedem Anmeldevorgang rauskramen und das Passwort mühevoll abtippen. Außerdem darf niemand sonst die Liste zu Gesicht bekommen.
Gehirn zum Herumtragen
Praktischer wäre es, die Kennwörter dynamisch zu generieren. Software, die direkt auf dem PC läuft, kommt dafür nicht in Frage, wenn das System portabel sein soll. Zudem lässt sich diese Passwortliste beliebig kopieren – niemand hätte also etwas gewonnen. Daher liegt es nahe, dass externe Hardware-Token das jeweils gültige Passwort generieren. Das ist die Idee von Open Kubus.
Auf Grundlage der Hardwareplattform USBprog entstand dafür in einem früheren Artikel des Linux-Magazins ein universeller Programmieradapter [2]. Als Mikrocontroller kommt der weitverbreitete ATMega32 zum Einsatz. Er ist kostengünstig und es gibt für ihn eine Vielzahl freier Entwickleranwendungen. Ein weiterer Baustein, der USBN9604, ermöglicht den Zugriff auf USB. Diese Variante lässt sich nachbauen und durch einen Taster erweitern (siehe Abbildung 1). Platine, Bestückungsliste und Schaltplan bietet das Projekt unter der GPLv2 zum Download an [3].

Abbildung 1: Eine Variante des Projekts nutzt den Adapter USBprog und erweitert ihn um einen Taster. Damit lösen die Anwender das Übertragen des Passworts aus.
Da heute praktisch jeder Rechner eine USB-Schnittstelle besitzt, lässt sich der Stick fast überall verwenden. Er präsentiert sich dem Computer als USB-Tastatur, zu dem viele Betriebssysteme schon Treiber mitbringen. Drückt der Anwender den Taster, veranlasst dies den Stick dazu, ein Kennwort auszugeben, das sich nach dem in Abbildung 2 dargestellten Verfahren berechnet.

Abbildung 2: Das jeweilige Einmalpasswort berechnet das Token aus dem Datenblock und der Laufnummer. Beides verschlüsselt es mittels AES und kodiert es ähnlich zu Base-64.
Das Open-Kubus-Team hat zusätzlich eine zweite, funktional gleichwertige Schaltung entwickelt (siehe Abbildung 3). Sie passt in ein noch kleineres Gehäuse und besteht aus viel weniger Teilen. Als Mikrocontroller kommt ein Atmega16u4 zum Einsatz, ein Atmega16 mit integriertem USB-Controller. Damit entfällt der Baustein für einen externen USB-Controller. Außerdem befinden sich noch eine LED und ein Taster auf dem Stick. Wegen der komplexen Mehrlagen-Platine bietet das Projekt diese Hardware fertig im Internet an [4].

Abbildung 3: Wer nicht löten will, kauft Open Kubus fertig mit Gehäuse. Diese Version integriert den USB-Treiber im Mikrocontroller Atmega16u4.
Das auf dem Stick laufende Programm verwendet jeweils einen 14 Byte langen Datenblock aus entweder zufälligen Zeichen oder einer Stick-ID. Vor ihn hängt der Mikrocontroller eine 2 Byte lange Laufnummer. Drückt ein Benutzer den Taster, hängt er Laufnummer und Datenblock zusammen und verschlüsselt beides mit einem ebenfalls auf dem Stick gespeicherten 256-Bit-Schlüssel. Die drei Angaben speichert ein EEPROM, das sich auf dem Controllerchip befindet.
Als letzten Schritt wandelt Open Kubus die 16 Byte des verschlüsselten Onetime-Passworts in druck- beziehungsweise tippbare Zeichen und schickt sie an den USB-Tastaturtreiber (siehe Abbildung 2). Da der Stick nicht weiß, welche Tastaturvariante im angeschlossenen Rechner aktiv ist, sendet er vor dem Pad den Keycode für ein »y«, um zwischen deutschen und englische Layouts zu unterscheiden.
Einlass gewähren
Um eine Anmeldung zu überprüfen, müssen der Gegenstelle ebenfalls Datenblock, AES-Schlüssel und eine Laufnummer bekannt sein. Sie wandelt die Tastatureingabe wieder in die 16 Byte des Onetime-Passworts um und entschlüsselt es mit dem symmetrischen AES-Schlüssel. Die ersten zwei entschlüsselten Oktette müssen einen höheren als den im Server gespeicherten Wert haben – so erkennt das Verfahren Replay-Attacken. Aus diesem Grunde müssen Server die Laufnummer untereinander synchronisieren, falls sich Open Kubus gegen mehrere Geräten authentifiziert. Sowohl Server und Stick erhöhen nun die Laufnummer. Spätestens nach 65536 Anwendungen verweigert der Server jedoch weitere Anmeldungen, weil die aktuelle Firmware danach einen Wrap-Around macht.
Als Kryptopgraphie-Bibliothek nutzt Open Kubus auf dem Stick die AVR-Crypto-Lib, die viele kryptopgraphische Funktionen für Atmel-Mikroprozessoren bereits anbietet [5]. Sie berücksichtigt dabei die knappen Ressourcen an Flash- und Arbeitsspeicher. Die große Zahl unterstützter Algorithmen ermöglicht dem experimentierfreudigen Anwender auch andere Kryptoverfahren. Änderungen wie eine andere Handhabung des Wrap-Around oder ein Bit-Shift des Datenblocks in Abhängigkeit zur Laufnummer wären ebenfalls denkbar.
Scharf machen
Ist die Hardware zusammengelötet oder per Post angekommen, gilt es, die Firmware zu übersetzen und auf das Gerät zu übertragen. Käufer der zweiten Variante (siehe Abbildung 4) dürfen diesen Schritt auch überspringen – dort ist die Software schon aufgespielt. Durch
svn checkout http://openkubus.googlecode.com/svn/trunk/ openkubus-read-only
holt sich der Entwickler einen aktuellen Snapshot auf den eigenen Rechner [6]. Zusätzlich benötigt er noch die Pakete »gcc-avr« und »binutils-avr« für den AVR-GCC-Crosscompiler [7]. Das Paket »avrdude« enthält Tools, um die Firmware zu übertragen. Alle Pakete sind in den Debian-Repositories enthalten, bei einigen anderen Distributionen gilt es, sie selbst zu übersetzen.
Die meisten Unterverzeichnisse haben eigenständige Makefiles: Die Firmware setzt die Kryptofunktionen voraus und »make« im Verzeichnis »firmware/crypto-lib/« baut sie. Wer die USBprog-Variante nutzt, übersetzt die eigentliche Firmware im Verzeichnis »firmware/secstick_v1/«. Für die zweite Hardwareversion von Open Kubus wechselt der Anwender in den Ordner »firmware/secstick_v2/«. Das fertige Firmware-Image »openkubus.hex« überträgt er danach mit »avrdude« und einem Programmer wie USBprog in den Flashspeicher des Mikrocontrollers. Alternativ überträgt auch ein Atmel MkII die Software, denn zu diesem Zeitpunkt lässt sich der USB-Port noch nicht nutzen.

Abbildung 4: Die neue Open-Kubus-Version kommt mit einem Atmega16u4 aus, der auch den USB ansteuert.
Geladen und gesichert
Open Kubus ist nun bereit, kennt aber noch keine Geheimnisse. Das Tool »stick-write« aus »firmware/create-stick« lädt die drei relevanten Informationen in das EEPROM. Da es gegenwärtig noch keine fertige Software zum Vorbereiten des Sticks gibt, ist etwas Handarbeit angesagt: Die Option »-p« erwartet 48 Zeichen, nämlich 32 Byte AES-Schlüssel, 14 Zeichen Datenblock und zwei Oktette der ersten Laufnummer, ohne irgendwelche Feldtrenner.
Das Tool überträgt die Kommandozeilenargumente per USB ohne weitere Wandlung an den Stick. Wer also Binärwerte übertragen will, sollte den Quelltext anpassen. Die Option »-l« sorgt dafür, dass die Firmware keine weiteren Initialpasswörter mehr annimmt. Vollständig lässt sich der Stick mit dem Programmer dichtmachen, dann akzeptiert er allerdings auch keine Firmware-Updates mehr.
Heirat mit PAM
Die meisten Linux-Distributionen verwenden PAM, um Benutzer zu authentifizieren. So lassen sich Programmen wie »login« oder »sshd«« neue Methoden zur Authentifizierung beibringen. Open Kubus bringt sein eigenes Modul im Verzeichnis »software/PAM/« mit. Es benötigt die PAM-Entwicklungsdateien aus »libpam0g-dev«. Der Aufruf von »make install« kopiert es dann ins Verzeichnis »/lib/security/« und passt seine Rechte an. Nach der Installation konfiguriert der Systemverwalter die Module in »/etc/pam.conf« oder im Ordner »/etc/pam.d/«. Trägt er oben in »auth-common«
auth sufficient pam_openkubus.so
ein, akzeptiert PAM künftig alternativ auch den Stick [8].
Passwörter prüfen
Um die Authentizität zu überprüfen, muss das PAM-Modul die Geheimnisse des Sticks kennen. Dazu speichert der Admin für jeden Nutzer eine Zeile im Format »Benutzer Passwort Offset Laufnummer« in »/etc/openkubus-passwd«. Mit den Daten gleicht PAM die Eingaben vom Stick ab. Darum darf die Datei auch nur für Root lesbar sein.
Wer die Eingaben von Open Kubus in eigenen Anwendungen ohne PAM prüfen will, greift zur schlanken Open-Kubus-Bibliothek, die das Projekt für viele Programmiersprachen anbietet. Die Bibliothek selbst ist in C geschrieben, aber der Wrapper SWIG sorgt dafür, dass auch Python, Ruby, Java, Perl oder PHP Zugriff auf ihre Funktionen erhalten [9]. Zurzeit besteht das API nur aus der Funktion:
int openkubus_authenticate(const char *pad,
const char *pw, int offset, int num);
Als erstes Argument erwartet sie das zu prüfende Einmalkennwort, als zweites den AES-Schlüssel. Die beiden letzten Argumente sind ein optionaler Offset der Laufnummer (normalerweise 0) und sie selbst. Bei Erfolg gibt die Funktion die Laufnummer wieder zurück, bei Fehlern einen negativen Wert.
Die Bibliothek prüft nur das Passwort, greift aber auf keine Datei zu. Entwickler, die Open Kubus verwenden, müssen selbst die aktuelle Laufnummer, das Initialpasswort sowie den Offset verwalten. Wie das gehen könnte, zeigt der exemplarische Netzwerk-Server aus »software/server/«, der die Einmalkennwörter mit einer Liste abgleicht.
Details in der Diskussion
Die Vorteile von Open Kubus sind Portabilität und Anpassbarkeit bei geringen Kosten für die Hardware. Nachteilig ist, dass Stick und jeder Server die Laufnummer halten müssen. Wer auf mehreren Rechnern authentifizieren will, braucht einen zentralen Server. Werkzeuge, um Open Kubus in größeren Umgebungen für mehrere Benutzer zu verwalten, sind erst im Ansatz vorhanden. Einige Einzelheiten im Ablauf wie der Wrap-Around bei der Laufnummer, der sich nur geringfügig ändernde Input zwischen einzelnen Sequenzen oder die Kryptoverfahren diskutiert das Projekt noch.
Vor einem Man-in-the-Middle-Angriff schützt Open Kubus nicht. Die Authentizität muss der aufgerufene Dienst gesondert nachweisen. Für experimentierfreudige Admins stellt das Projekt jedoch eine spannende Plattform dar.
|
Infos |
|---|
|
[1] Udo Seidel, “PAM und Einmalpasswörter”: Linux-Magazin 07/08, S. 34 [2] Benedikt Sauter, “USBprog-Adapter”: Linux-Magazin 03/08, S. 82 [3] Schaltplan USBprog: [http://www.embedded-projects.net/usbprog] [4] Shop für Open-Kubus-Hardware:[http://shop.embedded-projects.net] [5] AVR-Crypto-Lib:[http://das-labor.org/wiki/Crypto-avr-lib] [6] Open Kubus:[http://code.google.com/p/openkubus] [7] Installationshinweise zu Avr-GCC:[http://www.nongnu.org/avr-libc/user-manual/install_tools.html] [8] PAM-Konfigurationssyntax: [http://kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-configuration-file.html] [9] Wrapper Generator SWIG: [http://siwg.org] |
|
Die Autoren |
|---|
|
Benedikt Sauter und Michael Hartmann interessieren sich für Open Source und Hardware-Basteleien. Sie arbeiten im Open-Kubus-Projekt mit. Beruflich passen sie die eingebetteten Geräte an spezielle Kundenanforderungen an. |





