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
Authentication Modules 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
|
Authentifizierungsmanagement
|
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
|
Authentifizierungsmanagement
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/*
|
|
|