SelfLinux Sicherheit Grundlagen Sicherheit Abschnitt 5 | SelfLinux-0.13.0

| Grundlagen Sicherheit | Autoren Formatierung GFDL

#### 5 Authentisierung, Autorisierung und Zugriffssteuerung mit PAM

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
    [...]

#### 5.1 Modultypen und Kontroll-Flags

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.

#### 5.2 Erläuterung eines Konfigurationsbeispiels

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

#### 5.3 weitere wichtige PAM-Module

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/*