Bei einem SSH-Schlüssel muss ein Angreifer eine Datei von Ihrem Computer stehlen. Bei der Zwei-Faktor-Authentifizierung benötigt er zusätzlich Ihr Smartphone. Diese Anleitung fügt bei jeder SSH-Verbindung zusätzlich zum Schlüssel einen sechsstelligen Code hinzu, der alle 30 Sekunden erneuert wird.
1. Das Prinzip
Der TOTP-Standard (Time-based One-Time Password) generiert Codes auf der Grundlage eines gemeinsamen Geheimnisses und der aktuellen Uhrzeit. Jede kompatible Anwendung ist dafür geeignet: Google Authenticator, Microsoft Authenticator, Aegis, 2FAS oder das TOTP-Modul eines Passwort-Managers. Auf der Serverseite kommt das PAM-Modul zum Einsatz libpam-google-authenticator das den Code überprüft, unabhängig davon, welche Anwendung verwendet wird.
Das Ergebnis: Für die Verbindung werden zunächst der SSH-Schlüssel und anschließend der Code benötigt. Es wird kein Passwort abgefragt.
2. Bevor Sie beginnen
- Die Anmeldung per Schlüssel sollte bereits funktionieren, wobei die Passwörter deaktiviert sind: siehe SSH absichern.
- Die Uhr des Servers muss genau gehen, da die Codes zeitabhängig sind. Überprüfen Sie dies mit
timedatectl: die LinieSystem clock synchronizedmuss angebenyes. - Halten Sie während des gesamten Vorgangs eine Root-Sitzung offen.
3. Das Modul installieren
apt install -y libpam-google-authenticator
4. Ihr Telefon registrieren
Der Befehl wird mit dem Konto ausgeführt, das sich anmelden wird, nicht als root:
su - alex
google-authenticator -t -d -f -r 3 -R 30 -w 3
Diese Optionen dienen als Vorabantworten auf die Abfragen des Tools: zeitbasierte Codes (-t), wobei jeder Code nur einmal verwendet werden kann (-d), höchstens drei Versuche alle 30 Sekunden (-r 3 -R 30), sowie eine Toleranz von jeweils einem Code vor und nach dem Signal, um eine leichte Taktverschiebung auszugleichen (-w 3).
Auf dem Terminal wird ein QR-Code angezeigt: Scannen Sie diesen mit Ihrer App. Sollte das Terminal zu klein sein, vergrößern Sie das Fenster oder geben Sie den direkt darunter angezeigten geheimen Schlüssel manuell ein.
5. PAM konfigurieren
Öffnen Sie /etc/pam.d/sshd. Kommentieren Sie die Zeile aus, in der das Passwort für das Konto abgefragt wird, und fügen Sie stattdessen das TOTP-Modul hinzu:
# @include common-auth
auth required pam_google_authenticator.so nullok
Kommentieren common-auth sorgt dafür, dass zusätzlich zum Code kein Passwort abgefragt wird. Die Option nullok Ermöglicht es, Konten, für die noch kein Telefon registriert wurde, allein mit dem Schlüssel anzumelden: praktisch während der Einrichtung. Entfernen Sie diesen, sobald alle Konten registriert sind.
6. OpenSSH konfigurieren
Wenn Sie unsere Anleitung zur Absicherung befolgt haben, öffnen Sie /etc/ssh/sshd_config.d/00-durcissement.conf und ändern Sie die vorhandene Zeile, anstatt eine neue in einer anderen Datei hinzuzufügen: OpenSSH berücksichtigt nur den ersten Wert, den es liest.
KbdInteractiveAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
AuthenticationMethods publickey,keyboard-interactive erfordert beide Schritte in dieser Reihenfolge: zuerst den Schlüssel, dann den Code. Bitte PasswordAuthentication no bereits vorhanden.
sshd -t && systemctl reload ssh
sshd -T | grep -E "kbdinteractive|authenticationmethods|usepam"
7. Probieren Sie es aus, ohne sich dabei zu blockieren
Von einem zweiten Terminal aus, wobei die aktuelle Sitzung geöffnet bleibt:
ssh alex@IP_SERVEUR
Der Schlüssel wird überprüft, anschließend zeigt der Server Folgendes an: Verification code:. Geben Sie den Anwendungscode ein. Falls die Verbindung fehlschlägt:
- Der Code wurde abgelehnt : Überprüfen Sie die Uhrzeit des Servers und die des Telefons.
- Sie werden zur Eingabe eines Passworts aufgefordert : die Linie
@include common-authwird nicht kommentiert. - Es wird kein Code abgefragt :
KbdInteractiveAuthenticationblieb inno, erkundigen Sie sich bitte beisshd -T.
Die Einzelheiten des Misserfolgs sind nachzulesen in journalctl -u ssh -n 30.
8. Notfallcodes und Ausnahmen
Jeder Notfallcode kann einmalig anstelle des App-Codes verwendet werden. Falls Sie nur noch wenige davon übrig haben, starten Sie die App neu. google-authenticator um einen neuen Geheimcode und neue Codes zu generieren; anschließend müssen Sie den neuen QR-Code einscannen.
Automatisierte Skripte, wie beispielsweise ein Backup, das eine SSH-Verbindung herstellt, können keinen Code eingeben. Fügen Sie am Ende der Datei ein bestimmtes technisches Konto als Ausnahme hinzu /etc/ssh/sshd_config :
Match User borg
AuthenticationMethods publickey
Beschränken Sie dieses Konto auf das absolut Notwendige, wie unter Sicherungen mit Borg beschrieben. Und sollten Sie sowohl Ihr Smartphone als auch Ihre Notfallcodes verlieren, bleibt Ihnen die Notfallkonsole (VNC) im Kundenbereich oder, falls diese nicht verfügbar ist, der Support als Möglichkeit, wieder Zugriff zu erlangen.
Häufig gestellte Fragen
Ist die SSH-Zweifaktor-Authentifizierung sinnvoll, wenn ich bereits einen Schlüssel verwende?
Sie schützt vor dem Diebstahl Ihres Schlüssels: ein kompromittierter Computer, ein unverschlüsseltes Backup oder ein versehentlich kopierter Schlüssel. Für einen Server, auf dem Kundendaten oder Zahlungsdaten gehostet werden, ist dies ein angemessener Schutz. Für einen Testserver reicht in der Regel ein gut geschützter Schlüssel aus.
Was soll ich tun, wenn ich mein Handy verliere?
Verwenden Sie einen der bei der Registrierung angezeigten Notfallcodes und starten Sie anschließend Google Authenticator neu, um ein neues Smartphone zu registrieren. Falls keine Notfallcodes vorhanden sind, nutzen Sie bitte die Notfallkonsole im Kundenbereich oder wenden Sie sich an den Support.
Sollte man die Google Authenticator-App verwenden?
Nein. Das Servermodul trägt zwar diesen Namen, entspricht jedoch dem TOTP-Standard: Jede kompatible Anwendung funktioniert, darunter Aegis, 2FAS, Microsoft Authenticator oder das TOTP-Modul eines Passwort-Managers.
Warum wird mein Code abgelehnt, obwohl er korrekt ist?
Dies liegt fast immer an einer Zeitabweichung zwischen dem Server und dem Telefon. Bitte überprüfen Sie, ob der Server mit „timedatectl“ synchronisiert ist und ob die Uhrzeit des Telefons automatisch eingestellt wird.










