8.4.2. Einmal-Paßwort-Systeme

Leslie Lamport hat 1981 in seinem Artikel Password Authentication with Insecure Communication ein interessantes Schema für ein Einmal-Paßwort-System (one-time password system) vorgestellt. Es gestattet einem Nutzer, sich gegenüber einer Maschine durch genau einmal gültige Paßwörter (one-time passwords) zu authentifizieren, wodurch Replay-Attacken verhindert werden. Ein Mithören des zwischen beiden Partnern geführten Dialogs bzw. das Auslesen der auf dem Computer gehaltenen Paßwort-Datenbasis stellt keine Gefahr dar, da der Angreifer daraus nicht auf künftig gültige Einmal-Paßwörter schließen kann.

Das Verfahren basiert nicht auf Public-Key-Kryptographie, sondern auf einer Einweg-Hashfunktion. Die Idee wurde in verschiedenen praktischen Implementierungen umgesetzt. Dazu gehören S/Key von Bellcore (RFC 1760: The S/KEY One-Time Password System), NRL OPIE sowie das Logdaemon-Paket von Wietse Venema, die alle kostenfrei verteilt werden und die man von vielen FTP-Servern beziehen kann, z.B.

Für den praktischen Einsatz empfehlen wir NRL OPIE, da es sich hierbei um ein recht gut gepflegtes, auf einer Vielzahl von Plattformen sehr einfach installierbares Paket handelt.

Der RFC 2289 (A One-Time Password System) beschreibt ein auf Einmal-Paßwörtern beruhendes Authentifizierungssystem, kurz OTP genannt, das eine Weiterentwicklung von S/Key darstellt und sich auf dem Weg der Standardisierung befindet.

Die einzelnen Systeme nutzen verschiedene Einweg-Hashfunktionen:

S/Key: MD4
NRL OPIE: MD5 als Default, MD4 wird aus Kompatibilitätsgründen unterstützt. Das konkret genutzte Verfahren wird bei der Übersetzung der Quelltexte festgelegt.
Logdaemon: MD4 als Default (aus Kompatibilitätsgründen), MD5 wird unterstützt. Das konkret genutzte Verfahren wird bei der Übersetzung der Quelltexte festgelegt.
OTP: MD5 ist obligatorisch, SHA-1 sollte und MD4 kann unterstützt werden

Lamports Grundkonzept ist recht einfach. Der Nutzer merkt sich ein frei von ihm wählbares Paßwort. Dieses muß nirgendwo auf einem Computer permanent gespeichert und niemals über das Netz übertragen werden. Der Server verwaltet eine Datenbasis, die pro Nutzer folgende Informationen enthält:

Wenn nun Nutzerin Berta dem Server Anton ihre Identität beweisen möchte, so sendet sie (bzw. der von ihr genutzte Klienten-Rechner) ihren Namen zu Anton. Darauf antwortet dieser mit einer Challenge, die aus der Zahl n-1 besteht. Als Response berechnet Bertas Computer den Wert hashn-1(Paßwort) und überträgt diesen zum Server.

Anton wendet darauf genau einmal die Einweg-Hashfunktion an und vergleicht das entstehende Resultat mit dem in der Datenbank gespeicherten Wert. Falls beide übereinstimmen, betrachtet Anton die Antwort als gültig, trägt sie, d.h. hashn-1(Paßwort), an Stelle des alten Wertes hashn(Paßwort) in die Datenbasis ein, ersetzt dort außerdem n gegen n-1 und gewährt Berta den Zugang zum System.

Grafisch stellt sich das so dar:

Die Sicherheit des Verfahrens beruht darauf, daß jedes auf dem Netz übertragene Paßwort nur einmal gilt und sich die Einweg-Hashfunktion nicht invertieren läßt, so daß jemand, der ein gerade erfolgreich genutztes Einmal-Paßwort hashn(Paßwort) abgelauscht hat, nicht auf das nächste gültige Einmal-Paßwort, also hashn-1(Paßwort), schließen kann.

Über die Beschränkungen dieses Verfahrens sollte man sich im klaren sein:

