Zwei-Faktor-Authentifizierung für SSH-Logins mit dem Google Authenticator unter Linux

2wa-title

Als Zwei-Faktor-Authentifizierung (2FA) wird die Möglichkeit bezeichnet, einen Anmeldeprozess durch einen zweiten, zusätzlichen Schritt abzusichern. Durch die Erweiterung der schlichten Eingabe einer Benutzername/Passwort-Kombination um einen beliebigen zweiten Faktor, wie z.B. eine über SMS übermittelte TAN, lässt sich die Sicherheit des Anmeldeverfahrens erhöhen. Dieser Artikel erläutert, wie eine Zwei-Faktor-Authentifizierung für das SSH-Protokoll mit Hilfe des Google Authenticators umgesetzt werden kann.
Um eine Zwei-Faktor-Authentifizierung unter Linux zu konfigurieren, können die Pluggable Authentication Modules (PAM) verwendet werden. Diese sind unter Linux für den Authentifizierungsprozess diverser Dienste verantwortlich. PAM-Module sind systemweit verfügbar und können von vielen Anwendungen zur Authenfizierung und Autorisierung von Benutzern genutzt werden - unter anderem auch vom OpenSSH Server.
Die Google-Authenticator-App ist frei verfügbar und bietet die Möglichkeit einer 2FA ohne Serververbindung. Die App ist für Android, iOS und Blackberry verfügbar und sollte auf einem Smartphone Ihrer Wahl installiert werden.

Ein paar Worte zur Installation

Das benötigte PAM-Modul für Debian und Ubuntu heißt „libpam-google-authenticator". Es ist in den Standard-Paketquellen enthalten und kann z.B. via apt wie folgt installiert werden:
$sudo apt update
$sudo apt install libpam-google-authenticator

Für andere Distributionen wie Red Hat oder SuSE sind ebenfalls passende Pakete verfügbar.

Konfiguration vom Google Authenticator 

Die Konfiguration muss von jedem Benutzer im Benutzerverzeichnis mit dem Kommando google-authenticator ausgeführt werden und wird zusammen mit dem Geheimschlüssel in ~/.google-authenticator gespeichert.
Anschließend wird der Anwender mit einer Reihe von Fragen durch die Konfiguration geleitet. Diese Fragen werden im Folgenden Schritt für Schritt erklärt:
Do you want authentication tokens to be time-based: yes
Bei einem zeitbasierten Einmalpasswort wird die aktuelle Zeit zusammen mit einem geheimen Passwort in einen Hashwert umgewandelt. Dieser Hashwert wird auf eine bestimmte Bitlänge gekürzt und mithilfe einer Modul-Operation als sechs- oder achtstellige Dezimalzahl dargestellt. Dieses Einmalpasswort ist dann nur für einen kurzen Zeitraum gültig.
Wird diese Frage mit „no" beantwortet, werden zählerbasierte Einmalpasswörter verwendet. Hierbei kommt ein ereignisgesteuerter Zähler zum Einsatz. Dieser wird nach jeder Generierung eines neuen Passworts um eins erhöht. Wird dieser Code auf dem Server verwendet, erhöht sich der Zähler dort ebenfalls. Da diese Zähler jedoch auseinanderlaufen können, akzeptieren Server eine größere Anzahl an Einmalpasswörtern. Aus diesem Grund gilt das Verfahren mit zeitbasierten Einmalpasswörtern im Vergleich zu zählerbasierten Passwörtern als sicherer.
Nach der Eingabe der Antwort erscheinen auf der Konsole verschiedene Informationen.

Der QR-Code kann nun mit der Google-Authenticator-App gescannt werden. Alternativ kann der "secret key" manuell als Einrichtungsschlüssel eingegeben werden. Die fünf "emergency scratch codes" dienen als Notfallcode. Sie sollten ausgedruckt und sicher aufbewahrt werden. Dies gilt für den Fall, dass der Zugriff auf den zweiten Faktor zu einem bestimmten Zeitpunkt nicht möglich ist. 


Do you want to disallow multiple uses of the same authentication token[…]: yes
Ein Code ist zwar nur 30 Sekunden gültig, jedoch können Sie mit dieser Auswahl entscheiden, ob dieser innerhalb der Zeit mehrfach verwendet werden darf. Es ist ratsam, dies zu unterbinden, denn falls ein Angreifer es irgendwie geschafft haben sollte, Ihren Bestätigungscode zu erfassen, nachdem Sie ihn verwendet haben, so ist er bereits nach einmaliger Verwendung ungültig.


By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time.[…]: no
Hierbei handelt es sich um die Gültigkeitsdauer der Codes. Falls Codes akzeptiert werden sollen, die kurz vor oder kurz nach der Gültigkeitsdauer stehen, muss die Frage mit „yes" beantwortet werden. Dies ist sinnvoll, wenn die Systeme nicht zeitlich synchron laufen. Da dies aber die Sicherheit beeinträchtigt, wird in diesem Fall „no" gewählt.


If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module.[...]: yes
Diese Option erlaubt nicht mehr als drei Anmeldeversuche innerhalb von 30 Sekunden. Um die Sicherheit zu erhöhen, sollte dies mit „yes" beantwortet werden.

SSH Konfiguration

Falls die Konfiguration über SSH durchgeführt wird, sollte die bestehende Sitzung aufgrund von möglichen Konfigurationsfehlern niemals geschlossen werden. Das Testen sollte über eine zweite Sitzung durchgeführt werden, da es sonst möglich ist, dass man sich aussperrt.
In der Konfigurationdatei /etc/pam.d/sshd muss folgende Zeile hinzugefügt werden:
auth required pam_google_authenticator.so
Mit der Option „required" können sich nur noch Benutzer über SSH anmelden, welche die oben aufgeführte Konfiguration mit google-authenticator durchgeführt haben. Hat ein Benutzer diese Konfiguration nicht durchgeführt, hat er nach dem Abschließen der Konfiguration keine Möglichkeit mehr, sich über SSH anzumelden. Falls dem Nutzer ein erfolgreicher Login trotz fehlender Konfiguration gewährt werden soll, kann die Option „nullok" am Ende der Zeile hinzugefügt werden.
Zum Abschluss muss in /etc/ssh/sshd_config das Challenge-Response-Verfahren von „no" auf „yes" gestellt werden.
ChallengeResponseAuthentication yes
Das Challenge Response-Verfahren ist ein sicheres Authentifizierungsverfahren eines Benutzers auf Basis von Wissen. Mit dieser letzten Einstellung wird die 2FA für SSH aktiviert.
Abschließend muss der SSH-Daemon neu geladen werden, damit die Konfiguration aktualisiert wird.

 Einloggen

Nach dem Einloggen via SSH mit dem Benutzernamen wird nun zuerst nach dem Passwort und dann nach dem Bestätigungscode gefragt.

Zusammenfassung

Der Google Authenticator bietet für sämtliche Distributionen eine einfache und kostenlose Möglichkeit, einen SSH-Zugang durch einen zweiten Faktor zu erweitern. Dafür muss unter Linux das passende PAM-Modul installiert werden. Zusätzlich müssen Änderungen an der /etc/ssh/sshd_config und an der /etc/pam.d/ vorgenommen werden. Nach einer erfolgreichen Konfiguration erhöht sich die Sicherheit für einen SSH-Zugang.

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/