===== 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
==== Siehe auch ====
* [[sammlung:pam|PAM - Pluggable Authentication Modules]]
* [[sammlung:ssh|SSH]]
* [[sammlung:benutzerverwaltung|Benutzerverwaltung]]
* [[sammlung:systemd|systemd]]
* [[sammlung:wichtige_konfigurationsdateien|Wichtige Konfigurationsdateien]]
----
{{tag>cli authentication security remote-access}}
----