5.6    Pluggable Authentication Modules (PAM)

Ohne die Pluggable Authentication Modules (PAM) müsste jede Applikation, die eine Anmeldung benötigt, für jede Authentifizierungsmethode neu geschrieben werden. Wird eine Anwendung hingegen pamifiziert, braucht sich die Anwendung nicht mehr selbst um die Authentifizierung zu kümmern, denn das übernimmt jetzt PAM.

Bei einer Anmeldung nimmt dann PAM die Anmeldedaten des Benutzers entgegen und leitet diese Daten durch die entsprechenden Module an eine Benutzerdatenbank. Diese prüft die Daten und leitet das Ergebnis, wieder über PAM, zurück an die Anwendung.

Der Begriff pamifiziert bedeutet, dass das entsprechende Programm die PAM-Funktion nutzen kann. Ob ein Programm die PAM-Funktionen nutzen kann, können Sie testen, indem Sie überprüfen, ob das Programm gegen die PAM-Bibliotheken gelinkt wurde.

In Listing 5.34 sehen Sie als Beispiel das Programm login:

adminbuch:~# ldd /bin/login
linux-gate.so.1 => (0xb76ee000)
libpam.so.0 => /lib/libpam.so.0 (0xb76dc000)
libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb76d9000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb757d000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7579000)
/lib/ld-linux.so.2 (0xb76ef000)

Listing 5.34    Test des Programms »login« auf PAM-Unterstützung

Hier sehen Sie, dass das Programm login gegen die beiden Bibliotheken libpam.so.0 und libpam_misc.so.0 gelinkt wurde und somit die PAM-Funktionen unterstützt. Neben dem Programm login gibt es eine große Anzahl an Programmen und Diensten, die PAM verwenden können. Einige davon sind zum Beispiel su, sudo und xscreensaver.

Da all diese Programme PAM unterstützen, muss bei PAM nur noch das entsprechende Modul eingebunden werden, das dann eine bestimmte Art der Authentifizierung unterstützt.

Zur Authentifizierung über PAM können zum Beispiel Passwortdateien wie die /etc/passwd, LDAP, Fingerprintscanner oder Smartcards verwendet werden.

PAM ist aber nicht zuständig für die Bereitstellung von Benutzerinformationen, die nichts mit der Authentifizierung zu tun haben, wie zum Beispiel das Zuordnen einer UID zum Benutzernamen bei der Vergabe von Rechten oder der Verwendung von ls -l. Das ist die Aufgabe des Name Service Switch (NSS).

5.6.1    Verschiedene PAM-Typen

Wie zuvor schon erwähnt wurde, ist PAM modular aufgebaut, und die verschiedenen Module können von unterschiedlichen Programmierern oder Hardwareherstellern bereitgestellt werden. Alle Module können den verschiedenen Modultypen zugeordnet werden. Es gibt vier verschiedene Modultypen innerhalb des PAM-Systems:

5.6.2    Die PAM-Kontrollflags

Alle Module für einen bestimmten Dienst wie zum Beispiel sudo werden in der Reihenfolge abgearbeitet, wie sie in der Konfigurationsdatei des Dienstes eingetragen sind.

Über die Kontrollflags können Sie festlegen, was passieren soll, wenn ein Modul erfolgreich abgearbeitet wurde oder es zu einem Fehler gekommen ist. Hier gibt es vier verschiedene Möglichkeiten, wie reagiert werden kann:

5.6.3    Argumente zu den Modulen

Beim Aufrufen der Module können Sie verschiedene Argumente an das Modul übergeben. Diese Argumente beeinflussen die Arbeitsweise des Moduls, bei dem sie eingetragen sind. Wenn Sie mehrere Authentifizierungsquellen in Ihr System eingebunden haben, wie zum Beispiel LDAP und lokale Dateien, soll ja ein Benutzer, wenn er in beiden Quellen eingetragen ist, nicht zweimal nach einem Passwort gefragt werden. In diesem Fall können Sie das Argument use_first_pass verwenden. Wenn bei einer Quelle die Authentifizierung für den Benutzer erfolgreich durchgeführt wurde, werden dieselben Anmeldedaten an die zweite Quelle weitergegeben, ohne dass der Benutzer weitere Eingaben tätigen muss.

5.6.4    Modulpfade

Wenn Sie ein eigenes Modul oder das Modul für eine bestimmte Hardware in Ihr System integrieren wollen, müssen Sie das Modul an einer bestimmten Stelle im Dateisystem ablegen, sodass PAM in der Lage ist, das Modul zu finden. Denn in den Konfigurationsdateien von PAM wird immer nur der Modulname ohne Pfad eingetragen. Hier sind sich mal alle Distributionen einig: Bei allen liegen die PAM-Module im Verzeichnis /lib/security.

5.6.5    Module und ihre Aufgaben

In diesem Abschnitt sollen einige Module etwas näher erläutert werden. Aufgrund der Vielzahl können nicht alle Module erklärt werden, aber Sie bekommen auf jeden Fall einen Einblick in die wichtigsten.

pam_unix

Hierbei handelt es sich um das Standardmodul zur Benutzerauthentifizierung. Für die Authentifizierung greift das Modul auf die Dateien /etc/passwd und /etc/shadow zurück. Wichtige Optionen zu dem Modul sind:

pam_cracklib

Dieses Modul überprüft neue Passwörter daraufhin, ob sie bestimmten Regeln entsprechen. Durch die Verwendung dieses Moduls können Sie verhindern, dass Benutzer unsichere Passwörter verwenden. Der Benutzer root ist davon nicht betroffen. Er kann weiterhin jedes beliebige Passwort an einen Benutzer vergeben.

Wichtige Optionen für dieses Modul sind:

pam_mkhomedir

Dieses Modul prüft bei der Anmeldung eines Benutzers, ob dieser bereits ein Heimatverzeichnis auf dem System besitzt. Hat der Benutzer noch kein Heimatverzeichnis, wird ein neues Verzeichnis für ihn angelegt. Das Modul kennt die folgenden Optionen:

5.6.6    Die neuere Syntax bei der PAM-Konfiguration

Bei der neuen Schreibweise der PAM-Regeln haben Sie als Systemadministrator bessere Kontrollmöglichkeiten darüber, wie ein Benutzer authentifiziert wird. Die Regeln werden hier durch mehrere value=action-Parameter festgelegt. Die Liste aller Parameter zu einem Modul haben wir dabei in eckigen Klammern geschrieben. Beispiele dazu sehen Sie in Listing 5.35 in Abschnitt 5.7, »Konfiguration von PAM«.

[+]  Standard bei allen aktuellen Distributionen

Bei allen in dieser Auflage beschriebenen Distributionen wird nur noch die neue Schreibweise der PAM-Einträge verwendet. Die alte Schreibweise funktioniert aber auch noch. Wir empfehlen jedoch immer die neue Schreibweise, da Sie damit sehr viel flexibler sind.

Als Werte für value können Sie folgende Rückgabewerte eines Moduls verwenden:
success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, new_authtok_reqd, acct_expired, session_err cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, auth- tok_expired, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, auth- tok_recover_err, module_unknown, bad_item, maxtries, default

Der Rückgabewert default kann dann verwendet werden, wenn ein Rückgabewert eines Moduls nicht genau definiert ist.

value kann einen der folgenden Werte haben:

Natürlich können Sie mit der neuen Syntax die alte Syntax komplett ersetzen. Damit Sie sehen, wie die alten Begriffe required, requisite, sufficient und optional auf die neue Syntax umgestellt werden, sehen Sie hier eine Gegenüberstellung der beiden Schreibweisen: