SSH - Einmalpasswörter
Einleitung
SSH-OTPW Einmalpasswörter - es ist nicht so schwer wie es klingt. SSH kommt schon mit einigen Sicherheitsfeatures um sicher zu stellen, dass deine Verbindungn zu einem entfernten Host sicher sind und du dich sicher authentifizieren kannst ohne Bedenken. Wie auch immer. Es mag Situationen geben wo die Verwendung von SSH Keys nicht sinnvoll ist oder gar unsicher. Nehmen wir an du möchtest eine SSH Verbindung von einem öffentlichem Computer z.B. in einem Internetcafe aus eine Verbindung aufbauen. Das Public Key Verfahren nimmt an, dass der Computer von dem du dich aus verbindest sicher ist. Das ist aber nicht immer der Fall. Wenn du in diesem Szenario ein Schlüsselpaar verwenden würdest, auch wenn dein Schlüssel mit einem Passwort geschützt ist, wird der Schlüssel entschlüsselt und in den Arbeitsspeicher des Computers abgelegt um damit zu arbeiten bzw. um dich zu authentifizieren. Das bedeutet das die Verbindung verwundbar ist wenn du dem Computer nicht vertraust (kannst).Für solche Umstände wurde ein System entwickelt das “einmal Passwort Authentifizierung” oder OTPW heist. OTPW ist dazu gedacht, mit anderen Authorisationssystemen zusammen zu arbeiten wie z.B. SSH-OTPW Authentifizierung mit zwei Faktoren oder Single Sign-on Lösungen. Wir werden OTPW in einer Ubuntu 14.0.4 VM aufsetzen. Das wird es uns erlauben, uns mit einem Zwei Komponenten Passwort das nur einmal verwendet wird in ein System einzulogen. Dazu benutzt OTPW das PAM Authentifizierungssystem.
Basis Konfiguration
Nachdem wir das System so konfiguriert haben, dass es OTPW benutzt um uns einzuloggen, generieren wir einen(mehrere) Passwort Prefix. Dieser ist der erste Teil des Einmal-Passwortes. Diesen kann man ausdrucken oder auf einem Device speichern dem wir vertrauen (z.b. verschlüsselt auf dem Telefon). also nicht der “unsichere” Computer von dem aus wir uns “sicher” verbinden wollen. Wenn du dich nun einloggen willst und die Passworteingabe siehst, siehst du eine Referenznummer. Nun musst du den Passwort Prefix sowie den zweiten Teil des Passwortes eingeben der mit der Referenznummer assoziert ist. Dieses Passwort wird nur einmal funktionieren. Wenn nun auf dem öffentlichen Computer nun ein key-logger installiert sein sollte oder jemand die Möglichkeit hatte dein Passwort mit zu lesen, wird das keinen Einfluss haben, da es nur gültig ist bis du dich eingeloggt hast.
Installation der Komponenten
Um das System zu konfigurieren müssen wir zuerst die notwendigen Komponenten installieren. Da die SSH-OTPW Authentifikation ausschliesslich auf der Server Seite stattfindet werden wir die nötigen Pakete auf dem Server installieren. Zuerst erneuern wir den Pakete Cache und installieren anschliesend diese aus den Repositories.
sudo apt-get update
sudo apt-get install otpw-bin libpam-otpw
Wie du sehen kannst ist OTPW in zwei wesentliche Komponenten unterteilt. Teil eins wird benutzt um die Einmal-Passwörtet zu erstellen und zu verwalten. Der zweite Teil ist das notwendige Plugin das benutzt wird um PAM gegen die OTPW Passwortdateien zu authentifizieren.
PAM Konfiguration für OTPW
Nun müssen wir OTPW als Option zu PAM hinzu zu fügen. Wir werden das Ganze so konfigurieren, dass der Login mit regulären Passwörtern verboten ist. Zusätzlich gehen wir davon aus, dass die SSH Schlüssel schon konfiguriert sind für ein passwortloses Login. In unserer Konfiguration werden primär SSH Schlüssel verwendet und als Fall Back Option nutzen wir den OTPW Mechanismus.Um das fertigstellen zu können werden wir nur die Dateien ändern die beim SSH Login involviert sind. Zuerst öffnen wir SSH PAM Konfigurationsdatei:
sudo nano /etc/pam.d/sshd
Am Anfang der Datei findest du eine Zeile in der die Datei common-auth importiert wird. Dies würde die reguläre Passwort Authetifikation erlauben, was wir nicht wollen. Wir kommentieren das aus.
#@include common-auth
Darunter müsen wir nun folgende zwei Zeilen hinzufügen:
auth required pam_otpw.so
session optional pam_otpw.so
Konfigurieren des SSH Dienstes
Nun da wir die Pam Module für den SSH Dienst konfiguriert haben OTPW zu nutzen müssen wir dem Dienst selber auch noch die notwendigen Werte mitteilen.
sudo nano /etc/ssh/sshd_config
Wir brauchen nur einige wenige Werte in der Config Datei anpassen. Bitte versichere dich, dass die Werte wie die u.g. aussehen. Wenn diese nicht vorhanden sind füge diese einfac hinzu. Wenn Werte doppelt aufgeführt sind wird der Dienst den Neustart verweigern.
UsePrivilegeSeparation yes
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
Starte danach den SSHD Dienst neu.
OTPW Passwort Dateien anlegen
Jetzt da unser System so konfiguriert ist um OTPW für SSH Logins zu nutzen, die keinen SSH Schlüssel hinterlegt haben, müssen wir die notwendigen Passwort Dateien anlegen. Die Datei, welche unter ~/.otpw
gespeichert wird, enthält den Hashwert des Passwortsegments, pro Zeile. Die zweite Datei enthält die Klartext One-Time Passwortsegmente, welche wir wie in der Einleitung beschrieben ausdrucken oder auf einem sicheren portablem Gerät speichern können. Wir müssen dazu das otpw-gen
Kommando aufrufen. Normalerweise würde das Tool den Klartext Teil nach Stdout schreieben wir sollten es aber in eine Datei umleiten um es später weiter verwenden zu können.
cd ~
otpw-gen > supergeheim.txt
Das generiert einen Random seed und fragt nach einem Passwort Prefix. Nun findest du unter ~/.otpw die Datei welche den gehashten Wert der Passwort Suffixe enthält und zwar einen pro Zeile.
OTPW1
280 3 12 8
253tFMngG2PNYhn
132Kua%SZ+esb6t
237yH7D2FMbQsyW
125rrXfBRwnF+A%
106gJxhJE4jkknj
04135:5:knWIB4:
232/d4kI:n57IcD
244RASe8ka63b8Z
057GmqfFe=pXQqu
. . .
Die Klartext Teil der Passwortsegmente findest du nun unter supergeheim.txt
OTPW list generated 2014-04-03 18:06 on sshd
000 /rGF h5Hq 056 /zi5 %yTJ 112 J7BT HdM= 168 fdBm X%Tn 224 69bi =9mE
001 GoOG jxYQ 057 E=o3 kuEF 113 zwit p27J 169 nHK9 CXRx 225 IihF =o8g
002 Xm=E PuXc 058 Ok27 ZJ++ 114 On=5 pNYH 170 ZRDa mB5e 226 yYsb CAfn
003 deL+ iHs7 059 /WGS :J4M 115 ZZd/ 8zyU 171 acDd dESV 227 ddjg ipcR
004 KhDn NdfS 060 =tEz ACye 116 FkQ9 8kSu 172 iRSR nZWT 228 9hHd veZ9
005 rGFG K5=7 061 MvUW LRxc 117 2YwY axJJ 173 kEV5 T/Vz 229 wx%n Le6P
006 GWi2 fHjf 062 qOR: WN2x 118 FvD4 oNjT 174 99OT 8KPy 230 /I=Y hicP
007 XPom pEYp 063 8Xvm vZGa 119 UNjF :Kys 175 b95i SU3R 231 keLn aDcK
008 fJI% 3Qs2 064 3I7Q I2xc 120 5Tm9 REQK 176 AVg: 4ijE 232 :aIF op6V
009 P/Sn dSxA 065 A+J6 =4zo 121 LAyj 3m2+ 177 TMuN 9rJZ 233 SWvB %+cL
. . .
Die linke Spalte ist die Refernznummer, gefolgt von den acht Zeichen fürden Suffix. Das Leerzeichen zwischen den ersten und letzten 4 Zeichen dient nur der Lesbarkeit und kann optional weggelassen werden wenn du den Suffix ein gibst. Der Vorgang muss für jeden Benutzer wiederholt werden.
Test
Um das Einmal-Passwort System zu testen, logst du dich am besten von einem Computer ein, der noch nicht mit deinem SSH Schlüssel Konfiguriert wurde. Logge dich mit dem Benutzernamen ein, den du für OTPW konfiguriert hast.
ssh demouser@server1.com
Password 253:
Wie du sehen kannst steht bei der Passworteingabe eine Referenznummer für den Suffix den wir eingeben sollen. Zuerst geben wir das Prefix Passwortsegment ein gefolgt direkt vom referenziertem Suffix, in der selben Zeile und ohne Leerzeichen.
Beispiel
Nehmen wir an, das Prefix Passwort ist Str5ng!G5heim
, und die referenzierte Suffix in der Spalte in der Datein ~/.otpw
schaut folgendermassen aus:
249 N4HY RsbH
250 +vAz fawn
251 O4/R ZrhM
252 c6kP jgUT
253 I=aA OKSz
254 aYzA :F64
255 3ezp ZpIq
256 ggIi TD2v
In diesem Fall würden wir entweder Str5ng!G5heimI=aA OKSz
” oder
Str5ng!G5heimI=aAOKSz (ohne Leerzeichen im Suffix) als Einmal-Passwort verwenden können. Wenn du nun die Datei
~/.otpw` öffnest kannst du sehen, dass der Wert in einer der Zeilen mit Strichen ersetzt wurde.
. . .
091icM5kSPVOdcU
274Uf3q/=kTYcu8
229fHfmIsCj7mjQ
---------------
115EzDO6=jM/sOT
143iWCdteSk3kg7
265S+QTGcg+MAZO
174UgXchxsI2g:G
. . .
Das bedeutet, dass dieses Suffix nicht mehr gültig ist und nicht mehr verwendet werden kann. Wenn nun zwei Benutzer versuchen sich gleichzeitig mit dem selben Account anzumelden wird OTPW das Prefix Passwort abfragen gefolgt von drei Suffix Passwörtern. Jedes der Suffix Passwörter ist verschieden. In diesem Fall sieht die Passworteingabe folgendermassen aus.
Password 161/208/252:
In dieser Situation wird eine ~/.otpw.lock
Datei erstellt. Nach erfolgreichem Login sollte die Datei entfernt werden, aber es gibt einen Bug bei dem es passieren kann, dass die Datei nicht entfernt wird. Die Datei muss dann manuell entfernt werden.
rm ~/.otpw.lock
Beim nächsten Login wird wieder nur ein Suffix Passwort abgefragt.
Vorbehalte und Bugs
Wie vorhin erwähnt kann es vorkommen, dass die lock Datei nicht automatisch entfernt wird nach einem erfolgreichen Login. Das passiert insbesondere wenn ein Benutzer den Login abbricht mit CTRL-C
. Ein anderer Fehler ist es, dass die Anzahlt der gültigen OTPW Einträge falsch angezeigt wird. Ein Workarround ist folgendes Bash Script von Wolfgang Kroener aus der Debian Mailliste. Das Script kann auf verschiedenste Arten implementiert werden, aber am einfachsten ist es das ganze ans Ende der ~/.bashrc
Datei einzufügen.
if [ "$SSH_TTY" -a -f $HOME/.otpw ]; then
PW_LINES=$(wc -l <$HOME/.otpw)
PW_USED=$(grep -- ---- $HOME/.otpw | wc -l)
echo "OTPW $PW_USED/`echo $PW_LINES-2 | bc` used"
fi
Nach dem Login per SSH sollte nun folgendes angezeigt werden.
OTPW 6/280 used
OTPW empfiehlt die Passwortliste bei ca 50% verfügbarer Passwörter zu regenerieren.
otpw-gen > nochwasgeheimes.txt
Das sorgt dafür, dass u.a. die vorherigen Passwort Suffixe nicht mehr verwendbar sind.
Zusammenfassung
OTPW kann dir eine zusätzliche Option liefern um sich von “unsicheren” Machinenen auf deine Server einzulogen. Es kann helfen Schlüsselbasierenden Login zu verhindern von unsicheren Machinen oder Umgebungen.