SSH Login mit 2-Faktor-Authentifizierung

Mo, 12. April 2021, Lioh Möller

Inspiriert durch den tollen Vortrag von Florian Winkler auf den Grazer Linuxtagen wird im Folgenden die Einrichtung einer 2-Faktor-Authentifizierung für SSH Logins unter Debian GNU/Linux 10 beschrieben.

Zunächst müssen die entsprechenden Pakete installiert werden:

sudo apt install libpam-google-authenticator qrencode

qrencode wird dabei zur Generierung des QR-Codes verwendet, welcher später mithilfe einer Authenticator-App der Wahl gescannt werden kann. Das eigentliche Authenticator-Paket trägt zwar Google im Namen, ist allerdings universell einsetzbar und als Freie Software verfügbar.

Nach der Installation kann der Benutzer, welcher sich via SSH mit 2-Faktor-Authentifizierung anmelden soll, den google-authenticator konfigurieren:

google-authenticator

Direkt nach dem Start wird eine URL zu dem generierten QR-Code, der passende Secret-Key sowie einige Recovery-Codes angezeigt, die man allesamt an einem sicheren Ort aufbewahren sollte.

Sofern qrencode wie zuvor beschrieben installiert wurde, wird auch der QR-Code im Terminal angezeigt, der sich nun mit einer Authenticator-App wie FreeOTP+ einscannen lässt.

Daraufhin wird man mit einigen sicherheitsrelevanten Fragen konfrontiert, die man nach Best-Practice wie folgt beantworten sollte:

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

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. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) n

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.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y

Damit ist die Einrichtung des Authenticators bereits abgeschlossen. Um diesen für SSH-Logins nutzen zu können, sind noch einige kleinere Vorbereitungen nötig. Da wir nur noch Key-Based-Authentication zulassen möchten, muss vorab der SSH Public-Key, mit dem der Zugriff erfolgen soll, in die Datei ~/.ssh/authorized_keys eingetragen werden. Alternativ kann dieser vom Client aus mit dem Befehl ssh-copy-id auf das Zielsystem, auf dem der google-authenticator aktiviert wurde, kopiert werden:

ssh-copy-id user@host

Daraufhin müssen in der Datei /etc/ssh/sshd_config die folgenden Parameter angepasst werden:

PasswordAuthentication no
PermitRootLogin no
ChallangeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Alternativ lässt sich die 2-Faktor Authentifizierung mittels einer Match-Direktive auch nur für einzelne Benutzer aktivieren. Lediglich ChalangeResponseAuthentication muss dabei ausserhalb des Match-Abschnittes konfiguriert werden:

ChallangeResponseAuthentication yes
Match User lioh
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive

Nun wird die SSH-Konfiguration neu eingelesen:

service sshd reload

Zusätzlich muss die Datei /etc/pam.d/sshd bearbeitet werden, sodass der Authenticator verwendet wird.

Dazu trägt man am Anfang der Datei vor @include common-auth folgende Zeile ein:

auth sufficient pam_google_authenticator.so

Damit ist die Installation bereits abgeschlossen. Beim nächsten Login via SSH mit dem Benutzerkonto, für das der google-authenticator konfiguriert wurde, muss der Verification code aus der Authenticator-App eingegeben werden.

Danksagung: Vielen Dank an Florian für seinen Vortrag und die Hilfe beim Debuggen von PAM.

Es wurden noch keine Kommentare verfasst, sei der erste!