Inhaltsverzeichnis
PAM-Konfiguration für SSHD erklärt
Die PAM-Konfiguration für den SSH-Dienst (sshd) ist typischerweise sehr schlank und nutzt include-Direktiven, um zentrale Authentifizierungsregeln wiederzuverwenden. Diese Seite erklärt den Aufbau am Beispiel einer Standard-SSHD-Konfiguration.
Die SSHD PAM-Konfiguration
Datei: /etc/pam.d/sshd
#%PAM-1.0 auth include system-remote-login account include system-remote-login password include system-remote-login session include system-remote-login
q
Zeilenweise Erklärung
1. PAM-Version Header
#%PAM-1.0
| Element | Bedeutung |
|---|---|
| #%PAM-1.0 | Gibt die verwendete PAM-Version an. Dies ist eine Kommentarzeile, die die PAM-Bibliothek informiert |
| Zweck | Kompatibilitätskennzeichnung, sollte bei allen PAM-Konfigurationsdateien vorhanden sein |
2. Die vier Modultypen
Die Konfiguration definiert für jeden der vier PAM-Modultypen eine Regel:
auth include system-remote-login
| Element | Bedeutung |
|---|---|
| auth | Modultyp: Authentifizierung - prüft Benutzeridentität (Passwort, Keys, etc.) |
| include | Control Flag: Bindet eine andere PAM-Konfigurationsdatei ein |
| system-remote-login | Name der einzubindenden Konfigurationsdatei (/etc/pam.d/system-remote-login) |
account include system-remote-login
| Element | Bedeutung |
|---|---|
| account | Modultyp: Account-Management - prüft ob Zugriff erlaubt ist (z.B. Account gesperrt, Zeitbeschränkungen) |
password include system-remote-login
| Element | Bedeutung |
|---|---|
| password | Modultyp: Passwort-Management - wird bei Passwortänderungen verwendet |
session include system-remote-login
| Element | Bedeutung |
|---|---|
| session | Modultyp: Session-Management - Aktionen vor/nach Login (z.B. Logs, Home-Verzeichnis mounten) |
Was bedeutet "include"?
Das include Control Flag hat eine besondere Funktion:
- Es bindet eine andere PAM-Konfigurationsdatei vollständig ein
- Alle Regeln der eingebundenen Datei werden verarbeitet, als wären sie direkt hier geschrieben
- Bei Fehler in der eingebundenen Datei wird der Stack trotzdem fortgesetzt (anders als bei substack)
- Dies ermöglicht zentrale, wiederverwendbare Konfigurationen
Vorteil: Änderungen an system-remote-login gelten automatisch für alle Dienste, die sie einbinden (SSH, FTP, etc.)
Die eingebundene Datei system-remote-login
Speicherort
# Datei ansehen cat /etc/pam.d/system-remote-login # Oder mit sudo falls Rechte fehlen sudo cat /etc/pam.d/system-remote-login
Typischer Inhalt von system-remote-login
Arch Linux / Manjaro:
#%PAM-1.0 auth required pam_tally2.so onerr=succeed file=/var/log/tallylog auth required pam_shells.so auth required pam_nologin.so auth include system-login account required pam_tally2.so account required pam_access.so account required pam_nologin.so account include system-login password include system-login session optional pam_motd.so motd=/etc/motd session optional pam_mail.so dir=/var/spool/mail standard quiet session include system-login
Debian / Ubuntu:
#%PAM-1.0 auth required pam_env.so auth required pam_unix.so nullok auth required pam_nologin.so account required pam_unix.so account required pam_nologin.so password required pam_unix.so sha512 shadow session required pam_limits.so session required pam_unix.so session optional pam_motd.so session optional pam_lastlog.so
Red Hat / CentOS / Fedora:
#%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account include password-auth password include password-auth session optional pam_keyinit.so force revoke session include password-auth session optional pam_motd.so
Was wird tatsächlich geprüft?
Bei einem SSH-Login durchläuft PAM folgende Schritte (vereinfacht):
1. Auth-Phase (Authentifizierung)
- pam_shells.so: Prüft ob die Shell des Benutzers in /etc/shells erlaubt ist
- pam_nologin.so: Prüft ob /etc/nologin existiert (verhindert Login außer für root)
- pam_unix.so: Prüft Passwort gegen /etc/shadow oder akzeptiert SSH-Key
- pam_tally2.so / pam_faillock.so: Zählt Fehlversuche und sperrt bei zu vielen
2. Account-Phase (Zugriffsprüfung)
- pam_unix.so: Prüft ob Account abgelaufen oder gesperrt ist
- pam_access.so: Prüft /etc/security/access.conf für Zugriffsbeschränkungen
- pam_nologin.so: Erneute Prüfung in Account-Phase
- pam_time.so: (Falls konfiguriert) Prüft zeitbasierte Zugriffsbeschränkungen
3. Password-Phase (Passwortänderung)
- Wird nur relevant wenn Passwort geändert werden soll (passwd-Kommando)
- pam_unix.so: Handhabt die eigentliche Passwortänderung
- pam_pwquality.so: (Falls konfiguriert) Prüft Passwortstärke
4. Session-Phase (Session-Setup)
- pam_limits.so: Setzt Ressourcen-Limits aus /etc/security/limits.conf
- pam_unix.so: Loggt Login-Event
- pam_motd.so: Zeigt Message of the Day (/etc/motd)
- pam_lastlog.so: Zeigt letzten Login und speichert aktuellen
- pam_umask.so: Setzt umask für die Session
Praktische Beispiele
1. Nachvollziehen was beim SSH-Login passiert
# SSHD PAM-Konfiguration anzeigen cat /etc/pam.d/sshd # Eingebundene Datei anzeigen cat /etc/pam.d/system-remote-login # Falls weitere includes vorhanden, diese auch anzeigen cat /etc/pam.d/system-login cat /etc/pam.d/password-auth
2. SSH-Login-Logs analysieren
# PAM-Aktivitäten im Journal sudo journalctl -u sshd | grep pam # Authentifizierungs-Logs sudo tail -f /var/log/auth.log # Debian/Ubuntu sudo tail -f /var/log/secure # RHEL/CentOS # Fehlgeschlagene Login-Versuche sudo journalctl -u sshd | grep "Failed password"
3. SSHD PAM-Konfiguration anpassen
Warnung: Änderungen sollten vorsichtig vorgenommen werden. Immer eine offene SSH-Session zum Testen behalten!
Beispiel: Zwei-Faktor-Authentifizierung hinzufügen
#%PAM-1.0 # Google Authenticator VOR system-remote-login auth required pam_google_authenticator.so auth include system-remote-login account include system-remote-login password include system-remote-login session include system-remote-login
Beispiel: Zusätzliche Session-Logs
#%PAM-1.0 auth include system-remote-login account include system-remote-login password include system-remote-login session include system-remote-login # Zusätzliches Logging nach includes session optional pam_exec.so /usr/local/bin/log-ssh-session.sh
4. Eigene include-Datei für Remote-Zugriffe erstellen
# Eigene Konfiguration für alle Remote-Dienste sudo nano /etc/pam.d/my-remote-login
Inhalt von my-remote-login:
#%PAM-1.0 # Strenge Regeln für Remote-Zugriff auth required pam_faillock.so preauth deny=3 unlock_time=1800 auth required pam_unix.so auth required pam_faillock.so authfail deny=3 unlock_time=1800 account required pam_faillock.so account required pam_unix.so account required pam_time.so password required pam_pwquality.so retry=3 minlen=12 password required pam_unix.so sha512 shadow session required pam_limits.so session required pam_unix.so session optional pam_lastlog.so
Dann in /etc/pam.d/sshd:
#%PAM-1.0 auth include my-remote-login account include my-remote-login password include my-remote-login session include my-remote-login
Unterschiede zwischen Distributionen
| Distribution | Haupt-Include-Datei | Besonderheiten |
|---|---|---|
| Arch Linux | system-remote-login | Nutzt system-login als zweite Ebene |
| Debian/Ubuntu | common-auth, common-account, common-password, common-session | Mehrere separate includes pro Typ |
| RHEL/CentOS | password-auth, system-auth | password-auth für Remote, system-auth für lokal |
| SUSE | common-auth-pc | Eigenes Schema mit -pc (Pluggable Client) |
Include-Hierarchie verstehen
Arch Linux Beispiel:
/etc/pam.d/sshd
└── include: system-remote-login
└── include: system-login
└── required: pam_unix.so, pam_systemd.so, etc.
Debian/Ubuntu Beispiel:
/etc/pam.d/sshd
├── auth → include: common-auth
├── account → include: common-account
├── password→ include: common-password
└── session → include: common-session
Debugging und Troubleshooting
PAM-Debug aktivieren
# In jeder Zeile "debug" hinzufügen auth required pam_unix.so debug # Logs anzeigen sudo journalctl -u sshd -f
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| SSH-Login funktioniert nicht | Tippfehler in PAM-Config | Include-Dateien prüfen, Syntax kontrollieren |
| „Permission denied“ trotz richtigem Passwort | pam_nologin aktiv | /etc/nologin entfernen oder als root einloggen |
| Alle Logins geblockt | Fehlerhafte include-Datei | Im Notfall mit init=/bin/bash booten und korrigieren |
| Key-Auth funktioniert, Passwort nicht | pam_unix.so fehlt in auth | Include-Dateien prüfen, pam_unix.so ergänzen |
Test-Strategie
# 1. Aktuelle Config sichern sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup sudo cp /etc/pam.d/system-remote-login /etc/pam.d/system-remote-login.backup # 2. Änderungen vornehmen sudo nano /etc/pam.d/sshd # 3. SSH-Dienst neu laden (NICHT beenden!) sudo systemctl reload sshd # 4. In NEUER Session testen (alte Session OFFEN lassen!) ssh user@localhost # 5. Bei Problemen: Aus alter Session zurückrollen sudo cp /etc/pam.d/sshd.backup /etc/pam.d/sshd sudo systemctl reload sshd
Sicherheitshinweise
- Niemals ohne Backup: Immer Kopie der Originaldatei erstellen
- Offene Session: Bei Remote-Änderungen immer eine aktive SSH-Session offen halten
- Schrittweise testen: Nie mehrere Änderungen gleichzeitig
- Root-Zugang sichern: Alternative Zugangswege offen halten (Konsole, IPMI, VNC)
- Vorsicht mit required: Ein fehlendes required-Modul verhindert alle Logins
- Logs überwachen: Nach Änderungen sofort Logs prüfen
Best Practices
- Zentrale Konfiguration: include nutzen statt alles in sshd zu schreiben
- Dokumentation: Änderungen mit Kommentaren versehen (# am Zeilenanfang)
- Modular arbeiten: Eigene include-Dateien für spezifische Anforderungen
- Testing: Erst in Testumgebung, dann produktiv
- Version Control: /etc/pam.d/ in Git versionieren
- Monitoring: PAM-Fehler in Monitoring-System aufnehmen
