PAM: Konfiguration von Authentisierungsverfahren
Einführung
PAM: Plugable Authentication Modules
- Entwicklung von SunSoft
- seit 1995 RFC der OpenGroup: Open Group RFC 86
- verschiedene Implementationen (Abweichungen und/oder Erweiterungen der Spezifikation)
- Framework
- Schnittstellen und APIs
- Trennung zwischen
- Anwendungsentwickler
- Entwicklern von Authentisierungsverfahren
- Systemadministratoren
- Linux-PAM
- aktuelle Version [25.08.2006]: 0.99.6
Distribution |
Linux-PAM-Version |
RHEL 3 |
0.75 |
|
RHEL 4 |
0.77 |
|
Fedora Core 4 |
0.79 |
|
Fedora Core 5 |
0.99.3 |
Funktionsweise
Ziele
- Authentisierungsverfahren auswählbar durch Systemadministrator
- der Betreiber eines Systems und nicht der Softwareentwickler
- Authentisierungsverfahren auswählbar pro Anwendung
- Art des Zugangs zum System kann unterschiedliche Verfahren erfordern (login an der Konsole vs. login über Netze)
- Kommunikation mit dem Benutzer durch die Anwendung
- Passwort-Dialoge o. ä. muss Anwendung übernehmen (eigene Dialogfenster, Übertragung durch Netzwerk)
- Alternative Authentisierungsverfahren für eine Anwendung
- Login über Kerberos oder lokal gespeicherte Passworte
- Kombination von Authentisierungsverfahren für eine Anwendung
- ohne erneuten Dialog mit dem Benutzer (mehrere Verfahren: ein Passwort)
- mit erneutem Dialog mit dem Benutzer (mehrere Verfahren: mehrere Passworte)
- Änderung der Verfahren hat keinen Einfluss auf Anwendung
- Trennung zwischen Entwicklern von Anwendungen und Authentsierungsverfahren
- modulares, erweiterbares Modell zur Anmeldung und zum Passwort-, Account- und Sitzungsmanagement
- nicht beschränkt auf Authentisierung
- abwärtskompatibel zu traditionellen Verfahren
- Übergang möglichst unbemerkt von Benutzern
Komponenten
- Anwendung
- benutzen Funktionen der PAM-API
-
pam_start()
-
pam_authenticate()
-
pam_setcred()
-
pam_acct_mgmt()
-
pam_chauthtok()
-
pam_open_session()
-
pam_close_session()
- ...
- PAM-API ist implementiert in
libpam.so
- implementiert Konversationsfunktion (gerufen vom Modul, zur Übergabe von Authentisierungsinformationen)
- Modul
- implementieren PAM-SPI
-
pam_sm_authenticate()
-
pam_sm_setcred()
-
pam_sm_acct_mgmt()
-
pam_sm_chauthtok()
-
pam_sm_open_session()
-
pam_sm_close_session()
- Funktionen unterteilen den Modul in einzeln konfigurierbare Managementaufgaben (Authentisierung, Passwort-, Account- und Sitzungsmanagement)
- Shared Libraries in
/lib/security
( /lib64/security
)
- Konfiguration
- Files in
/etc/pam.d/
- pro Anwendung ein File
- Anwendungen benutzen PAM-Service-Name (oftmals der Name der Anwendnung selbst) um ihre Konfiguration zu finden
- existiert für den keine Konfiguration, wird die Konfiguration des Servicenamens
other
benutzt
-
other
muss also sehr restriktiv sein!
Konfiguration
Konfigurationsfiles
- traditionell:
/etc/pam.conf
- jeder Eintrag beginnt mit PAM Service Name
- moderner: pro Anwendung ein File in
/etc/pam.d/
- Filename ist PAM Service Name
Aufbau der Einträge
jeder Eintrag auf einer Zeile
[service] type control module-path module-arguments
-
[service]
- PAM-Service-Name (nur in
/etc/pam.conf
)
-
type
- Modultyp, Funktion
- auth
- authentication / credential management - Verfikation der Identität des Benutzers und Zuweisen/Entziehen von credentials (Gruppenmitgliedschaft, Kerberos TGT, AFS Token, ...)
- account
- account management - Bedingungen für den Zugang zum System (nur über Konsole, nur zu bestimmten Tageszeiten, nutzerspezifisch)
- password
- password management - Aktualisierung der Authentisierungsdaten
- session
- session management - Einstellung für die Sitzung (limits, Zugriffsberechtigungen)
-
control
- Einfluss von Erfolg/Misserfolg auf Gesamtergebnis (pro
type
kann es mehrere Einträge geben - stacking)
zwei Syntax-Varianten:
- simple
- required
- Erfolg ist notwendig für Gesamtbewertung: Erfolg, Fehler führt zur Gesamtbewertung: Misserfolg, es werden trotzdem alle weiteren Module von diesem
type
ausgeführt
- requisite
- Erfolg ist notwendig für Gesamtbewertung: Erfolg, Fehler führt zur Gesamtbewertung: Misserfolg und termininiert den Authentisierungsprozess
- sufficient
- Erfolg ist ausreichend für Gesamtbewertung: Erfolg, Fehler beeinflusst Gesamtbewertung nicht, Erfolg terminiert den Authentisierungsprozess, Ergebnis vorheriger required Module wird berücksichtigt
- optional
- Erfolg oder Fehler hat nur Bedeutung, wenn es der einzige Module für diesen
type
ist
- include (nur neuere Versionen von Linux-PAM)
- alle Zeilen desselben
type
aus einem als Argument angegeben File einbeziehen
- komplex
-
[value=action ...]
- paarweise Angabe von Rückgabewert (
value
) und Verhalten (action
)
-
value
- Rückgabewert des Moduls (success, open_err, auth_err, ... - vollständige Liste in
/usr/include/security/_pam_types.h
)
default: alle nicht genannten Werte
-
action
- ausführende Aktion
- <N>
- die <N> folgenden Module im Stack überspringen
- ignore
- Ergebnis wird ignoriert
- bad
- Ergebnis fließt als Fehler in die Gesamtwertung ein
- die
- Ergebnis als Fehler werten und terminieren des Authentisierungsprozesses
- ok
- übernimmt den Rückkehrwert als Ergebnis und überschreibt bisheriges Ergebnis des Stacks, jedoch: Fehler werden nicht überschrieben
- done
- wie ok, zusätzlich: Authentisierungsprozess wird terminiert
- reset
- bisheriges Ergebnis zurücksetzen und neu beginnen mit nächstem Eintrag im Stack
- Entsprechungen
- required
-
[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
- requisite
-
[success=ok new_authtok_reqd=ok ignore=ignore default=die]
- sufficient
-
[success=done new_authtok_reqd=done default=ignore]
- optional
-
[success=ok new_authtok_reqd=ok default=ignore]
-
module-path
- voller Pfadname des PAM-Moduls oder Pfadname relativ zu
/lib/security
, der Verzeichnisname in der Pfadangabe /lib/security/$ISA
verweist auf das Architektur-Verzeichnis der Maschine (/lib/security
bzw. /lib64/security
)
-
module-arguments
- Argumente, die das Verhalten des Modules steuern (modulspezifisch)
Beispiel
- PAM-Konfiguration für
login
# cat /etc/pam.d/login
auth required pam_securetty.so
auth required pam_env.so
auth required pam_nologin.so
auth sufficient pam_krb5.so
auth sufficient pam_unix.so likeauth nullok
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_login_access.so
account optional pam_krb5.so
password required pam_deny.so
session required pam_limits.so
session optional pam_krb5.so
session required pam_unix.so
session optional pam_console.so
-
pam_securetty
- Login als
root
nur an "sicheren" Terminals
definiert in /etc/securetty
-
pam_env
- Setzen/Löschen von Umgebunsvariablen
definiert in /etc/security/pam_env.conf
-
pam_nologin
- falls
/etc/nologin
existiert, nur noch Login als root
erlauben
-
pam_krb5
- Authentisierung via Kerberos V5
Konfiguration in /etc/krb5.conf
-
pam_unix
- Authentisierung via traditioneller Unix-Mittel (Passwort-Hashes - md5/crypt)
beeinflusst durch /etc/nsswitch.conf
-
pam_deny
- liefert immer Misserfolg
-
pam_login_access
- Zugangsvoraussetzungen in
/etc/login.access
(auch pam_access
)
-
pam_limits
- Einstellen von Limits
definiert in /etc/security/limits.conf
-
pam_console
- Übertragen/Entziehen von Berechtigungen des Konsole-Nutzers
definiert in etc/security/console.apps
und /etc/security/console.perms
PAM-Module
Hinweise
pam_stack / include
- viele Anwendungen kann man (weitesgehend) identisch konfigurieren
- gemeinsame Teile in einer Konfiguration zusammenfassen:
/etc/pam.d/system-auth
- anwendungsspezifische Teile im eigenen Konfigurationsfile und Verweis auf gemeinsame Konfiguration
- Anmerkung:
- Konventionen in Distributionen
- Tools zur Manipulation der Konfigfiles (
/usr/bin/system-config-authentication
, /usr/bin/authconfig
, ...)
# cat /etc/pam.d/system-auth
auth required pam_env.so
auth required pam_nologin.so
auth sufficient pam_krb5.so
auth sufficient pam_unix.so likeauth nullok
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_login_access.so
account optional pam_krb5.so
password required pam_deny.so
session required pam_limits.so
session optional pam_krb5.so
session required pam_unix.so
session optional pam_console.so
# cat /etc/pam.d/login
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
# cat /etc/pam.d/gdm
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
- oder (neuere Linux-PAM-Versionen):
# cat /etc/pam.d/login
auth required pam_securetty.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
Fehlkonfigurationen
- kein login mehr möglich
- nicht existierende oder defekte PAM-Module (Tippfehler, Fehler beim Linken der Module)
- fehlende Konfig-Files (
/etc/pam.d/
gelöscht=)
- login für jedermann
- fehlerhafte Verwendung von PAM-Modulen, die immer Erfolg liefern (
pam_permit
als erster sufficient
Modul)
- fehlerhafte Verwendung der
value=action
Spezifikation (default=done
)
Sicherheit
- Berechtigungen
- Konfiguration:
/etc/pam.d/
- PAM-Module:
/lib/security
- PAM-Module werden oft als
root
ausgeführt, bzw. aus setuid-Programmen (su
, sudo
)
- Netzwerkdienste
- PAM schützt die Übertragung von vertraulichen Informationen nicht - das ist Aufgabe der Anwendung
- PAM-Module von Drittanbietern
- Quellenstudium ist Pflicht
Änderungen und Anpassungen
- orientieren an mitgelieferten Konfigurationen
- Testen mit unkritischen Anwendungen
- Verhalten bei fehlerhaften Eingaben testen
- Testszenarien entwickeln und bei Änderungen erneut durchlaufen
Links