Wenn die Zahl n den Wert 1 erreicht hat, ist eine neue Folge von Einmal-Paßwörtern zu initialisieren. Dies sollte nach Möglichkeit entweder lokal am Server oder über einen sicheren Kanal (z.B. per Secure Shell) geschehen, um nicht den neu in die Datenbasis einzutragenden Hashwert offen übertragen zu müssen (was bei passiven Attacken natürlich keine Gefahr darstellt).


Frage 8.4.2.1:

S/Key, NRL OPIE, Logdaemon und OTP verwenden zusätzlich zum Paßwort einen als Seed bezeichneten Wert. Welche Vorteile ergeben sich daraus?


Einmal-Paßwörter werden speziell dann gern genutzt, wenn sich jemand von einer ihm fremden Maschine aus (z.B. während einer Tagung) auf einem Computer zu Hause anmelden möchte. Für diesen Fall führen die Anwender gewöhnlich einen Zettel mit sich, auf dem eine (hoffentlich) ausreichende Anzahl der nächsten gültigen Einmal-Paßwörter steht, die bereits in der lokalen Umgebung vorausberechnet worden sind. Auf diese Weise muß man nirgendwo sein geheimes Paßwort eingeben, aus dem die Einmal-Paßwörter gebildet werden. Außerdem wird keine spezielle Software benötigt. So genügt beispielsweise ein normaler Telnet-Klient.

Sobald man einen Eintrag von seiner Liste verwendet hat, sollte man ihn abstreichen, um immer zu wissen, welches Einmal-Paßwort als nächstes aktuell ist. Würde man nämlich immer mit der zur empfangenen Challenge gehörenden Response antworten, ist das System anfällig gegen eine relativ einfach zu realisierende aktive Attacke, bei der ein Angreifer die Zahl n der Anfrage gezielt gegen eine kleinere Zahl ersetzt und anschließend die vom Nutzer gesendete Antwort mißbraucht.


Frage 8.4.2.2:

Wie kann der Angreifer die Response mißbrauchen? Weshalb gelingt dies nicht, sofern der Anwender stets nur das nächste noch nicht genutzte Einmal-Paßwort seiner Liste verwendet?


Es kann sogar von Vorteil sein, daß die Authentifizierung auf einer Hashfunktion beruht und keine Verschlüsselung unterstützt wird, da der Einsatz starker Chiffren in vielen Ländern verschiedenen juristischen Restriktionen unterliegt, die für Hashfunktionen nicht zutreffen.

Einmal-Paßwörter sind selbst dann sinnvoll, wenn der fremde Computer verschlüsselte Verbindungen unterstützt (z.B. durch IP-Security oder Secure Shell), da man in der Regel keinen Grund hat, diesem System bzw. seinem Administrator zu vertrauen.

Führt der Anwender dagegen einen privaten, nur von ihm selbst verwalteten Computer mit sich, liegt keine prinzipiell andere Situation als zu Hause vor. Unterstellt man eine sehr sachkundige, sicherheitsbewußte und regelmäßige Administration des Systems, so drohen Gefahren fast ausschließlich aus dem Netz, wobei sich natürlich Schwachstellen des eigenen Systems nie vollständig ausschließen lassen. In diesem Fall empfiehlt sich (sofern zulässig) der Einsatz von lokal installierten Werkzeugen, die eine zuverlässige gegenseitige Authentifizierung und vor allem eine Verschlüsselung des kompletten Datenstroms ermöglichen und so den Bedrohungen von außen gut begegnen können.

Schauen wir uns abschließend noch ein praktisches Beispiel an, in dem das System S/Key verwendet wird. Die Datenbasis auf Server Anton, gehalten in der Datei /etc/skeykeys, sieht so aus:

root 9998 an57047   b353051a8ee8374b  Feb 15,1997 17:00:43
berta 9997 an56047   135d25d9c3611b42  Feb 15,1997 17:52:05
Momentan sind zwei Nutzer eingetragen: der Super-User root sowie Berta. Pro Eintrag finden wir folgende Felder:

Bei einem Login mit Telnet auf dem Server Anton erscheint beim Klienten die aus der Zahl n-1 sowie dem Seed bestehende Challenge, die Berta mit der Response beantwortet:

