Dienste absichern mit der Zwei-Faktor-Authentifizierung

In Zeiten, in denen wir immer und überall an unser Daten, Informationen und Ähnliches wollen, ist es häufig nur schwer zu vermeiden auch in unsicheren Netzen oder noch pikanter, an fremden Rechnern, Zugangsdaten eingeben zu müssen. Gefährlich wird es, wenn man das Passwort, dass man gerade am Rechner eines Verwandten eingibt, auch noch für andere Dienste verwendet. Denn man kann sich nie sicher sein, was auf diesem Rechner alles blüht und gedeiht.

Aber was kann man gegen die Gefahr machen, dass jemand allein durch das Passwort Zugriff auf unsere persönlichen Daten bekommt. Wir brauchen einen zweiten Faktor, der nur einmalig oder für sehr kurze Zeit gültig ist. Ein sogenanntes One-Time-Pad. Das ist ein Schlüssel der beiden Seite einer Kommunikation bekannt ist und der wirklich nur ein einziges Mal verwendet wird.

Bild von einem RSA Token

Diese Technik wird schon seit Jahren in der Industrie genutzt, um zum Beispiel einem Mitarbeiter den Zugriff auf das VPN des Unternehmens zu ermöglichen. Dabei bietet der Token auch eine einfache Möglichkeit dem Mitarbeiter die Rechte zu entziehen, wenn er denn mal nicht mehr für die Firma arbeitet, ohne damit einen großen Konfigurationsaufwand loszutreten.

Seit einigen Jahren wird die Zwei-Faktor-Authentifizierung auch immer mehr im Consumer Bereich verwendet, ein prominentes Beispiel ist dabei Google, dass für seine Dienste eine solche Authentifizierung anbietet. Aber auch viele andere Anbieter und Dienste bieten direkt oder über eine Erweiterung eine Zwei-Faktor-Authentifizierung an.
Zu diesen Diensten gehören zum Beispiel OpenSSH, GDM oder der bekannte OpenSource Webmailer Roundcube. In diesem Artikel werde ich insbesondere auf die Integration in OpenSSH eingehen.

Das dabei verwendete Verfahren heißt TOTP was für Time-based One-time Password Algorithm seteht und ist in RFC 6238 definiert. Dieses Verfahren basiert dabei auf einem geteilten Schlüssel (shared secret) und der aktuellen Zeit.

Bild wie das TOTP System funktioniert

Dabei funktioniert das Verfahren folgendermaßen. Zuerst wird ein Schlüssel erzeugt, welcher dann beiden Seiten, also dem Server und dem Nutzer bekannt gemacht werden muss. Auf Basis dieses Schlüssels und der aktuellen Zeit generiert dann ein Hash Algorithmus einen Token. Da die Uhrzeit synchron und das Secret beiden Teilnehmern bekannt ist, wissen beide zur immer gleichen Zeit vom immer gleichen Token.
Wenn ein Nutzer jetzt versucht sich an einem System zu authentifizieren, sendet dieser seinen Nutzernamen und den Token an den Server. Dieser generiert jetzt auf Basis der aktuellen Zeit und dem Secret das zu dem User gehört einen Hash. Wenn dieser Token mit dem gesendeten Token übereinstimmt wird dem Nutzer die Authentifizierung mit seinem Passwort gewährt.

Um das Ganze zusätzlich abzusichern sind die Token mit keiner oder nur einer geringen zeitlichen Abweichung gültig und es ist möglich, dass der Token in seiner Gültigkeitsdauer nur ein mal gültig ist.


So viel zur Theorie, weiter geht es jetzt mit der Praxis. Eine beliebte Software für die Zwei-Faktor-Authentifizierung ist der Google Authenticator. Dieser implementiert dabei das TOTP verfahren und ist für alle gängigen mobilen Plattformen verfügbar. Viele Leute befürchten dabei, dass die Authentifizierung dann irgendwie online oder noch schlimmer über Server von Google umgeleitet würde. Doch das ist falsch, das TOTP Verfahren funktioniert zu 100% offline und basiert nur auf dem Wissen über das gleiche Secret und die gleiche Zeit. Daher sollten die Server Uhr und die des mobilen Geräts auch synchronisiert sein. Dies ist meist aber schon durch das NTP Protokoll gegeben.
Es gehen bei diesem Verfahren also keine Daten irgendwo hin. Wer das überprüfen möchte, kann sich die Quellen des Google Authenticator und des hier im Folgenden verwendete PEM-Modul hier anschauen: https://github.com/google/google-authenticator

Wie schon weiter oben erwähnt, möchte ich jetzt anhand eines Linux Servers mit Debian und OpenSSH erklären, wie man die Zwei-Faktor-Authentifizierung für SSH ermöglicht.

Zuerst müssen die entsprechenden Abhängigkeiten installiert werden:
sudo apt-get install libpam-google-authenticator
Dabei wird neben dem libpam Modul das seit Jessie in Debian entahlten ist, auch die libqrencode3 installiert, die es ermöglicht, einen QR Code zu generieren, der dann mit dem Smartphone abgescannt werden kann.

Anschließend müssen zwei Konfigurationsdateien angepasst werden. Zuerst muss am Anfang der Datei /etc/pam.d/sshd die Zeile auth required pam_google_authenticator.so hinzugefügt werden. Diese sorgt dafür, dass bei einer SSH Verbindung zuerst nach dem zweiten Faktor also dem Token gefragt wird.
Anschließend muss in der Konfiguration des SSH Servers unter /etc/ssh/sshd_config noch folgende Option erlaubt werden: ChallengeResponseAuthentication yes.

Jetzt muss die Zwei-Faktor-Authentifizierung nur noch für einen Benutzer aktiviert werden. Dazu muss man sich mit dem Benutzer anmelden und dann folgenden Befehl eingeben: google-authenticator. Dies generiert dann das benötigte Secret und fragt auch noch einige Einstellungen ab. So zum Beispiel, ob man zeitbasierte Tokens verwenden will und ob man die Konfigurationsdatei updaten will. Außerdem kann man noch die erlaubte Zeitabweichung einstellen, sowie wie oft ein Token gültig ist.

Jetzt wird ein QR-Code zum Abscannen mit dem Google Authenticator angezeigt. Dieser überträgt das ebenfalls Angezeigte Scret inkl. dem Hostnamen in die App. Zusätzlich werden noch ein paar Sicherheitstoken angezeigt die verwendet werden können, wenn zum Beispiel das Smartphone den Geist aufgibt.

Zuletzt muss nur noch der SSH Server mit /etc/init.d/ssh restart neu gestartet werden.

Ab sofort kann man sich bei einer Passwort Authentifizierung nur noch mit der Zwei-Faktor-Authentifizierung anmelden. Das Anmelden mit SSH-Key funktioniert weiterhin ohne einen Token.