Die meisten Linux-Systeme sind von anderen Netzwerkrechnern über verschiedene Zugänge wie beispielsweise ssh, ftp oder pop3 erreichbar. Bevor ein solcher Zugang gewährt wird, muss die Identität des Benutzers zweifelsfrei festgestellt werden (Authentisierung). Jeder Zugangsdienst, also beispielsweise der FTP Server, muss nun diese Überprüfung selbst implementieren (i.d.R. Passwort).
Soll aber nun zum Beispiel ein Zugang nur in festgelegten Zeitfenstern möglich sein oder eine Chipkarte bzw. ein biometrisches Verfahren (Fingerabdruck, IRIS) das herkömmliche Passwortverfahren ersetzen, so müsste man alle Zugangsprogramme (login, ftp, ssh, ...) dementsprechend modifizieren. Ebenso schwierig gestaltet sich die Integration in Sicherheitsarchitekturen wie DCE oder Kerberos.
Bereits Anfang der 90er Jahre erkannte Sun Microsystems diese Nachteile und entwickelte und implementierte den so genannten PAM-Standard in ihrem Betriebssystem Solaris. Seit Oktober 1995 gibt es den RFC 86.0, der PAM allgemein beschreibt. Was ist nun PAM?
PAM steht für Pluggable Authentifikation Module was auf deutsch heißt: steckbare Authentisierungsmodule. Es handelt sich also um ein modulares System, welches die Anwendungen (login, ssh, ftp) von den Mechanismen zur Benutzerauthentisierung trennt. Einzelne Authentifizierungsschritte können nacheinander durchgeführt werden, ohne dass der Benutzer davon etwas merkt.
Für jede Anwendung (z.B. login) wird festgelegt, welche Sicherheitsmodule wie durchlaufen werden. Dazu existieren jeweils eigenständige Konfigurationsdateien im Verzeichnis /etc/pam.d/ :
user@linux $ ls /etc/pam.d
chfn cron kdm passwd ppp su chsh cvs login other ssh wu-ftpd |
/etc/pam.d/login |
# Modul auth: root kann sich nur an bestimmten
# Konsolen anmelden (definiert in /etc/securetty)
auth required /lib/security/pam_securetty.so
# komplexe Passwörter erforderlich
# (mind. 8 Zeichen, max 3 Login-Versuche)
password required /lib/security/pam_cracklib.so retry=3 minlen=8
[...]
# Zeitgesteuerte Zugangsberechtigungen
# (definiert in /etc/security/time.conf)
account requisite pam_time.so
[...]
|
Jeder Eintrag einer solchen Konfigurationsdatei besteht aus mindestens drei Elementen. Es beginnt mit einem Modultyp gefolgt von einem Kontroll-Flag. An dritter Stelle steht der Name des Moduls und optional dahinter weitere Argumente. Das Zusammenspiel
Modultyp - Kontroll-Flag - Modul |
wird am Ende des Abschnittes in einem komplexen Beispiel verdeutlicht werden.
Jedes Modul kann einen oder mehrere Modultypen implementieren:
Modultyp |
Beschreibung |
unterstützte Funktion |
Beschreibung |
auth |
Authentisierungsmanagement |
pam_authenticate() pam_setcred() |
Benutzerauthentisierung Setzen, Erneuern oder Löschen von Berechtigungen |
account |
Zugangsmanagement |
pam_acct_mgmt() |
Entscheidung, ob Zugang gestattet oder verweigert wird (z.B. zeitliches Zugangslimit) |
session |
Sitzungsmanagement |
pam_open_session() pam_close_session() |
z.B. Dauer einer Sitzung kontrollieren /protokollieren |
password |
Passwort-Management |
pam_chauthtok() |
Kontrolle der Passwortänderung |
Wie und in welcher Weise die aufgeführten Funktionen eines Moduls relevant sind, kontrollieren die sogenannten Kontroll-Flags:
control-flag |
Beschreibung |
required |
Modul muss zwingend durchlaufen werden.Auch bei nicht erfolgreichem Durchlaufen werden alle folgenden Module bearbeitet (damit ist nicht ersichtlich, welches Modul den Zugriff verweigert). |
requisite |
Bei einem Fehler (nicht erfolgreiches Durchlaufen) wird sofort zum Anwendungsprogramm (z.B. login) zurückgekehrt, ohne die folgenden Module abzuarbeiten. Ansonsten wird in der Abarbeitung der Kette fortgefahren. |
optional |
Bei Erfolg werden trotzdem alle nachfolgenden Module abgearbeitet. |
sufficient |
Bei Erfolg des Moduls wird sofort zur Anwendung zurückgekehrt, die Abarbeitung der anderen Module ist nicht notwendig. |
|
Die folgende Konfiguration bezieht sich auf das Login und wird deshalb in der Datei /etc/pam.d/login gespeichert. (Die angegebenen Zeilennummern sind KEIN Bestandteil der Datei und dienen nur der besseren Orientierung.)
/etc/pam.d/login |
1 # root kann sich nur an Konsolen aus /etc/securetty anmelden
2 auth required /lib/security/pam_securetty.so
3
4 # bei Existenz von /etc/nologin darf sich nur root anmelden
5 auth required /lib/security/pam_nologin.so
6
7 # Anmelden über Verzeichnisdienst LDAP
8 auth sufficient /lib/security/pam_ldap.so
9
10 # Anmeldung lokaler Benutzer
11 auth required /lib/security/pam_unix.so use_first_pass
12
13 # Zeitgesteuerte Zugangsberechtigungen (definiert in /etc/security/time.conf)
14 #account requisite pam_time.so
15
16 # Vergabe der Zugangsberechtigungen entsprechend der LDAP Einträge
17 account sufficient /lib/security/pam_ldap.so
18
19 # Standard Zugangsberechtigungen
20 account required /lib/security/pam_unix.so
21
22 # Passworteinschränkungen bei Änderung
23 password required /lib/security/pam_cracklib.so minlen=5 dcredit=2 ocredit=2
24
25 # Benutze Shadow Suite und md5 Passwörter
26 password required /lib/security/pam_unix.so use_first_pass md5 shadow
27
28 # Weitergabe des Passwortes an LDAP
29 password sufficient /lib/security/pam_ldap.so use_authtok
30
31 # generiere Fehler bei nicht erfolgreicher Passwortänderung
32 password required /lib/security/pam_deny.so
33
34 # Standard Sitzung
35 session required /lib/security/pam_unix.so
36
37 # Standard Sitzung
38 session optional /lib/security/pam_ldap.so
39
40 # Limits (definiert in /etc/security/limits.conf)
41 # session required pam_limits.so
|
Authentisierungsmanagement
In Zeile 2 überprüft das Modul pam_securetty, ob sich der Superuser root an der Konsole anmelden darf oder nicht. In der dazugehörenden Konfigurationsdatei /etc/securetty wird untereinander angegeben, wo dies möglich sein soll:
#tty1
#tty2
#tty3
#tty4
tty5
#tty6
Da im obigen Beispiel alle Einträge außer tty5 auskommentiert wurden, kann sich root nur an dieser einen Konsole anmelden. In Zeile 5 wird das Modul pam_nologin.so durchlaufen, welches auf dem System nach der Datei /etc/nologin sucht. Bei Vorhandensein wird lediglich dem Superuser root das Anmelden gestattet. Zeile 8 integriert das Anmelden über LDAP mittels des Moduls pam_ldap.so. LDAP ist ein Verzeichnisdienst, der in einem eigenständigen Selflinux-Kapitel näher beschrieben wurde. Sind Benutzerkennung und Passwort korrekt, so wird zum login-Programm zurückgekehrt. In Zeile 11 wird das Authentisierungsmodul pam_unix.so mit dem Passwort des LDAP-Moduls durchlaufen (use_first_pass.so). Somit können sich auch lokale Benutzer, die nicht im LDAP-Baum gelistet sind, am System anmelden.
Zugangsmanagement
Zeile 14: Zeitgesteuerte Berechtigungen werden mit dem Modul pam_time realisiert. Achtung! Um so näher das Ende eines Projektes naht, desto länger arbeiten auch die Mitarbeiter. In Zeile 17 und 20 werden die Zugangsberechtigungen vergeben. Dabei wertet das ldap.so Modul verschiedene Parameter aus dem Verzeichnisbaum aus (z.B. LDAP_ATTRNAME_EXPIRATIONDATE). Sollte das ldap Modul nicht erfolgreich durchlaufen werden, so ist für die Autorisierung das pam_unix Modul verantwortlich.
Passwortmanagement
In Zeile 22-32 werden Passwortänderungen kontrolliert. Das erste Modul pam_cracklib untersucht die Passwörter auf ihre Einfachheit. Die Optionen geben an, dass ein Passwort aus mindestens 5 Zeichen bestehen muss, wobei mindestens zwei Ziffern und zwei Sonderzeichen dabei sind. Das nächste Modul (pam_unix) übernimmt das Passwort vom pam_cracklib Modul und verwendet einen md5 Hash und die Passwort-Shadow-Suite. Anschließend wird das Passwort an das ldap Modul weitergereicht, und falls dieses es nicht erfolgreich verarbeiten kann, wird das deny-Modul in Zeile 31 einen Fehler generieren. Wozu muss aber überhaupt der login-Prozess das Passwort ändern können? Wie im Abschnitt zuvor angesprochen, können Passwörter verfallen, und dann wird der Benutzer beim Anmelden (also beim login-Prozess) aufgefordert, sein Passwort zu ändern.
Sitzungsmanagement
Im letzten Abschnitt befinden sich die Module für das Sitzungsmanagement. Pam_unix protokolliert in den Logfiles nicht nur den Beginn einer Sitzung sondern auch deren Ende und weitere sicherheitsrelevante Informationen. Das ldap Modul ist optional, das heißt ein erfolgreiches Durchlaufen ist nicht unbedingt erforderlich. Zum Schluss wird das Modul limits eingebunden, welches die Systemressourcen wie beispielsweise Hauptspeicherbedarf, CPU-Zeit, Prozesse und Dateien für einzelne Benutzer bzw. Benutzergruppen begrenzt. Die Einstellungen dazu werden in der Konfigurationsdatei /etc/security/limits.conf vorgenommen:
/etc/security/limits.conf |
#/etc/security/limits.conf
# Maximal 4 Nutzer der Benutzergruppe "user" dürfen sich anmelden
@users - maxlogins 4
# Prozesse des Benutzers "www" werden mit nice-Level 17 ausgeführt
www - priority 17
# Prozesse der Gruppe "users" werden mit nice-Level 17 ausgeführt,
# Priorität kann aber durch den Benutzer geändert werden
@users soft priority 17
# root darf nur einmal angemeldet sein
root hard maxlogins 1
|
|
pam_access |
eingeschränkte Zugangsberechtigungen (Benutzer <--> Terminal) Konfigurationsdatei: /etc/security/access.conf |
pam_group |
Zuweisung zu Benutzergruppen entsprechend bestimmter Kriterien (Benutzer, Zeit, Terminal). Konfigurationsdatei: /etc/security/group.conf |
pam_rhosts_auth.so |
Unterbindung des Remote Zugriffs durch .rhosts Dateien |
pam_console.so |
Räumt normalen Benutzern zusätzliche Rechte ein.(ACHTUNG: Dieses Modul sollte in abzusichernden Systemen NIE benutzt werden) |
pam_tally.so |
Sperrung des Zugangs nach x fehlgeschlagenen Login-Versuchen |
pam_wheel.so |
Begrenzung des su Kommandos auf eine kleine Benutzergruppe |
xpam_time.so |
zeitgesteuerte Zugangskontrolle |
pam_env.so |
nicht veränderliche Umgebungsvariablen |
pam_pwdb.so |
Authentifikation |
mod_auth_pam |
PAM Modul für apache Webserver |
pam_ftp.so |
Anonymous Zugriff (testet Passwort auf "@"-Zeichen) |
pam_php.so |
PAM Unterstützung für PHP |
pam_krb5.so |
Kerberos Modul |
pam_radius.so |
Radius=Remote Authentication Dial-In User Service |
Ein kurzer Hinweis zum Schluss: Das Modul pam_console.so sollte in allen Konfigurationsdateien auskommentiert werden. Dies übernimmt das folgende Skript:
#!/bin/sh
cd /etc/pam.d
for i in *; do
sed ´/[^#].*pam_console.so/s/^/#/´ < $i >foo && mv foo $i
done
rm -rf /etc/security/console.apps/*
|
|
|