Mithilfe einer Zwei-Faktor-Authentifizierung lässt sich die Anmeldung an einem System ohne großen Aufwand deutlich besser absichern.
Wenn zwischen einem Angreifer und einem Benutzerkonto als einziger Schutz nur ein Passwort steht, macht das sicherheitsbewusste Administratoren nervös – zu Recht. Zwar lassen sich starke Passwörter erzwingen, doch Sorglosigkeit kann man nicht verbieten. Es ist deshalb sinnvoll, auf eine Zwei-Faktor-Authentifizierung umzusteigen. Dabei bleibt das Passwort als ein Faktor der Authentifizierung erhalten, aber ein zweites Element kommt hinzu.
In diesem Artikel zeigen wir, wie Sie beim Login neben dem Passwort zusätzlich ein Einmalpasswort verlangen, das eine App auf dem Smartphone des Benutzers erzeugt. Das Verfahren wurde von der Initiative For Open Authentication (OATH) erdacht und ist seit 2011 ein IETF-Standard.
Vorarbeiten
In unserem Testaufbau arbeiten wir mit Ubuntu 20.04, das Vorgehen ist aber auf anderen Distributionen sehr ähnlich. Es gibt einen Linux-Client und einen Server. Auf dem Server, der in unserem Beispiel influx heißt, gibt es das Konto des Benutzers bob. Bob meldet sich bisher ausschließlich per Passwort an. Sie wollen Bobs Konto aber nun auf eine Zwei-Faktor-Authentifizierung umstellen.
Dazu installieren Sie auf Bobs Client zuerst das Authentifizierungsmodul (Listing 1, erste Zeile). Dann loggen Sie sich als bob ein und starten das Modul (zweite Zeile).
Listing 1
$ sudo apt install libpam-google-authenticator $ google-authenticator
Das Modul fragt Sie zunächst, ob die Authentifizierung zeitbasiert erfolgen soll. Es will also wissen, ob auf den beteiligten Systemen die identische Uhrzeit (bezogen auf UTC) herrscht. Das können Sie bejahen: Alle halbwegs aktuellen Systeme synchronisieren heute die Uhrzeit über das Network Time Protocol (NTP).
Danach erscheint ein QR-Code (Abbildung 1), den Sie mit einer OTP-App scannen, die Sie auf Ihrem Smartphone installieren. Davon gibt es eine Fülle; Sie können jede App verwenden, die das TOTP-Protokoll nutzt. Großer Beliebtheit erfreut sich etwa die App Google Authenticator, die aber nicht quelloffen ist.

Abbildung 1: Den von Google Authenticator erzeugten QR-Code scannen Sie mit einer OTP-App wie FreeOTP.
Für unser Beispiel installieren wir die von Red Hat entwickelte App FreeOTP, die es für iOS [1] und Android [2] gibt (Abbildung 2). Nachdem Sie den Code gescannt haben, erscheint eine neue Schaltfläche in der App, über die Sie jederzeit ein Einmalpasswort erzeugen können, das dann 30 Sekunden lang gilt.

Abbildung 2: Im Gegensatz zu Google Authenticator ist das von Red Hat entwickelte FreeOTP eine quelloffene Anwendung.
Legen Sie das Smartphone nun zunächst zur Seite, und kehren Sie zurück auf die Konsole. Unterhalb des QR-Codes aus Abbildung 1 finden Sie noch eine Reihe sogenannter Emergency Scratch Codes. Falls Sie Ihr Smartphone verlieren sollten, können Sie sich mit diesen Codes noch einloggen, um einen neuen QR-Code zu generieren und damit von vorn anzufangen. Jeder der Emergency Scratch Codes lässt sich nur einmal benutzen. Speichern Sie diese Codes an einem sicheren Ort.
Jetzt stellt Ihnen Google Authenticator noch eine Reihe von Sicherheitsfragen, die Sie alle getrost mit y beantworten können (Abbildung 3). Es geht dabei darum, die Anzahl der Logins pro Zeitintervall zu begrenzen, aber gleichzeitig eine gewisse Toleranz für Zeitunterschiede zwischen Client und Server zu gewährleisten.
Diese Schritte müssen Sie für jeden Benutzer auf dem System vornehmen, der die Zwei-Faktor-Authentifizierung verwenden soll. Auf der Client-Seite sind damit alle Arbeiten erledigt; es geht auf dem Server weiter.
PAM anpassen
Um den Zugriff per Zwei-Faktor-Authentifizierung zu aktivieren, müssen Sie noch zwei Konfigurationsdateien anpassen, wofür Sie Root-Rechte benötigen.
Den Anfang macht die Datei /etc/ssh/sshd_config. Finden Sie darin die beiden Zeilen, die mit UsePAM und ChallengeResponseAuthentication beginnen, und stellen Sie sicher, dass beide auf yes enden (Listing 2).
Listing 2
UsePAM yes [...] ChallengeResponseAuthentication yes
Danach editieren Sie, ebenfalls als Root, die Datei /etc/pam.d/sshd. Weit oben in der Datei steht die Zeile @include common-auth. Fügen Sie dahinter die Zeile auth required pam_google_authenticator.so ein, sodass die Abfolge wie in Listing 3 aussieht.
Listing 3
[...] @include common-auth auth required pam_google_authenticator.so [...]
Nun starten Sie den SSH-Dienst mit dem Kommando systemctl restart ssh einmal durch. Beim nächsten Login-Versuch per SSH (Abbildung 4) fragt der Server jetzt nicht mehr nur das Benutzerpasswort ab (Password: im Screenshot), sondern auch das Einmalpasswort (Verification Code:), das Sie per App erzeugen.

