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:
-
auth
Wenn Sie einem Modul diesen Modultyp zuweisen, kümmert sich das Modul um die Authentifizierung von Benutzern über eine Passwortabfrage. Aber auch biometrische Methoden, wie zum Beispiel ein Fingerprintscanner, können hier eingebunden werden. -
account
Wenn Sie ein Modul hier eintragen, wird während der Authentifikation geprüft, ob es Restriktionen für den Benutzer gibt. Restriktionen können zum Beispiel Anmeldezeitbeschränkungen oder der Ablauf des Passworts sein. -
password
Hier geht es darum, was zu beachten ist, wenn ein Benutzer ein Passwort ändert. Es kann zum Beispiel das Modul pam_cracklib eingebunden werden, um Passwörter auf Komplexität zu prüfen. -
session
Hier können Sie festlegen, was passieren soll, wenn sich ein Benutzer angemeldet hat. Zum Beispiel können Sie hier das Modul pam_mkhomedir einbinden. Wenn sich jetzt ein Benutzer am System anmeldet, wird für ihn automatisch ein Heimatverzeichnis angelegt, falls er keines besitzt.
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:
-
required
Wenn Sie ein Modul mit dem Flag required einbinden, muss das Modul erfolgreich abgearbeitet worden sein, bevor PAM die Kontrolle an das aufrufende Programm zurückgibt.[ ! ] Ein falsch gesetztes Flag »required« kann jegliche Anmeldung verweigern
Wenn Sie dem LDAP-Modul dieses Flag zuweisen und der LDAP-Server nicht erreichbar ist, kann es Ihnen passieren, dass der Login-Prozess für immer auf PAM wartet. Deshalb ist es immer wichtig, beim Testen von Änderungen eine aktive root-Sitzung zu haben.
-
requisite
Dieses Modul muss auch immer abgearbeitet werden, aber im Gegensatz zu required wird die Kontrolle im Fehlerfall an die aufrufende Anwendung zurückgegeben. -
sufficient
Wenn ein Modul mit dem Flag sufficient erfolgreich abgearbeitet wurde, wird kein weiteres Modul aus der Liste der Modultypen abgearbeitet. Gibt ein Modul einen Fehler zurück, wird die Anfrage an das nächste Modul in der Liste übergeben. Das ist dann sinnvoll, wenn Sie in Ihrem System mehrere Authentifizierungsquellen eingebunden haben. Ein Beispiel dafür wäre, wenn Sie LDAP zur Authentifizierung nutzen, aber auch lokale Benutzer auf dem System haben. Wenn sich ein lokaler Benutzer anmeldet, Sie das LDAPModul mit dem Flag sufficient versehen haben und dieses Modul an erster Stelle in der Modulliste steht, würde das LDAP-Modul bei einem Fehler den Anmeldeprozess an das Modul für die lokale Anmeldung übergeben. -
optional
Bei diesem Flag wird ein Modul immer dann abgearbeitet, wenn vorher kein Modultyp mit requisit gescheitert ist und keiner mit sufficient erfolgreich war.
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:
-
use_first_pass
Bei dieser Option wird auf die Benutzereingaben eines vorherigen Moduls zugegriffen, sodass der Benutzer sein Passwort bei mehreren Authentifizierungsquellen nicht mehrfach eingeben muss. -
use_authtok
Dieses Modul wird immer dann aktiv, wenn der Benutzer sein Passwort ändert und das geänderte Passwort durch weitere Module geleitet werden soll, wie zum Beispiel pam_ldap oder pam_cracklib. -
nullok
Normalerweise lässt das Modul pam_unix keinen Benutzer ohne Passwort zu. Durch diese Option können sich aber auch Benutzer ohne Passwort am System anmelden.
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:
-
difok=N
Dieser numerische Wert legt fest, an wie vielen Stellen sich das neue vom alten Passwort unterscheiden muss, damit das neue Passwort gültig ist. Ein neues Passwort ist auf jeden Fall immer gültig, wenn sich mindestens 50 % der Zeichen von denen des alten Passworts unterscheiden. -
minlen=N
Über diese Option können Sie die Mindestlänge eines Passworts festlegen. -
maxrepeat=N
Mit diesem Wert können Sie festlegen, wie oft dasselbe Zeichen hintereinander in einem Passwort verwendet werden kann. Diese Option ist normalerweise deaktiviert, sodass beliebig viele gleiche Zeichen hintereinander verwendet werden können. -
reject_username
Diese Option verhindert, dass der Benutzer seinen Anmeldenamen als Passwort verwendet. Diese Option prüft das Passwort sowohl vorwärts als auch rückwärts.
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:
-
silent
Der Benutzer erhält keine Meldungen angezeigt. -
umask=mask
Hier können Sie die umask setzen, mit der das Heimatverzeichnis des Benutzers erstellt wird. -
skel=/pfad/zum/skel/Verzeichnis
Beim Erstellen des Heimatverzeichnisses können Sie gleich dafür sorgen, dass bestimmte Dateien und Verzeichnisse direkt in das neue Heimatverzeichnis des Benutzers kopiert werden. Diese Option gibt den Pfad an, aus dem die Daten kopiert werden sollen.
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:
-
int-wert
Durch die Angabe eines positiven int-wert können Sie nach einer bestimmten Aktion eine Anzahl von Modulen überspringen. Wenn Sie zum Beispiel die Authentifizierung von Benutzern über die lokale Datei /etc/passwd, über LDAP oder über Kerberos zulassen wollen, können Sie zum Beispiel mit [success=2] bei der lokalen Anmeldung die beiden Module für LDAP und Kerberos überspringen. -
ignore
Der Rückgabewert des Moduls wird ignoriert und nicht an die Anwendung gegeben, die eine Authentifizierung angefordert hat. -
bad
Damit wird der Rückgabewert des Moduls als Fehler interpretiert. Wenn das erste Modul in der Kette von Modulen diesen Wert zurückgibt, wird der Status für alle weiteren Module verwendet. -
die
Der Wert die führt zum selben Ergebnis wie bad, nur wird hier der PAM-Stack sofort nach dem Modul abgebrochen. Die anderen Module werden nicht mehr abgearbeitet. -
ok
Wenn Sie ok als Wert verwenden, nimmt PAM an, dass der Rückgabewert aller folgenden Module ein ok ist. Wenn also ein Modul ein success liefert, werden alle nachfolgenden Module ebenfalls ein success liefern. Wenn aber ein vorheriges Modul einen Fehler zurückgibt, wird der Fehler nicht überschrieben. -
done
Der Wert done ist gleichzusetzen mit ok, nur wird hier der PAM-Stack nicht weiter abgearbeitet, wenn ein Modul aus dem Stack diesen Rückgabewert liefert. -
reset
Mit dem Wert reset wird der gesamte Status des Stacks zurückgesetzt, und die Ermittlung des Status beginnt mit dem nächsten Modul von vorn.
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:
-
required ist gleich [success=ok new_authtok_reqd=ok ignore=ignore default=bad].
-
requisite ist gleich[success=ok new_authtok_reqd=ok ignore=ignore default=die].
-
sufficient ist gleich [success=done new_authtok_reqd=done default=ignore].
-
optional ist gleich [success=ok new_authtok_reqd=ok default=ignore].