PAM - Pluggable Authentication Modules
 

Inhalt

Das Problem
Bisheriger Stand
Neue Anforderungen
Zusammenfassung

Was ist PAM?
Begriff
Architektur
Historie

Nutzung von PAM
Systemadministrator
Anwendungsentwickler
Modulentwickler

Fallbeispiel
PPP-Einwahl


Anhang
Links/Literatur
Impressum

Folien

 

 

Das Problem

Es gibt auf UNIX-Rechnern verschiedene Services, die in der einen oder anderen Weise Zugang zu dem entsprechendem System ermöglichen (dies gilt natürlich nicht nur für UNIX-Systeme, aber ich möchte mich im folgenden auf UNIX und ähnliche Systeme, insbesondere das fantastische Linux beschränken). Beispiele dafür sind z.B. der ftp-Dämon und der telnet-Dämon. Diese sogenannten system-entry Services müssen nun normalerweise vor Gewährung der eigentlichen Dienste bzw. dem Verschaffen von Systemzugang feststellen, wer der Benutzer ist und ob diesem Benutzer Zugang oder Service gewährt werden kann.

Die Feststellung des Benutzers erfolgt dabei normalerweise so, daß der Benutzer gefragt wird, wer er zu sein vorgibt und danach z.B. mittels Paßwortabfrage überprüft wird, ob das wirklich der Fall ist. In UNIX erfolgt diese Identifikation und Authentifizierung traditionell über den passwd-Mechanismus. Also über die Datei /etc/passwd und entsprechende shadow-Dateien. Jede einzelne Anwendung, wie die schon angeprochenen Dämons für ftp und telnet, mußte nun bisher die entsprechenden Mechanismen implementieren. Es ist wohl offensichtlich, daß bei mehrfacher Implementierung der gleichen Sache auch die Fehleranfälligkeit steigt!

Außerdem gibt es Probleme, wenn der zugrunde liegende Authenifizierungmechanismus geändert werden soll. Dann ist normalerweise ein Austausch der Applikation bzw. eine Änderung des Quellcodes, ein Neuübersetzen und Installieren notwendig. Ein Beispiel dafür ist z.B. der Austausch des Paßwort-Mechanismus gegen ein Chipkarten-basiertes oder ein biometrische Verfahren (Fingerabdruck, Gesichtserkennung etc.). In besonders sicherheitssensitiven Bereichen könnte das allein evtl. noch nicht ausreichend sein und die Anforderung bestehen, mehrere Verfahren (alternativ oder hintereinander) zu benutzen. Desweiteren erscheint es wünschenswert, in heterogenen Umgebungen nur jeweils eine Benutzerverwaltung aufzubauen bzw. zu pflegen und diese dann unter allen Systemen nutzen zu können.

Zusammengefaßt hier noch einmal die Hauptnachteile der bisherigen Lösung:

  • hoher Aufwand (da jede Anwendung Identifikation und Authentifizierung des Users selbst implementiert)
  • Fehleranfälligkeit (sieh vorheriger Punkt, insbesondere auch nach Änderung des Auth.-Mechanismus)
  • Anwendungsentwicklung hält nicht mit der Entwicklung der Sicherheitstechnologien schritt
  • Änderung der Authentifizierungsmechanismen nur durch Austausch/Modifikation der Anwendungen
  • neue Mechanismen (z.B. biometrische Verfahren) sind nur schwer integrierbar
  • oft eingeschränktes Customizing der Anwendung an unterschiedliche Sicherheitserfordernisse

Was ist PAM?

Um die oben beschriebenen Nachteile zu beheben, wurde nun das sogenannte PAM-Framework entwickelt. PAM trennt die einzelnen Anwendung von den Mechanismen zur Benutzerauthentifizierung. Dabei steht PAM für Plaggable Authentication Modules. Der Name deutet dabei schon die Möglichkeiten zur Verwendung von unterschiedlichen Modulen (Modules) zur Authentifikation (Authentication) und eine hohe Konfigurierbarkeit (Pluggable) der Gesamtlösung  durch den System-Administrator an.

