login , ssh , diverse Display-Manager, POP3-Server, ... - die Liste ist endlos).
/etc/passwd . Da wir in einer vernetzten Welt leben, sollte man sich auch per nis authentifizieren können. Manche wollen jedoch lieber ldap, andere hesiod - die Sun-Fans wollen nisplus - und schon wird's unübersichtlich, da alle diese Methoden dann in jedes Programm integriert werden müßten, das eine Authentifikation durchführen will.
/etc/pam.d/ ) stellt man nun für die einzelnen Programme ein, auf welche Methode sie Authentifikationen akzeptieren sollen. Dort liegt dann für jedes Programm ein sog. PAM-Stack - also ein Authentifikations-Konfigurationsfile. /etc/pam.conf ). Das ist jedoch völig unpraktisch, da ein Softwarepaket wie z.B. ssh an einer zentralen Konfigurationsdatei herumbasteln müsste, anstelle einfach eine Datei in ein Verzeichnis ( /etc/pam.d ) zu legen.
login -Prozess oder ein X-Display-Manager wie kdm .
try_first_pass )
user Der Name des sich einloggenden Benutzers.
tty Der (virtuelle) Terminal, über den der Loginvorgang erfolgt.
rhost Die Adresse des Rechners, von dem aus der Loginvorgang ausgelöst wurde (sinnvoll, wenn es sich um einen Netzwerkdienst wie ssh handelt).
ruser Der Name des Benutzers, der sich gerade versucht, in den sich authentifizierenden Benutzer zu verwandeln . Das ist z.B. bei su sinnvoll, wenn man root das Recht geben will, sich in jeden zu verwandeln.
/etc/passwd zugeordnet ist oder das, welcher im NIS steht.
/etc/passwd steht und anschliessend das. was im NIS steht.
/etc/passwd steht, was jedoch unbedingt das selbe sein muss, wie das, das im NIS steht.
auth ). Über passende Plugins kann jede Anwendung auch folgendes machen:
password Passwörter ändern
account Das Login eines Benutzers autorisieren . Z.B. kann man einem bestimmten Benutzer ausschliesslich zwischen 08:00 und 18:00 auf den Rechner lassen oder alle Benutzer ausser gert und root aussperren.
session Andere nützliche Dinge nach der Autorisation tun. Z.B. könnte man die Message of the Day anzeigen lassen oder wichtige Umgebungsvariablen setzen.
exec() durch die Login-Shell oder den Session-Manager ersetzt wird. Damit können z.B.
[Modus] [Anweisungen] [zu benutzendes Plugin] [Parameter für das Plugin]
an beliebigen Stellen können zusätzlich Anweisungen der Form
@include [Dateiname]
eingefügt werden. Die Regeln in [Dateiname] werden dann abgearbeitet, als ob sie direkt im jeweiligen PAM-Stack wären.
Der Stack führt zwei internene Zustände mit:
[Anweisungen] kann der innere Zustand manipuliert werden. Folgende Rückgabecodes kann der Stack besitzen:
undef Dieser ist am Anfang gesetzt (und wenn die Anweisung reset benutzt wird).
True Die Authentifikation wird - wenn nichts mehr dazwischenkommt - erfolgreich.
False Die Authentifikation wird - wenn nicht noch ein Wunder passiert ( reset -Anweisung ) - nicht erfolgreich sein.
[Modus] ist je nachdem wofür die Regel benutzt werden soll einer von auth , account , session , password
required Der Erfolg des Plugins ist wichtig. Wenn die Authentifikation gegen dieses Plugin nicht klappt, soll der ganze PAM-Stack fehlschlagen - er wird jedoch weiter abgearbeitet. [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
requisite Das Plugin ist so wichtig, dass der Stack sofort mit einem Fehlschlag beendet werden soll. Weitere Regeln werden nicht abgearbeitet. [success=ok new_authtok_reqd=ok ignore=ignore default=die]
sufficient Wenn die Regel erfolgreich ausgeführt wird, ist die Authentifikation erfolgreich abgeschlossen. Es wird dann keine weitere Regel abgearbeitet. [success=done new_authtok_reqd=done default=ignore]
optional Diese Regel muss nicht unbedingt erfolgreich abgearbeitet werden. Wenn die Regel die einzige im Stack ist, ist ihr Erfolg jedoch ausschlaggebend für die erfolgreiche Abarbeitung des PAM-Stacks. [success=ok new_authtok_reqd=ok default=ignore]
[result1=command1,result2=command2,...]
bestehen. Dabei steht ein result für einen möglichen Rückgabecode des Plugins in der PAM-Stack-Regel. command ist eine der folgenden Anweisungen:
ignore Der Rückgabecode des Plugins wird ignoriert.
bad Die Rückgabecode des PAM-Stacks wird auf False gesetzt. Wenn das die letzte Regel des Stacks ist, dann geht die Authentifikation schief.
die Der PAM-Stack wird beendet - die Authentifikation ist nicht erfolgreich.
ok Wenn der Rückgabecode des PAM-Stacks nicht False ist, wird der Rückgabecode des _PAM-Stacks auf True gesetzt.
done Der PAM-Stack wird beendet. Wenn der Rückgabecode des PAM-Stacks nicht False ist, hat die Authentifizierung geklapt. False ist, kann mit folgender vorgeschalteter Regel dafür sorgen, dass das done trotzdem zu einer erfolgreichen Authentifikation führt: auth [default=reset] pam_permit.so
reset Der Rückgabecode des PAM-Stacks wird auf undef gesetzt, anschliessend geht's bei der nächsten Regel im Stack weiter.
/etc/passwd und nis durchzuführen und auch diverse spezielle Plugins, die nicht direkt einen Authentifikationsdienst ansprechen. Die Plugins sollen hier im einzelnen beschrieben werden.
Plugins liegen per default in /lib/security und passen entsprechende dem Globber-Ausdruck pam_*.so . Jedes Plugin kann Funktionen für einen oder mehrere der PAM-Modi bereitstellen.
pam_permit.so - Garantierter Erfolg success zurück.
Hinweis:
pam_permit.so fehl.
auth [default=reset] pam_permit.so auth [default=done] pam_permit.so
auth [default=done] pam_permit.so
pam_deny.so - Gewollter Fehlschlag success zurück).
pam_nologin.so success , wenn eine oder mehrere der folgenden Bedingungen wahr sind:
/etc/nologin existiert nicht ). Das wird meist benutzt, um Benutzer vom System ferzuhalten, während es bootet.
pam_listfile.so file=[File] Die Liste, gegen die verglichen werden soll, befindet sich in der Datei [File] .
sense=[Modus] Damit wird festgelegt, wie das Modul reagieren soll, wenn der Benutzer (genauer: das item ) in der angegebenen Datei gefunden wird. Mögliche Werte für [Modus] sind:
allow Wer gefunden wird, darf rein.
deny Wer gefunden wird, bleibt draussen.
item=[Feld] Damit legt man fest, welche Information in der Liste gesucht werden soll. Möglich sind folgende:
user , rhost , tty , ruser (Was das bedeutet - siehe hier)
group Die Gruppen, in denen der neue Benutzer Mitglied ist.
shell Die Default-Shell des sich authentifizierenden Benutzers.
onerr=[Modus] definiert, was im Fehlerfall (Bsp: Datei kann nicht gelesen werden) passieren soll
succeed Im Fehlerfall liefert das Plugin success zurück.
fail Im Fehlerfall liefert das Plugin service_err zurück.
quiet Wenn dieser Parameter angegeben ist, werden keine Fehler im Plugin (z.B. Datei nicht gefunden) ans Syslog gemeldet.
pam_localuser.so auth -Plugin testet, ob der aktuelle Nutzer in einem definierten passwdfile enthalten ist. Das ist praktisch das selbe wie pam_listfile , jedoch kommt es mit den : -getrennten Feldern von passwd -Files klar.
auth required pam_localuser.so file=/my/passwdfile
pam_succeed_if.so - Die PAM-if-Anweisung auth [Anweisungen] pam_succeed_if.so [Variable] [Operator] [Wert] {[Variable2] [Operator2] [Wert2] {...}}
Parameter:
[Variable] ist jeweils eine der Charakteristika des sich authentifizierenden Benutzers:
login , name oder user : Der Name des Benutzers
uid : Die numerische UID des Benutzers
gid : Die numerische GID des Benutzers
shell : Die Default-Shell des Benutzers
home , dir oder homedir : Das Homedirectory des Benutzers
[Operator] Der Operator zum Vergleich der [Variable] mit dem [Wert] . Mögliche Operatoren sind:
< oder lt ; <= oder le ; > oder gt ; >= oder ge : Numerische Vergleiche
= oder eq ; = oder ne : Numerische oder Textvergleiche
=~ oder glob : Testen der Variable gegen einen Globberausdruck
noglob : Testen der Variable gegen einen Globberausdruck - Erfolg, wenn es nicht matcht.
ingroup bzw. notingroup : Testen, Ob der Benutzer in der angegebenen Gruppe ist oder nicht.
debug Viele Informationen ans Syslog schicken.
quiet Keine Informationen über Erfolg oder Misserfolg des Plugins ans Syslog schicken.
pam_rootok.so success zurück, wenn der ursprüngliche Benutzer ( ruser ) root ist. Das ist z.B. für su sinnvoll, um die Authentifikation immer gelingen zu lassen, wenn root su benutzt.
pam_securetty.so /etc/securetty verglichen werden. Ist der aktuelle tty nicht in der Liste, kann sich root nicht anmelden.
Hinweis:
telnet -Verbindungen anmelden können soll. In Zeiten von ssh macht das aber keinen Sinn mehr - da ist die Anmeldung per ssh teilweise sicherer als die lokale (Stichwort: Public-Key-Authentication) - anhand des Terminals kann man das aber nicht feststellen, da ssh wie auch telnetd einfach Pseudo-Terminals ( /dev/pts/* ) nutzt.
pam_unix.so passwd -Bereich des libc- Name Service Switch (NSS) ). Das heisst üblicherweise, dass /etc/passwd die Authentifikationsinformationen liefert, jedoch kann man das flexibel in /etc/nsswitch in der passwd: -Zeile konfigurieren. z.B. kann man so auch gegen ldap, nis oder gegen eine AFS-PTDB (siehe Dokumentation des InstantAFS?-Projektes, Stichwort libnss-ptdb ).
pam_group.so pam_group setzt nach bestimmten Bedingungen die Gruppenmitgliedschaften von Benutzern, die sich einloggen. Das Modul wird ohne Parameter als auth -Plugin eingesetzt und zieht die Regeln, nach denen es Gruppenmitgliedschaften vergibt, aus /etc/security/group.conf .
Die Regeln in /etc/security/group.conf bestehen jeweils aus 5 Feldern, die durch ; getrennt sind:
| Feld | Erklärung | Beispiel | Beispiel-Erklärung |
|---|---|---|---|
| Anwendung | Die Anwendung, für die diese Regel gelten soll. Anwendungen sind z.B. login oder ssh . Die Namen entsprechen denen der Stacks unter /etc/pam.d . | 1. ssh 2. * | 1. Die Regel gilt nur für ssh-Logins. 2. Die Regel gilt für sämmtliche Dienste. |
| Terminal | Mit diesem Feld läßt sich die Gültigkeit der Regel auf bestimmte Terminals begrenzen. | 1. tty* 2. :* 3. * | 1. Alle lokalen Textkonsolen. 2. Alle X-Screens (z.B. für KDM- oder XDM-Anmeldungen) 3. Keine Einschränkungen bez. der Terminals. |
| Benutzer | Damit läßt sich die Gültigkeit der Regel auf bestimmte (durch , getrennte) Benutzer eingrenzen. | 1. ernie,bert 2. * | 1. Die Regel gilt nur für die Benutzer ernie und bert . 2. Die Regel gilt für alle Benutzer. |
| Zeit | Hier läßt sich ein zeitliches Constraint festlegen, ausserhalb dessen die Regel nicht gilt. Wer das zur absicherung seines Systems wirklich einsetzen will, sollte bedenken, dass es den Befehl nohup gibt - die Sicherheit ist also trügerisch. | 1. !Wk0900-1800 2. !Al0900-1800 3. Al0000-2359 | 1. Wochtags von 09:00 bis 18:00 2. Immer von 18:00 bis 09:00 3. Immer. |
| Gruppen | Eine , -seperierte Liste mit Unix-Gruppen, die bei Matching der Regel zugewiesen werden soll. | audio,cdrom,cdrecording | Der Benutzer darf die Soundkarte benutzen, Musik von CD hören und CDs brennen. |
| Kürzel | Bedeutung |
|---|---|
mo .. su | Der jeweilige Tag |
wk | Montag bis Freitag |
wd | Sonnabend und Sonntag |
al | Jeder Tag |
*;*;*;Al0000-2359;audio,cdrom,cdrecording,video,floppy,plugdev,dip,netdev,dialout
Hinweise:
*Das ist sehr nützlich, wenn man einfach jedem oder einzelnen Nutzern bestimmte Rechte geben will.
pam_group.so -Modul ist ungeeignet, um z.B. einen Rechner je nach Tageszeit zu sichern.
libpam-pwdfile : pam_pwdfile.so passwd -File. Das geht so:
auth sufficient pwdfile /my/passwdfile
pam_console.so /etc/security/console.perms bestimmte Dateien (wobei man hier vor allem auf Device-Files zielt) an den sich einloggenden Benutzer abgetreten werden - der Owner wird also verändert. Daraus folgt, dass diese ganze Konstruktion nicht gerade Mehrbenutzertauglich ist. Ausserdem dürfte der Sicherheitsgewinn ähnlich gering wie bei pam_group.so sein - schliesslich kann man Rechte auf bereits geöffnete Dateien/Devices nicht aberkannt bekommen.
pam_stack.so service=[service] Gibt den zu verarbeitenden PAM-Unterstack an.
@include -Statement kann praktisch dasselbe.