Abbildung 4: Der Anmeldedialog fragt neben dem Benutzerpasswort (Password:) nun auch das Einmalpasswort (Verification Code:) ab.
Login auf der Konsole
Die Änderungen, die Sie bisher vorgenommen haben, gelten nur für den Zugriff per SSH. Möchten Sie die Zwei-Faktor-Authentifizierung nicht nur für den entfernten Login aktivieren, sondern auch für den lokalen, ändern Sie dazu die Datei /etc/pam.d/login (Listing 4).
Listing 4
[...] @include common-auth session optional pam_motd.so noupdate # diese Zeile einfuegen: auth required pam_google_authenticator.so [...]
Es genügt, hinter der Zeile @include common-auth die Zeile auth required pam_google_authenticator.so einzufügen. Die im Listing vorhandene Zeile session optional pam_motd.so noupdate dient zur Anzeige von Benachrichtigungen (Message of the Day) und ist nicht auf jedem System vorhanden.
Window-Manager GDM
Falls Ihr System Gnome als grafische Benutzeroberfläche nutzt, können Sie auch hier die Zwei-Faktor-Authentifizierung beim Login aktivieren. Sie nehmen dazu dieselbe Änderung wie im vorigen Abschnitt noch einmal vor, nur in einer anderen Datei: der /etc/pam.d/gdm-password (Listing 5). Nach einem Neustart fragt auch Gnome den zweiten Faktor beim Login mit ab.
Listing 5
[...] @include common-auth # diese Zeile einfuegen: auth required pam_google_authenticator.so [...]
Passwortlose Anmeldung
Lassen Sie uns noch einmal zum Login per SSH zurückkommen. Viele Benutzer bevorzugen den passwortlosen Zugang per Public-Key-Authentifizierung. Dazu gibt der Benutzer bob auf seinem Client das Kommando ssh-keygen -t rsa -b 4096 ein, um ein Schlüsselpaar zu generieren (Abbildung 5).
Danach genügt das Kommando ssh-copy-id bob@influx, gefolgt von der Eingabe des aktuellen Passworts, und Bob kann sich fortan ohne Passworteingabe auf unserem Beispiel-Server influx anmelden. Auch diese Art des Logins lässt sich mit der Zwei-Faktor-Authentifizierung kombinieren.
Dazu ändern Sie zwei Konfigurationsdateien auf dem Server, die Sie bereits kennengelernt haben. Öffnen Sie zunächst die /etc/ssh/sshd_config, und geben Sie am Dateiende folgende Zeile ein:
AuthenticationMethods publickey,keyboard-interactive
Die zweite Datei, die Sie bearbeiten müssen, ist wieder die /etc/pam.d/sshd. Hier deaktivieren Sie die Zeile @include common-auth, indem Sie ihr ein Hash-Zeichen (#) voranstellen:
#@include common-auth
Starten Sie anschließend den SSH-Dienst mit dem Kommando systemctl restart ssh neu. Wenn Bob sich nun auf dem Server einloggt, muss er zwar kein Passwort eingeben, wohl aber das Einmalpasswort aus der Smartphone-App.
Fazit
Sicherheit ist keine Hexerei. Wie Sie gesehen haben, lässt sich schon mit einfachen Mitteln die Anmeldung an einem System mithilfe einer Zwei-Faktor-Authentifizierung deutlich besser absichern. Das bietet einen erhöhten Schutz gegen unerwünschte Besucher, selbst wenn der Anwender ein schwaches Passwort wählt. (jlu)
Glossar
-
UTC
-
Coordinated Universal Time / Temps universel coordonné. Weltzeit für einheitliche Zeitangaben, entspricht MEZ – 1 beziehungsweise der früheren Greenwich Mean Time (GMT). Coordinated bedeutet, dass UTC Schwankungen der Erdrotation durch gelegentliche Schaltsekunden ausgleicht.
-
OTP
-
One-time Password. Ein Einmalkennwort gilt nur für eine einzige Verwendung und kann kein zweites Mal benutzt werden.
-
TOTP
-
Time-based One-time Password Algorithmus. Verfahren zum Erzeugen von zeitlich limitierten Einmalkennwörtern auf Basis des Keyed-Hash Message Authentication Code (HMAC).








Zu erwähnen wäre noch, dass sowohl google-authenticator-libpam als auch google-authenticator Open Source sind und eine Apache-2.0 License haben.