Das PAM-Framework ist ein Set von Shared Libraries. Die Module liegen ebenfalls als Shared Libraries vor und implementieren jeweils einen bestimmten Mechanismus. Der Administrator kann nun (abhängig vom Sicherheitsbedürfnis, Umgebung, persönlichen Vorlieben etc.) für jede einzelne Anwendung festlegen, welche Mechanismen zum Einsatz kommen sollen (d.h. also welche Module verwendet werden). Dabei könne auch mehrer Module hintereinander zum Einsatz kommen (-> Module-Stacking) und durch die Verwendung mehrer Authentifizierungsmechanismen ein Unified-Login für den Benutzer erreicht werden.

Wie Module, Framework und Applikationen zusammenarbeiten verdeutlicht (hoffentlich) noch einmal das folgende Bild:

Neben dem:

  • Authentication Management

werden auch noch die folgenden Management-Aufgaben von PAM abgedeckt:

  • Account Management
  • Session Management
  • Passwort Management

Das Ganze wird ebenfalls über Module abgewickelt. Jedes PAM-Modul muß mindestens einen, kann aber auch mehrere dieser Management-Tasks abdecken.

An dieser Stelle noch ein paar historische Daten: PAM wurde ursprünglich von der Firma Sun für ihr UNIX-Derivat Sun Solaris entwickelt. 1995 wurde das Ganze in der RFC 86.0 der Open Software Foundation (OSF) veröffentlicht. Seitdem wird diese Technologie auch schrittweise in anderen UNIX-Systeme eingeführt (beispielsweise in Hewlett-Packard's HP-UX seit Version 10.20). Schon seit geraumer Zeit gibt es das Projekt Linux-PAM, das sich zur Aufgabe gemacht hat, ein freies PAM speziell für Linux aber auch für andere Systeme zu entwickeln. Ergebnisse liegen schon vor und sind auch schon in die meisten Linux-Distributionen eingeflossen (z.B. SuSE-Linux ab Version 6.1). Mit der Linux-üblichen Dynamik sind auch schon sehr viele Module und PAM-enabled'te Anwendungen verfügbar. 

Für die Zukunft scheint PAM eine wichtige Rolle für ein Single Sign-On zu übernehmen. Ein entsprechender Spec-Entwurf der X/OPEN liegt als X/OPEN Single Sign-On Service (XSSO) liegt bereits vor!

Nutzung von PAM

PAM aus Sicht des Systemadministrators

Die folgenden Beispiele und Hinweise sind Linux-PAM-spezifisch. Obwohl sich andere Systeme / PAM-Implementierungen größtenteils analog verhalten sollten, kann es doch an der einen oder anderen Stelle kleinere oder größere Unterschiede zu geben. Erster Anlaufpunkt für entsprechende Probleme sollte also die zum jeweiligen System gelieferte Dokumentation sein!

Der Systemadministrator konfiguriert das PAM-Framework über ein oder mehrere Konfigurationsdateien. Bei der älteren Variante kommt eine zentrale Konfigurationsdatei /etc/pam.conf zum Einsatz, die wie folgt aufgebaut ist:

/etc/pam.conf

service-name module-type control-flag module-path args
Name der Anwendung, z.B.:
  • telnet 
  • ftp
möglich:
  • auth
  • account
  • session
  • password
möglich:
  • required
  • requisite
  • sufficient
  • optional
Modulname evtl. mit Pfadangabe, z.B.:
  • pam_unix.so
  • pam_nologin.so
Argumente für Modul, z.B.:
  • nolocal

Der module-type spiegelt die zu übernehmende Management-Aufgabe wieder, während das control-flag angibt, wie im Falle eines fehlerhaft oder korrekt abgearbeiteten Moduls weiter vorgegangen wird. Es wird dabei folgendermaßen verfahren:

required:
  • Modul muß fehlerfrei beendet werden

  • Fehler werden erst nach Abarbeitung aller anderen Module für den angegebenen Management-Task an den Benutzer gemeldet

requisite:
  • wie required, Fehler werden jedoch sofort an den Benutzer gemeldet und die Anwendung erhält die Steuerung wieder
sufficient:
  • wenn erfolgreich, werden keine weiteren Module mehr abgearbeitet
optinal:
  • optinal, wie schon der Name sagt
  • Fehler werden ignoriert

Generell werden die Module der Reihe nach, also von oben nach unten abgearbeitet. Wird der Pfad zum Modul nicht als absoluter Pfad angegeben, gilt er relativ zu /lib/security.

Für die neuere Konfigurationsvariante existiert ein Verzeichnis /etc/pam.d und in diesem Verzeichnis für jede PAM-fähige Anwendung eine eigene Konfigurationsdatei, die normalerweise den gleichen Namen wie die Anwendung oder des gewährten Services trägt. Der Aufbau der einzelnen Dateien ist bis auf die (nicht notwendige) Spalte service-name genauso wie die oben beschriebene zentrale Konfigurationsdatei /etc/pam.conf. Vorteil dieser Variante ist die bessere Übersichtlichkeit und ein vereinfachtest Packaging von Anwendungen.

Im folgenden 2 kleine Beispiele für Konfigurationsdateien der neueren Art und Syntax aus einem Linux-System:

/etc/pam.d/xlock

auth required /lib/security/pam_unix.so nullok
In diesem Beispiel für die Anwendung xlock wird nur der Authenifizierungsmechanismus des Moduls pam_unix.so benutzt. Erfolgreich (aus Sicht von xlock) verläuft die Authentifizierung nur, wenn pam_unix erfolgreich ist. Dieses Modul implementiert den "normalen" UNIX-Paßwortmechanismus (incl. Shadow-Paßwörter). Der Parameter nullok ist modul-spezifisch und gibt an, daß das Paßwort ein Leerstring sein darf.

 

/etc/pam.d/login

auth requisite /lib/security/pam_unix.so nullok
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_nologin.so
auth required /lib/security/pam_env.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_unix.so
session required /lib/security/pam_limits.so
Bei diesem Beispiel für login sieht man recht gut das Modul-Stacking. Für die Authentifizierung werden 4 Module benutzt. Dabei ist pam_unix für die UNIX-Paßwort-Mimik verantwortlich, pam_securetty testet, ob ein Login des Benutzers vom einem bestimmten Terminal aus erlaubt ist, pam_nologin testet ob die Datei /etc/nologin existiert (wenn ja, wird jeder Login normaler Benutzer abgewiesen) und pam_env schließlich setzt einige wichtige Umgebungsvariablen. Meiner Meinung nach sind die letzteren Auth.-Module zwar nicht gerade typisch, aber das Beispiel kommt schließlich aus einem realen System!

Weiterhin sieht man im Beispiel die Benutzung eines Modules (pam_unix) für verschiedene Management-Kategorien. Für account führt pam_unix z.B. einen Check durch, ob der User sein Paßwort ändern muß. Beim Ändern des Paßwortes (Kategorie password) wird ebenfalls pam_unix benutzt. Die session-Komponente von pam_unix schließlich ist für das Logging des User-Logins (per syslogd) zuständig. 

 Module für Linux-PAM gibt es wie schon angesprochen relativ viele (mit steigender Tendenz). Hier noch einige wichtige, die auch typisch für die Authentifizierung sind und zum Teil recht interessante Lösungen gestatten:

  • LDAP-Modul
  • Kerberos-Modul
  • NCP-Modul (Auth. am Novell-Server)
  • SMB-Modul (Auth. am Windows-Server)
  • Radius-Modul

Weniger typisch sind dann Module wie:

  • Mail-Modul (sieht nach ob neue Mail für den User vorhanden ist, falls ja Meldung an den Benutzer, z.B. nach einem erfolgreichen Login)
  • Message-of-the-Day-Modul (motd-Modul)
  • Create-Homedirectory-on-initial-Login 

Hier noch eine Auswahl von Anwendungen mit PAM-Unterstützung:

  • login
  • telnet
  • imapd
  • ftpd
  • ppp
  • su
  • Apache
  • xdm
  • samba
  • ...

PAM aus Sicht des Anwendungsentwicklers

Der Anwendungentwickler benutzt die folgenden beiden PAM-Include-Files:

  • #include <security/pam_appl.h>
  • #include <security/pam_misc.h>

und die Libraries pam, pam_misc und dl. Bei der Compilierung also:

  • cc -o appl_name ... -lpam -lpam_misc -ldl

Die Anwendung benutzt die Funktionen:

  • pam_start(...);
  • pam_authenticate(...);
  • pam_acct_mgmt(...);
  • ...
  • pam_end();

Wichtig ist, daß die Anwendung der PAM-Library eine Funktion zur Kommunikation mit dem Benutzer zur Verfügung stellt (-> pam_conv(..)), damit PAM z.B. den Benutzernamen und das Paßwort des Users abfragen kann.

PAM aus Sicht des Modulentwicklers

Ein Entwickler von Modulen includiert:

  • #include <security/pam_modules.h>
  • #include <security/pam_misc.h>

Außerdem definiert er je nach zu implementierender Funktionalität die folgenden symbolischen Präprozessor-Konstanten:

  • #define PAM_SM_AUTH
  • #define PAM_SM_ACCT
  • #define PAM_SM_SESSION
  • #define PAM_SM_PASSWORD

und implementiert dementsprechend diese Funktionen:

  • pam_sm_authenticate, pam_sm_setcred (Authentication Management)
  • pam_sm_acct_mgmt (Account Management)
  • pam_sm_open_session, pam_sm_close_session (Session Management)
  • pam_sm_chauthtok (Password Management)

Analog zum Anwendungsentwickler bindet auch er die Libraries pam, pam_misc und dl ein.

Die Ergebnisse der Arbeit des Modulentwicklers, also die fertigen Module werden dann in das Verzeichnis /lib/security kopiert und können dann benutzt werden.

Fallbeispiel

Beispiel PPP-Einwahlrechner: Es gibt bereits eine funktionierende WindowsNT-Struktur (Domäne INFLB1). Als Einwahlrechner für den externen Inter- und Intranet-Zugriff sollen aus verschiedenen Gründen Linux-Rechner zum Einsatz kommen. Nun wäre es unsinnig extra deswegen eine eine zweite Benutzerverwaltung aufzubauen. Man könnte also zur Authentifikation einen existierenden WindowsNT-PDC (Primary Domain Controller) benutzen. Ein dafür geeignetes Modul ist pam_smb. Da die Einwahl über den ppp-Dämon erfolgen soll, wird eine Datei /etc/pam.d/ppp angelegt:

/etc/pam.d/ppp

auth required /lib/security/pam_smb.so nolocal
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_permit.so
session required /lib/security/pam_unix.so

Es wird also SMB zur Auth. eingesetzt, wobei der angegebene Parameter bestimmt, daß der Benutzer nicht als lokaler User auf dem Linux-System existieren muß. Das Modul pam_permit hat implementiert keine Funktionalität, sondern beendet nur mit positivem Returnwert.

Damit pam_smb weiß, gegen welche Windows-Maschine/Domäne der User authentifiziert werden soll, ist noch eine weitere Konfigurationsdatei (/etc/pam_smb.conf) erforderlich:

/etc/pam_smb.conf

INFLB1 # Domänenname
ILB1PDC1 # PDC
ILB1BDC1 # BDC

Die "normale" Linux"-Nutzerverwaltung wird also für die PPP-Einwahl komplett umgangen.

Anhang

Zur Ausarbeitung dieser Webseite bzw. des zugehörigen Vortrages habe ich mich der folgenden Literatur bedient:

  • Linux-PAM Administrator's Guide
  • Linux-PAM Application Developers' Guide
  • Linux-PAM Module Developers' Guide
  • OSF RFC 86.0: Unified Login with Pluggable Authentication Modules (PAM)
  • X/OPEN Preliminary Specification: X/Open Single Sign-On Service (XSSO) - Pluggable Authentication Modules
  • Dokumentation zu verschiedenen Linux-PAM Modules

Im Internet kann man die gesamte Literatur auf der Homepage des Linux-PAM-Projektes finden:

Wenn sich nun jemand fragt wieso diese Seite entstanden ist und wer das hier verbrochen hat, hier kommt die Antwort:

Mein Name ist Geralf Bähr (e-mail: htw7208@informatik.htw-dresden.de) und ich studiere (derzeit im 7. Semester) an der Hochschule für Technik und Wirtschaft Dresden (FH) Allgemeine Informatik. Diese Seite ist Teil eines Vortrages im Fach Betriebssysteme III. Das Thema das Vortrages war dabei frei wählbar. Und ich habe PAM ausgewählt, da ich mich kurze Zeit vorher aufgrund eines kleinen Problemes mit meinem Linux-System zu Hause etwas mit der Materie befasst habe.

Wer sich für die Orginal-Präsentation interessiert findet Sie hier als:

Eine nichtkommerzielle Nachnutzung dieser Seiten gleich welcher Art ist ausdrücklich gestattet.

Anregungen, Hinweise, Bugmeldungen u.ä. können gerne an meine obige e-mail-Adresse geschickt werden.