Zwei-Faktor-Authentifizierung (2FA) für SSH fügt eine zusätzliche Sicherheitsebene hinzu. Selbst wenn Ihr Passwort oder SSH-Key kompromittiert wird, benötigt der Angreifer noch den zweiten Faktor.
Was ist 2FA?
Zwei-Faktor-Authentifizierung kombiniert:
Faktor 1: Etwas, das Sie wissen (Passwort/Key)
+
Faktor 2: Etwas, das Sie haben (Smartphone mit TOTP-App)
=
Deutlich höhere SicherheitTOTP (Time-based One-Time Password)
- 6-stelliger Code
- Ändert sich alle 30 Sekunden
- Basiert auf geteiltem Geheimnis + aktuelle Zeit
- Funktioniert offline
Voraussetzungen
- SSH-Server mit Root-Zugriff
- Smartphone mit Authenticator-App:
- Google Authenticator
- Authy
- FreeOTP
- Microsoft Authenticator
Installation
Ubuntu/Debian
apt update
apt install libpam-google-authenticatorCentOS/AlmaLinux
dnf install epel-release
dnf install google-authenticatorEinrichtung pro Benutzer
1. Google Authenticator initialisieren
Als der Benutzer (nicht root):
google-authenticator2. Konfigurationsfragen beantworten
Do you want authentication tokens to be time-based (y/n) y
↓
QR-Code wird angezeigt
↓
Your new secret key is: XXXX XXXX XXXX XXXX
Your verification code is: 123456
Do you want me to update your "/home/user/.google_authenticator" file? (y/n) y
Do you want to disallow multiple uses of the same authentication
token? (y/n) y
By default, tokens are good for 30 seconds...
Do you want to do so? (y/n) n (Für Zeitdifferenzen)
Do you want to enable rate-limiting? (y/n) y3. QR-Code scannen
1. Authenticator-App öffnen 2. "Konto hinzufügen" → QR-Code scannen 3. Oder manuell: Secret Key eingeben 4. Code überprüfen
4. Notfall-Codes sichern
Die angezeigten Backup-Codes speichern:
Your emergency scratch codes are:
12345678
23456789
34567890
45678901
56789012Diese Codes funktionieren je einmal, wenn kein Smartphone verfügbar.
SSH-Konfiguration
PAM aktivieren
Bearbeiten Sie /etc/pam.d/sshd:
# /etc/pam.d/sshd
# Am Anfang der Datei hinzufügen:
auth required pam_google_authenticator.so
# Oder nach @include common-auth:
@include common-auth
auth required pam_google_authenticator.soSSH-Daemon konfigurieren
Bearbeiten Sie /etc/ssh/sshd_config:
# Challenge-Response aktivieren
ChallengeResponseAuthentication yes
# Oder ab OpenSSH 8.4:
KbdInteractiveAuthentication yes
# PAM aktivieren (sollte bereits yes sein)
UsePAM yes
# Mehrere Authentifizierungsmethoden
AuthenticationMethods keyboard-interactiveSSH neu starten
# WICHTIG: Erst testen, aktuelle Verbindung offen halten!
systemctl restart sshdVerschiedene 2FA-Modi
Nur TOTP (Passwort + Code)
# /etc/pam.d/sshd
auth required pam_google_authenticator.so# /etc/ssh/sshd_config
AuthenticationMethods keyboard-interactiveLogin:
Password: [Passwort]
Verification code: [6-stelliger Code]SSH-Key + TOTP
# /etc/pam.d/sshd
auth required pam_google_authenticator.so
# /etc/ssh/sshd_config
AuthenticationMethods publickey,keyboard-interactiveLogin:
(Key wird automatisch verwendet)
Verification code: [6-stelliger Code]SSH-Key ODER (Passwort + TOTP)
# /etc/ssh/sshd_config
AuthenticationMethods publickey keyboard-interactiveMit Key: nur Key Ohne Key: Passwort + TOTP
Optionen für pam_google_authenticator
# /etc/pam.d/sshd
# Basis
auth required pam_google_authenticator.so
# Mit Optionen:
auth required pam_google_authenticator.so nullok
# nullok = Benutzer ohne 2FA können sich noch anmelden (für Migration)
auth required pam_google_authenticator.so secret=/etc/google-authenticator/${USER}
# Zentrale Speicherung der SecretsWichtige Optionen
| Option | Bedeutung | |--------|-----------| | nullok | Benutzer ohne .google_authenticator können sich anmelden | | secret=PATH | Alternativer Speicherort für Secret | | no_increment_hotp | HOTP-Counter nicht erhöhen | | forward_pass | Passwort an nächstes PAM-Modul weiterleiten |
Benutzer ohne 2FA erlauben (Migration)
Während der Einführung können Benutzer ohne 2FA zugelassen werden:
# /etc/pam.d/sshd
auth required pam_google_authenticator.so nullokNach vollständiger Migration nullok entfernen.
2FA für bestimmte Benutzer/Gruppen
Nur für Gruppe "ssh-2fa"
# /etc/pam.d/sshd
auth [success=1 default=ignore] pam_succeed_if.so user notingroup ssh-2fa
auth required pam_google_authenticator.soBenutzer zur Gruppe hinzufügen:
groupadd ssh-2fa
usermod -aG ssh-2fa usernameNur für bestimmte Benutzer
# /etc/pam.d/sshd
auth [success=1 default=ignore] pam_succeed_if.so user != admin
auth required pam_google_authenticator.soBackup und Recovery
Secret exportieren
cat ~/.google_authenticator
# Erste Zeile ist der Secret KeyAuf neuem Gerät einrichten
Secret Key manuell in Authenticator-App eingeben.
Recovery ohne Smartphone
1. Mit Notfall-Code anmelden 2. Neuen QR-Code generieren:
google-authenticatorFür Root-Benutzer
Immer einen alternativen Zugang sicherstellen:
- Konsolen-Zugriff (KVM, IPMI)
- Rescue-System des Providers
- Zweiter Admin-Account
Troubleshooting
"Permission denied"
# PAM-Logs prüfen
tail -f /var/log/auth.log
# SELinux/AppArmor prüfen
getenforceZeitprobleme (Code ungültig)
TOTP basiert auf Uhrzeit. Server und Smartphone müssen synchron sein:
# Server-Zeit prüfen
date
# NTP installieren/aktivieren
apt install systemd-timesyncd
timedatectl set-ntp true
timedatectl statusAussperren vermeiden
1. Aktuelle SSH-Session offen halten 2. Zweite Session zum Testen öffnen 3. Erst dann erste Session schließen
# In Session 1:
systemctl restart sshd
# Session 1 bleibt offen!
# In neuer Session 2:
ssh user@server
# Testen ob Login funktioniert2FA deaktivieren (Notfall)
Falls ausgesperrt, über Konsole:
# Als root über Konsole
rm /home/user/.google_authenticator
# Oder PAM-Zeile auskommentieren
nano /etc/pam.d/sshd
# auth required pam_google_authenticator.soSicherheitshinweise
Do's
- Backup-Codes sicher aufbewahren (offline)
- Server-Zeit aktuell halten (NTP)
- Regelmäßig Backup-Codes erneuern
- Root-Konsolen-Zugang als Backup
Don'ts
- Backup-Codes nicht auf dem Server speichern
- Secret nicht in Cloud-Diensten speichern
- Nicht ohne Backup-Plan aktivieren
Alternativen
Hardware-Token (YubiKey)
apt install libpam-u2f
pamu2fcfg > ~/.config/Yubico/u2f_keysSSH-Zertifikate mit kurzem TTL
Statt 2FA: Zertifikate, die nach kurzer Zeit ablaufen.
Zusammenfassung
# 1. Installieren
apt install libpam-google-authenticator
# 2. Als Benutzer einrichten
google-authenticator
# 3. PAM konfigurieren
# /etc/pam.d/sshd:
auth required pam_google_authenticator.so
# 4. SSH konfigurieren
# /etc/ssh/sshd_config:
ChallengeResponseAuthentication yes
UsePAM yes
# 5. SSH neu starten (mit offener Session!)
systemctl restart sshdFazit
2FA für SSH bietet erheblichen Schutz gegen Passwort-Diebstahl und Brute-Force-Angriffe. Die Einrichtung mit Google Authenticator ist unkompliziert. Wichtig: Immer einen Backup-Zugang sicherstellen (Konsole, Notfall-Codes) und die Einführung schrittweise mit nullok vornehmen.