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)
- Solaris: http://www.sun.com/software/solaris/pam/
- ...
- Linux-PAM: http://www.kernel.org/pub/linux/libs/pam/
- 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)
- benutzen Funktionen der PAM-API
- 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
)
- implementieren PAM-SPI
- 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!
-
- Files in
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]
- simple
-
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 alsroot
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
(auchpam_access
) -
pam_limits
- Einstellen von Limits
definiert in/etc/security/limits.conf
-
pam_console
- Übertragen/Entziehen von Berechtigungen des Konsole-Nutzers
definiert inetc/security/console.apps
und/etc/security/console.perms
PAM-Module
- zahlreiche Module gehören zum Paketumfang von Linux-PAM
- siehe http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html
-
pam_listfile
- Zugangssteuerung auf Basis von ASCII-Files
-
pam_userdb
- zusätzliche lokale Passwort-Datenbasis auswerten
-
pam_mkhomedir
- HOME-Verzeichnis bei erster Anmeldung des Nutzers einrichten
-
pam_time
- zeitabhängige Zugangssteuerung
-
- siehe http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html
- einige PAM-Module als eigenständige Projekte, teilweise in Paketform in Distributionen integriert
-
pam_krb5
- Original-Quelle: http://people.redhat.com/nalin/pam_krb5/
-
pam_ldap
,pam_ccreds
- Original-Quelle: http://www.padl.com/Contents/OpenSourceSoftware.html
-
pam_login_access
- https://www-user.tu-chemnitz.de/~mibe/sw/OpenPBS/#pam_login_access
-
pam_afsgroup
- http://chu.in-chemnitz.de/download/mod_auth_pam_2.0.tgz
-
pam_afs
- Bestandteil von OpenAFS (obsolet!, besser:
pam_krb5
)
-
- Beschreibungen:
type
,module_arguments
- Manuals
- Web-Seiten
- C-Quellen studieren
- Modul-Argumente
- modulspezifisch
- wenige Konventionen
-
try_first_pass
-
use_first_pass
-
debug
-
- Umfang, Wirkungsweise, Default-Annahmen, Notation, ... aus Beschreibung (besser: C-Quellen)
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 erstersufficient
Modul) - fehlerhafte Verwendung der
value=action
Spezifikation (default=done
)
- fehlerhafte Verwendung von PAM-Modulen, die immer Erfolg liefern (
Sicherheit
- Berechtigungen
- Konfiguration:
/etc/pam.d/
- PAM-Module:
/lib/security
- PAM-Module werden oft als
root
ausgeführt, bzw. aus setuid-Programmen (su
,sudo
)
- Konfiguration:
- 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
- http://www.kernel.org/pub/linux/libs/pam/ - Linux-PAM (primary distribution site)