login: berta
[s/key 9996 an56047]
Response: NEED TUFT CAFE BUNT ABET BELL
Wir sehen, daß zur externen Repräsentation des Einmal-Paßworts 6 kurze Wörter (mit je 1 bis 4 Buchstaben) verwendet werden. Diese stammen aus einem öffentlich bekannten Wörterbuch (s. RFC 1760).

Zur Berechnung der Antworten steht das Werkzeug key zur Verfügung, dem man die Zahl n-1 sowie den Seed der Challenge übergibt. Es erfragt das geheime Paßwort und gibt das entstprechende Einmal-Paßwort aus:

key 9996 an56047
Enter secret password: 

NEED TUFT CAFE BUNT ABET BELL
Natürlich sollte man key nur in einer sicheren Umgebung ausführen, um zu vermeiden, daß das geheime Paßwort in falsche Hände gelangt.


Vertiefung:

Sofern Sie über eine UNIX-Maschine verfügen, auf der Sie Superuser-Rechte haben, sollten Sie eine der oben angegebenen Implementierungen (S/Key, NRL OPIE, Logdaemon) beschaffen, generieren, (zumindest partiell) auf Ihrem System installieren und anschließend zum Login verwenden. In der Regel wird dazu das bisherige Login-Programm (meist /bin/login) gegen die in dem gewählten Paket enthaltene Version ausgetauscht (das Original aber bitte aufbewahren).

Sobald Sie die benötigte Datenbasis mit einem dazu bereitgestellten Werkzeug angelegt haben, sollten Sie sich per Telnet unter Verwendung der Einmal-Paßwörter auf Ihrem System anmelden können. Dazu ist keine Netzverbindung erforderlich, da das Loopback-Interface für ein Login auf der lokalen Maschine vollkommen ausreicht. Neben dem Login-Programm gibt es je nach Paket weitere Werkzeuge, die eine Authentifizierung über Einmal-Paßwörter gestatten, z.B. ein FTP-Server, eine Shell sowie das Kommando su (substitute user).

Da die genannten Pakete nur C-Quelltexte, aber keine fertigen Maschinenprogramme enthalten, benötigen Sie einen C-Compiler sowie einige Zusatzwerkzeuge (z.B. make), um die benötigten Binaries selbst aus den Quellen generieren zu können. Mitunter machen sich auch kleinere Anpassungen im Makefile oder in den Header-Dateien erforderlich. Die Spezifika sind den beigelegten Dokumentationen zu entnehmen. In der Regel beginnt man mit dem Lesen der README-Dateien.

Sollten Sie keine Lust oder Möglichkeit haben, selbst ein solches System zu installieren, empfehlen wir Ihnen einen Test auf den öffentlichen Solaris- und Linux-Maschinen des URZ der TU Chemnitz. Dort ist das System S/Key verfügbar. Sie können sich mit dem Werkzeug keyinit einen Eintrag in /etc/skeykeys anlegen und nachfolgend die Einmal-Paßwörter beim Login sowie mit den Kommandos keysh und keysu nutzen. Für alle genannten Programme existieren Online-Manuals (z.B. man keyinit).

Die folgende Tabelle nennt kurz die wichtigsten Komponenten der S/Key-Distribution:

key Werkzeug zur Berechnung einer Response (eines Einmal-Paßwortes) aus der Challenge des Servers
keyinit Werkzeug zur (Re)initialisierung einer Sequenz von Einmal-Paßwörtern und damit zur Administration der S/Key-Datenbasis des Servers
keysh Shell, die beim Start eine S/Key-Authentifizierung durchführt
su Ersatz für das gleichnamige UNIX-Kommando, wobei hier nach Möglichkeit eine S/Key-Authentifizierung stattfindet. Im URZ heißt dieses Werkzeug keysu.
login Ersatz für das UNIX-Login-Kommando, erweitert um die S/Key-Authentifizierung
libskey.a Bibliothek von Routinen zur Integration von S/Key in beliebige C-Applikationen


© Holger Trapp, 15.10.1998