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 Sicherheit

TOTP (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-authenticator

CentOS/AlmaLinux

dnf install epel-release
dnf install google-authenticator

Einrichtung pro Benutzer

1. Google Authenticator initialisieren

Als der Benutzer (nicht root):

google-authenticator

2. 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) y

3. 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
  56789012

Diese 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.so

SSH-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-interactive

SSH neu starten

# WICHTIG: Erst testen, aktuelle Verbindung offen halten!
systemctl restart sshd

Verschiedene 2FA-Modi

Nur TOTP (Passwort + Code)

# /etc/pam.d/sshd
auth required pam_google_authenticator.so
# /etc/ssh/sshd_config
AuthenticationMethods keyboard-interactive

Login:

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-interactive

Login:

(Key wird automatisch verwendet)
Verification code: [6-stelliger Code]

SSH-Key ODER (Passwort + TOTP)

# /etc/ssh/sshd_config
AuthenticationMethods publickey keyboard-interactive

Mit 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 Secrets

Wichtige 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 nullok

Nach 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.so

Benutzer zur Gruppe hinzufügen:

groupadd ssh-2fa
usermod -aG ssh-2fa username

Nur für bestimmte Benutzer

# /etc/pam.d/sshd
auth [success=1 default=ignore] pam_succeed_if.so user != admin
auth required pam_google_authenticator.so

Backup und Recovery

Secret exportieren

cat ~/.google_authenticator
# Erste Zeile ist der Secret Key

Auf 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-authenticator

Fü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
getenforce

Zeitprobleme (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 status

Aussperren 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 funktioniert

2FA 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.so

Sicherheitshinweise

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_keys

SSH-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 sshd

Fazit

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.