»Harry watched, astounded, as Dumbledore placed the third, fourth, fifth and sixth keys in their respective locks, reopening the trunk each time, and revealing different contents each time.« -- Joanne K. Rowling, Harry Potter and the Goblet of Fire
Manchmal kommt es vor, das man sich gerne per SSH auf einem System einloggen würde, man aber keinen “vertrauenswürdigen” Rechner zur Verfügung hat, von dem aus man dies tun kann. Gegen eine Man-In-The-Middle-Attacke hilft die Kenntnis des Server-Keys bzw. dessen Fingerprint. Aber gegen einen Keylogger, der alle Tastatureingaben aufzeichnet, kann man sich an diesem Rechner nur schwer schützen.
Anmeldung über einen RSA- oder DSA-Schlüssel auf einem USB-Stick ist ebenfalls keine Lösung, da der fremde Rechner manipuliert sein könnte (oder der SSH-Client selbst) und den Schlüssel einfach kopiert vom Stick auf den Rechner kopiert (Stichwort: USBdumper).
Eine Lösung bieten hier sog. Einmalpasswörter oder “One-Time-Passwords” (OTP). Man hat, ähnlich dem TAN-Verfahren beim Onlinebanking eine Liste mit solchen Passwörtern in der Tasche und nachdem man es zum Login benutzt hat ist es ungültig. Ein Keylogger könnte das Passwort also ohne weiteres mitschneiden — nach dem Login ist es sowieso wertlos.
Auch OpenBSD kennt ein solches Verfahren schon seit langem. Dort heißt es S/KEY und kann für fast alle Authentifizierungsmechanismen (siehe login.conf(5)) benutzt werden – unter anderem auch für SSH. S/KEY bzw. OTP ist ein Challenge-Response-Verfahren. Beim Login gibt der Server ein “Challenge” aus und der Nutzer muß darauf mit einer passenden “Response” antworten.
Im folgenden möchte ich kurz die Einrichtung solcher Passwortlisten unter OpenBSD beschreiben.
Wenn auf dem OpenBSD-System bisher noch kein S/KEY verwendet wurde, muß dies erst aktiviert werden. Das Funktioniert mit dem Befehl skeyinit(1):
[root@puffy:/root] skeyinit -E
Der Parameter -E aktiviert dabei das S/KEY-Verfahren im System indem es überprüft, ob das Verzeichnis /etc/skey existiert und es ggf. neu anlegt. In diesem Verzeichnis werden die S/KEY-Infomationen für jeden User abgelegt.
Als nächstes loggen wir uns als User auf der Maschine ein, mit dem wir S/KEY nutzen wollen (root kann das Verfahren natürlich auch verwenden) und fügen uns zum S/KEY-System hinzu. Auch hierfür ist das Programm skeyinit(1) zuständig:
[andreas@puffy:~]$ skeyinit -sha1
Reminder - Only use this method if you are directly connected
or have an encrypted channel. If you are using telnet,
hit return now and use skeyinit -s.
Password:
[Adding andreas with sha1]
Enter new secret passphrase:
Again secret passphrase:
ID andreas skey is otp-sha1 100 puff72037
Next login password: MEG AS BIT INCA CODY ELM
Mit dem Befehl “skeyinit -sha1“ wird ein neuer S/KEY angelegt, basierend auf dem Hash-Algorithmus SHA1. Als Optionen stehen hier auch -md4, -md5 und -rmd160 zur Verfügung.
Das System gibt nach dem Aufruf eine Warnung aus, dass man die Initialisierung nur machen soll, wenn man sicher am System angemeldet ist, da man nachher über die Tastatur geheime Daten eingeben muß. Daran sollte man sich auch halten, da sonst das ganze Verfahren kompromitiert sein kann!
Als nächstes muß man das Systempasswort des Nutzer angeben und sich danach für das S/KEY-Verfahren ein neues Passwort ausdenken (das Systempasswort wird nicht geändert). Dieses Passwort sollte min. 10 Zeichen lang sein und auch Zahlen und Sonderzeichen enthalten. Dieses Passwort sollte wirklich “gut” sein.
Nachdem man das Passwort bestätigt hat ist man auch schon fertig. Wichtig ist in der folgenden Ausgabe die Zeile
ID andreas skey is otp-sha1 100 puff72037
Sie besagt, dass die S/KEY-ID des Nutzers andreas puff72037 ist und das 100 Einmalpasswörter zur Verfügung stehen und SHA1 benutzt wird. Die Zeile darunter zeigt das erste Einmalpasswort, das man aber nur für einen erneuten Aufruf von skeyinit benötigt.
Nun ist S/KEY fertig eingerichtet und wir können es schon benutzen. Um dem System mitzuteilen, dass wir uns per S/KEY-Verfahren anmelden wollen, wird dem Usernamen ein “y“ angehangen. Das sieht dann in etwa so aus:
[andreas@thanathan:~] ssh andreas:skey@puffy
otp-sha1 99 puff72037
S/Key Password:
Wie man sieht hat sich der SSH-Passwortdialog etwas verändert. Der Server gibt uns das Challenge aus, in diesem Fall sagt uns das System das wir die Response mit SHA1 berechnen sollen, das 99. Passwort von der Liste gewünscht wird und die ID puff72037 lautet. Haben wir ein OpenBSD-System zur Verfügung, dann reicht es, die komplette Zeile in der Shell auszuführen:
[andreas@thanathan:~] otp-sha1 99 puff72037
Reminder - Do not use this program while logged in via telnet.
Enter secret passphrase:
RUBY LYRA GALA HUGO MORT NECK
Und schon haben wir unser Einmalpasswort: “RUBY LYRA GALA HUGO MORT NECK“ mit dem wir uns erfolgreich einloggen können.
Bei jeder weiteren erfolgreichen Anmeldung wird der Challenge-Index runterzählen, bis alle Passwörter “aufgebraucht” sind. Daher sollte man rechtzeitig mit dem Befehl skeyinit(1) die Liste erneuern:
[andreas@puffy:~]$ skeyinit
Reminder - Only use this method if you are directly connected
or have an encrypted channel. If you are using telnet,
hit return now and use skeyinit -s.
Password:
[Updating andreas with sha1]
Old seed: [sha1] puff72037
Enter new secret passphrase:
Again secret passphrase:
ID andreas skey is otp-sha1 100 puff72038
Next login password: AMY VINE BODY ROVE ELBA MAC
Wir haben wieder 99 Einmalpasswörter und eine neu ID.
Damit man aber jetzt nicht immer einen OpenBSD-Rechner dabeihaben muß, kann man sich mit dem Programm skey(1) eine Liste von gültigen Passwörtern ausgeben lassen und dann z.B. im Portemonnaie immer mit dabeihaben.
Der folgende Befehl gibt die nächsten zehn gültigen Passwörter aus:
[andreas@puffy:~]$ skey -n 10 99 puff72038
Reminder - Do not use this program while logged in via telnet.
Enter secret passphrase:
90: FEND MOSS LEND SAY BASE BOGY
91: TEND BOIL DIRT TEAM SCAT ETC
92: KNOW FITS CORD WAG ANEW GENT
93: BACH BAY HURD EEL CURL CHEN
94: WING CHAR TWIT OVER SIN CAP
95: MEAL DUG BORG MUTE MYRA O
96: TAD NASH CELL DRAW SLAY HOCK
97: BEG BOW HUH BOW MANN SKAT
98: EASE HAND GAIN LAY CURD SEAL
99: STUB SLOW RUSK SEAT SAG NOB
Die S/KEY-Unterstützung in OpenBSD geht aber über ein SSH-Login hinaus. So sind auch FTP-Logins, sudo(8) usw. möglich. Meine kleine Übersicht hier ist auch nur ein kleiner Teil von dem, was man mit den skey-Tools alles erreichen kann. Es ist dringend anzuraten, dass man die folgenden Manpages einer genaueren Betrachtung unterzieht:
skey(1), skeyinit(1), skeyinfo(1), skeyaudit(1), skeyprune(8)
»Thou shalt run lint frequently and study its pronouncements with care, for verily its perception and judgement oft exceed thine.«