PAM

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Installation von Programmen

  2. ⚓︎ Starten von Programmen

  3. ⚓︎ Ein Terminal öffnen

  4. ⚓︎ mit Root-Rechten arbeiten

Inhaltsverzeichnis
  1. Installation
  2. Funktionsweise
  3. Abarbeitung steuern
  4. Dokumentation
  5. Praxisbeispiele
    1. Situationsabhängige Anmeldung
    2. Zeitsperre
    3. Verschlüsseltes Benutzerverzeichnis
  6. Links

PAM steht generell für Pluggable Authentication Modules und in diesem Artikel geht es um deren Implementation für Linux (Linux-PAM). PAM wurde spezifiziert mit der Spezifikation P702 von "The Open Group" nach Vorarbeit von SunSoft mit Dokumentation als OSF-RFC 86.0.

Linux-PAM (im folgenden kurz: PAM) ist eine Kollektion von gemeinsam genutzten Modulen mit deren Hilfe der Systemverwalter die Identifizierung und Authentifizierung von Benutzern bei der Anmeldung an das System konfigurieren kann. Dabei können sowohl unterschiedliche Methoden (wie Passwort, Token, biometrische Merkmale) berücksichtigt werden als auch für unterschiedliche Anmeldewege (per Login, FTP, SSH, SMB etc.) unterschiedliche Möglichkeiten vorgesehen werden. Außerdem können bei der Eröffnung einer Benutzersitzung spezielle Aktionen erfolgen.

Installation

Bei allen Ubuntu-Systemen werden die grundlegenden Pakete für PAM bereits bei der Installation des Systems mit installiert[1]:

Befehl zum Installieren der Pakete:

sudo apt-get install libpam-runtime libpam-systemd libpam-cap libpam-modules libpam-modules-bin 

Oder mit apturl installieren, Link: apt://libpam-runtime,libpam-systemd,libpam-cap,libpam-modules,libpam-modules-bin

Bei Desktops mit Gnome oder darauf basierenden Oberflächen wird auch standardmäßig installiert:

Befehl zum Installieren der Pakete:

sudo apt-get install libpam-gnome-keyring 

Oder mit apturl installieren, Link: apt://libpam-gnome-keyring

Wer in das fertig installierte System eingreifen will, beispielsweise durch Berücksichtigung weiterer Authentifizierungsmethoden per Biometrie, Bluetooth, Hardware- oder Software-Tokens etc. oder weil bei der Eröffnung der Benutzersitzung spezifische Aktionen erfolgen solle (z.B. Einbindung weiterer Dateisysteme), benötigt fundierte Kenntnisse über das System. Diesem Personenkreis wird die Installation[1] des Dokumentationspakets empfohlen:

Befehl zum Installieren der Pakete:

sudo apt-get install libpam-doc 

Oder mit apturl installieren, Link: apt://libpam-doc

Siehe Dokumentation

In den offiziellen Paketquellen finden sich etliche weitere Pakete mit Modulen für spezielle Zwecke unter den Namen libpam-SCHIESS-MICH-TOT, welche nicht alle hier besprochen werden können.

Funktionsweise

Jedes Mal, wenn sich auf einem Linux-System ein Benutzer lokal oder über das Netzwerk anmeldet, kann die angesprochene Applikation (login, GDM, SDDM, LightDM, SSH, FTP, Samba usw.) die Abwicklung an PAM delegieren. Bei Ubuntu und vielen anderen Distributionen erfolgt das auch tatsächlich so. Die Vorteile dieser Vorgehensweise sind:

PAM kennt vier Themen:

Dies alles kann für jede Applikation über Textdateien konfiguriert werden. Dafür gibt es zwei Varianten:

  1. Die ältere Methode verwendet ausschließlich die Datei /etc/pam.conf. In dieser stehen Zeilen mit fünf Feldern, voneinander durch Leerraum (Leerzeichen, Tabulator) getrennt:

     <Applikation> <Thema> <Bewertung> <Modul> <Daten für Modul> 

    Bei Ubuntu ist diese Datei leer bis auf Kommentarzeilen, weil Ubuntu die zweite, neuere Methode benutzt und die alte Konfigurationsdatei überhaupt nicht beachtet. Man sollte daher diese Datei auch nicht verändern. Diese alte Konfigurationsmethode wird in diesem Artikel nicht weiter besprochen.

  2. Die neue Methode verwendet für jede Applikation eine eigene Textdatei im Ordner /etc/pam.d/, deren Dateiname mit dem Kampfnamen der Applikation übereinstimmen muss. Beispiele: Für die Applikation SSH-Server ist hier zuständig sshd, für eine Anmeldung am Druckserver CUPS cups, für eine Anmeldung an einer SMB-Freigabe per smbd ist bei PAM die Datei samba zuständig. In diesen Dateien stehen Zeilen mit vier Feldern:

     <Thema> <Bewertung> <Modul> <Daten für Modul> 

    Das Feld <Applikation> fehlt, weil es ja durch den Dateinamen bereits feststeht.

Die wichtigste Konfigurationsdatei für PAM ist /etc/pam.d/other; hier steht, wie sich PAM verhalten soll, wenn eine Applikation, für die PAM nicht konfiguriert wurde, eine Anmeldung auslöst[3][2]:

grep -v -e ^$ -e ^# /etc/pam.d/other 

@include common-auth
@include common-account
@include common-password
@include common-session

Das Schlüsselwort "@include" in der Spalte <Thema> bedeutet, dass eine andere Datei an dieser Stelle textuell eingefügt werden soll. Das führt hier zu folgender effektiver Konfiguration:

grep -v -e ^$ -e ^# /etc/pam.d/common-{account,auth,password,session} 

/etc/pam.d/common-account:account	[success=1 new_authtok_reqd=done default=ignore]	pam_unix.so 
/etc/pam.d/common-account:account	requisite			pam_deny.so
/etc/pam.d/common-account:account	required			pam_permit.so
/etc/pam.d/common-auth:auth	[success=1 default=ignore]	pam_unix.so nullok
/etc/pam.d/common-auth:auth	requisite			pam_deny.so
/etc/pam.d/common-auth:auth	required			pam_permit.so
/etc/pam.d/common-auth:auth	optional			pam_cap.so 
/etc/pam.d/common-password:password	[success=1 default=ignore]	pam_unix.so obscure sha512
/etc/pam.d/common-password:password	requisite			pam_deny.so
/etc/pam.d/common-password:password	required			pam_permit.so
/etc/pam.d/common-password:password	optional	pam_gnome_keyring.so 
/etc/pam.d/common-session:session	[default=1]			pam_permit.so
/etc/pam.d/common-session:session	requisite			pam_deny.so
/etc/pam.d/common-session:session	required			pam_permit.so
/etc/pam.d/common-session:session optional			pam_umask.so
/etc/pam.d/common-session:session	required	pam_unix.so 
/etc/pam.d/common-session:session	optional	pam_systemd.so 

Achtung!

  • Es gibt keinen guten Grund, an dieser Standardkonfiguration etwas zu verändern. Wer es trotzdem tun möchte, sollte sich bewusst sein, dass hier an einer zentralen Stelle für die Sicherheit des Systems gearbeitet wird. Ein kleiner Fehler kann hier sowohl zu einem absolut sicheren System führen, an dem sich aber niemand mehr anmelden kann oder auch zu einem total unsicheren Systems durch unbeabsichtigten Einbau einer Hintertüre.

  • Die Systemdateien /etc/pam.d/common-* werden beispielsweise automatisch über das Paketsystem APT mit dem Programm pam-auth-update gepflegt. Eigene inkompatible Eingriffe können daher bei einer Aktualisierung unerwartete Folgen verursachen.

  • Arbeiten an den Konfigurationsdateien für PAM erfordern besondere Vorsicht, gepaart mit sorgfältig geplanten und durchgeführten Tests zur Sicherheit!

Eine Konfigurationsdatei für eine Applikation kann diese Zeilentypen enthalten:

  1. Kommentarzeilen beginnen mit dem Zeichen # und werden ignoriert.

  2. Leerzeilen enthalten gar nichts und werden auch ignoriert.

  3. Konfigurationszeilen beginnen mit einem Schlüsselwort nach Tabelle 1.

Andere Zeilen als die drei vorstehend genannten sind unzulässig.

Die vier Felder einer Konfigurationszeile können diese Werte enthalten:

⚓︎

Tabelle 1: Schlüsselworte im ersten Feld
Schlüsselwort Bedeutung
account Die Zeile spezifiziert eine formale Prüfung, ob das betreffende Benutzerkonto momentan gültig ist. Dazu gehört z.B., dass es überhaupt existiert, momentan oder dauerhaft nicht gesperrt ist, überhaupt zur Anmeldung vorgesehen ist.
auth Die Zeile spezifiziert eine Methode, mit der der Benutzer nachweisen kann, dass er tatsächlich der ist, der er zu sein behauptet. Das kann z.B. ein Passwort sein, Vorzeigen eines Gegenstands mit bestimmten technischen Merkmalen ("Hardware-Token") oder ein über eine passende Hardware identifiziertes biometrisches Merkmal.
password Bei einem angeforderten oder erzwungenen Passwortwechsel muss das neue Passwort hinsichtlich Länge, Komplexität, Gültigkeitsdauer etc. hier festgelegten Restriktionen genügen. Man kann z.B. auch die Wiederverwendung eines früheren Passwortes verbieten.
session Hier stehen Maßnahmen, die bei einer erfolgreichen Anmeldung durchgeführt werden und ggf. auch erfolgreich durchgeführt werden müssen, weil anderenfalls die Anmeldung doch nicht erfolgt. Dazu können gehören die Einrichtung eines Homeverzeichnis für den Benutzer, Setzen von Umgebungsvariablen und des Umask-Wertes, Test auf neue E-Mails, Beauftragung eines Display-Managers mit dem Start eines grafischen Desktops usw.
@include DATEI Die Zeilen der genannten DATEI aus dem Ordner /etc/pam.d/ werden an dieser Stelle so berücksichtigt, als wenn sie tatsächlich hier stehen würden.

⚓︎

Tabelle 2: Schlüsselworte im zweiten Feld
Langform
Schlüsselwort
Ergebnis
[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
required
Wenn der PAM-Modul ignore zurückmeldet, dann hat diese Zeile keinen Einfluss auf des Ergebnis.
Wenn der PAM-Modul „Prüfung bestanden“ oder „Passwort muss geändert werden!“ zurückmeldet, kann der Anmeldeversuch (später) erfolgreich sein.
Mit jeder anderer Rückmeldung wird der Anmeldeversuch später nach ggf. weiteren Prüfungen scheitern.
[success=ok new_authtok_reqd=ok ignore=ignore default=die]
requisite
Wenn der PAM-Modul ignore zurückmeldet, dann hat diese Zeile keinen Einfluss auf des Ergebnis.
Wenn der PAM-Modul „Prüfung bestanden“ oder „Passwort muss geändert werden!“ zurückmeldet, kann der Anmeldeversuch (später) erfolgreich sein.
Mit jeder anderer Rückmeldung scheitert der Anmeldeversuch sofort; es werden keine weiteren Prüfungen durchgeführt.
[success=done new_authtok_reqd=done default=ignore]
sufficient
Wenn der PAM-Modul „Prüfung bestanden“ oder „Passwort muss geändert werden!“ zurückmeldet, dann ist der Anmeldeversuch sofort erfolgreich, sofern noch keine negativen Ergebnisse vorliegen; es werden keine weiteren Prüfungen durchgeführt. Mit jeder anderen Rückmeldung hat die Zeile zwar keinen Einfluss auf das Ergebnis, es erfolgen aber ggf. Prüfungen über folgende Zeilen.
[success=ok new_authtok_reqd=ok default=ignore]
optional
Wenn der PAM-Modul „Prüfung bestanden“ oder „Passwort muss geändert werden!“ zurückmeldet, kann der Anmeldeversuch später erfolgreich enden, sofern noch keine negativen Ergebnisse vorliegen; es werden weitere Prüfungen durchgeführt. Mit jeder anderen Rückmeldung hat die Zeile keinen Einfluss auf das Ergebnis, es erfolgen aber ggf. Prüfungen über folgende Zeilen.
include DATEI Die in der angegebenen DATEI enthaltenen Zeilen zum selben Thema werden an dieser Stelle als Text eingebunden und ausgeführt, so als wenn diese tatsächlich hier vorhanden währen. Die Prüfungen im eingebundenen Textblock beeinflussen direkt die Ergebnisse und man kann in den eingebundenen Textblock hinein und heraus springen.
substack DATEI Die in der angegebenen DATEI enthaltenen Zeilen zum selben Thema werden an dieser Stelle quasi als Unterprogramm aufgerufen. Das Unterprogramm kennt nicht die bisherigen Ergebnisse, und Zeilen im Unterprogramm beeinflussen diese auch nicht direkt. Das aufrufende Programm verarbeitet die Rückgabewerte wie die jeder anderen Zeile. Man kann nicht in eine beliebige Zeile des eingebundenen Textblock springen.
[value1=action1 value2=action2 ...] Im allgemeinen Fall besteht die Auswertung aus einer in eckigen Klammern [] eingeschlossenen Liste von Wertepaaren in der Form "value=action", voneinander durch Leerzeichen getrennt. Der Teil value steht für einen möglichen benannten Rückgabewert der PAM-Module, und der Teil action steht für die Reaktion nach Tabelle 3, welche in diesem Fall erfolgen soll.

⚓︎

⚓︎

Tabelle 3: Reaktionen (anzugeben im zweiten Feld)
Reaktion Wirkung
ignore Diese Zeile trägt nicht zum Ergebnis bei.
bad Der Anmeldeversuch wird später scheitern, es werden aber ggf. weitere konfigurierte Prüfungen durchgeführt.
die Der Anmeldeversuch scheitert sofort; es werden keine weiteren Prüfungen durchgeführt.
ok Der Anmeldeversuch kann später erfolgreich enden, sofern noch keine gegensätzlichen Ergebnisse vorliegen und solche sich auch bei weiteren Prüfungen nicht ergeben.
done Sofern noch keine negativen Ergebnisse vorliegen, endet der Anmeldeversuch sofort erfolgreich, sonst wird er wegen der früheren Ergebnisse jetzt abgewiesen, Es erfolgen keine weiteren Prüfungen.
Ganzzahl > 0 Das ist zu lesen als: Überspringe die angegebene Anzahl der nachfolgend konfigurierten Prüfungen. Die Wirkung ist wie bei ok, es werden aber nicht alle weiteren Prüfungen ausgeführt, sondern eben einige übersprungen.
reset Vergiss alle bisherigen Ergebnisse und fahre fort mit der nächsten Prüfung.

Abarbeitung steuern

Die Zeilen in einer Konfigurationsdatei werden ähnlich wie in Skripten nacheinander von oben nach unten abgearbeitet. Sie werden alle abgearbeitet, sofern nicht

Man kann nur vorwärts springen, d.h. es gibt in diesen Konfigurationsdateien keine Programmschleifen.

Zur Erläuterung dieses verkappten GOTO-Befehls 🇬🇧 wird hier die Authentifizierung mittels common-auth besprochen:

1
2
3
4
auth	[success=1 default=ignore]	pam_unix.so nullok
auth	requisite			pam_deny.so
auth	required			pam_permit.so
auth	optional			pam_cap.so 

Zeile 1 startet das PAM-Modul pam_unix, welches das bei unixartigen Betriebssystemen übliche Authentifizierungsverhalten implementiert. Der Manpage des Moduls kann man die Bedeutung des Parameters nullok entnehmen: Es dürfen sich an dieser Stelle auch Benutzer anmelden, die gar kein Passwort haben. Das Modul überprüft, ob der eingegebene Benutzername in der Datei etc/passwd existiert, und ob das eingegebene Passwort mit dem in der Datei /etc/shadow übereinstimmt. (An Stelle dieser Dateien können über die Datei /etc/nsswitch alternative Methoden definiert sein.)

Wenn die Prüfung fehlschlägt, d.h. wenn der Benutzername unbekannt ist oder das falsche Passwort eingegeben wurde, gibt pam_unix jedenfalls nicht success zurück; das wird wegen der Bewertung default=ignore sofort vergessen und es wird mit der Zeile 2 fortgesetzt. Im Erfolgsfall gilt der sich anmeldende Benutzer aber als (vorläufig, da es widerrufen werden kann) authentifiziert und wegen success=1 wird eine Zeile (also konkret Zeile 2) übersprungen.

In Zeile 2, die ja nur dann ausgeführt wird, wenn keine gültige Benutzer/Passwort-Kombination vorgelegt wurde, wird der PAM-Modul pam_deny aufgerufen, welcher immer einen Fehler zurück meldet. Die Bewertung requisite impliziert das Verhalten, dass bei einem Fehler PAM sofort mit Fehlschlag beendet wird. Somit ist diese Zeile 2 eine verklausulierte Version von: „Du kommst hier nicht rein!“

In Zeile 3, welche ja nur erreicht wird, wenn der Benutzer bereits (vorläufig) erfolgreich authentifiziert wurde, liefert der Aufruf des PAM-Moduls pam_permit immer Erfolg, also nichts, was nicht schon bekannt wäre und macht damit an dieser Stelle effektiv gar nichts. Die Zeile 3 dient lediglich als Sprungziel und könnte auch fehlen.

In Zeile 4 wird schließlich noch das PAM-Modul pam_cap aufgerufen, dessen segensreiche Wirkung in seiner Manpage nachgelesen werden kann und bei einem Standard-Ubuntu-Desktop völlig irrelevant ist, da Ubuntu die Linux-Capabilities nicht verwendet. Auch der Rückgabewert dieses Moduls ist wegen der Bewertung optional unwichtig: Ein Fehlschlag wird vergessen und ein Erfolg liefert nichts Neues. (Dieses Modul sollte allerdings, wenn es verwendet wird, normalerweise an letzter Stelle stehen. Bei Ubuntu ist das nicht erfüllt, was sich nicht negativ auswirkt, solange die Linux-Capabilities gar nicht verwendet werden.)

Die vier Zeilen zusammen implementieren für PAM also die Anforderung:

Dokumentation

Das unter Installation erwähnte Dokumentationspaket enthält u.a. diese Handbücher:

Die Dokumentation findet man im Ordner /usr/share/doc/libpam-doc/html/: file:///usr/share/doc/libpam-doc/html/index.html 🇬🇧 (Dieser Link auf den eigenen Rechner wird nur in die Adresszeile des Browsers geladen und muss dann händisch aktiviert werden.)

Es gibt Manpages:

man PAM
man pam.d
man pam_MODUL   # für MODUL den Namen den MODULS einsetzen, z.b unix bei pam_unix.so, siehe Folgezeile
man -k pam_     # zeigt eine Liste der im System bekannten Manpages zu PAM (einige fehlen)
man -k pam      # zeigt eine Liste der im System bekannten Manpages zu PAM (und einige falsche Treffer) 

Praxisbeispiele

Diese Beispiele sollen nicht als besonders empfehlenswerte sichere Methoden gelten. Sie stehen hier als didaktische Anregungen, wie bestimmte Aufgaben mit PAM funktional lösbar sind. Ob die Lösungen auch im konkreten Einsatzfall hinreichend sicher sind, muss der Systemverwalter individuell prüfen und beurteilen.

Situationsabhängige Anmeldung

Aufgabe: Ein Laptop wird an verschieden Orten in wechselnden Netzwerken eingesetzt:

  1. In der Privatwohnung, deren Netzwerk hier als hinreichend gesichert vorausgesetzt wird, und in der ein physischer Zugriff durch unbefugte Personen nicht zu befürchten ist. Beim Betrieb des Rechners an diesem Ort soll eine Anmeldung des Benutzers ohne Abfrage eines Passwortes erfolgen.

  2. An anderen, öffentlich zugänglichen Orten, beispielsweise an einer Hochschule, in deren Netz sich Fremde aufhalten und Fremde auch möglicherweise physischen Zugriff auf den Rechner erlangen könnten. Beim Betrieb des Rechners an diesen Orten soll der Benutzer sich normal per Passwortabfrage anmelden.

Ansatz: Man benutzt den Router in der Privatwohnung als Hardware-Token. Wenn dieses erkannt wird, gilt es als ausreichende Authentifizierung und eine sonst erfolgende Passwort-Abfrage wird übersprungen.

Die Realisierung besteht aus zwei Teilen:

  1. Man benötigt ein PAM-Modul, welche das Hardwaretoken erkennt und Erfolg/Misserfolg zurückmeldet. Das muss man sich selber erstellen. Hier wird es mit dem PAM-Modul pam_exit realisiert, welches den Aufruf eines Programms erlaubt. Es hierfür geeignetes Skript mit Erläuterungen findet man als Anlage zu diesem Artikel: PAM/ist-zuhause

  2. Man muss eine geeignete Konfigurationsdatei von PAM ändern und eine weitere Authentifizierungsmethode einbauen. Für Systeme mit GDM als zuständige Applikation für die grafische Anmeldung ist das die Datei /etc/pam.d/gdm-password.

Man benenne mit Root-Rechten[4] die bisherige Datei /etc/pam.d/gdm-password um in z.B. /etc/pam.d/gdm-password~2023-06-29; der neue Name ist beliebig.

Man erstelle mit Root-Rechten[4]eine neue Datei /etc/pam.d/gdm-password mit diesem Inhalt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#PAM-1.0			/etc/pam.d/gdm-password
# Copyright (c) 2023		kB @ UbuntuUsers.de
# SPDX-License-Identifier:	GLWTPL
# https://spdx.org/licenses/GLWTPL.html (Good Luck With That Public License)

# Vorheriger effektiver Standard-Inhalt zu auth aus /etc/pam.d/gdm-password,
# jetzt umbenannt zu gdm-password~2023-06-29:
#/etc/pam.d/gdm-password:auth    requisite       pam_nologin.so
#/etc/pam.d/gdm-password:auth	 required	 pam_succeed_if.so user != root quiet_success

#/etc/pam.d/gdm-password:@include common-auth
#/etc/pam.d/common-auth:auth	[success=1 default=ignore]	pam_unix.so nullok
#/etc/pam.d/common-auth:auth	requisite			pam_deny.so
#/etc/pam.d/common-auth:auth	required			pam_permit.so
#/etc/pam.d/common-auth:auth	optional			pam_cap.so 

#/etc/pam.d/gdm-password:auth    optional        pam_gnome_keyring.so

auth    requisite			pam_nologin.so
auth	required			pam_succeed_if.so user != root quiet_success

#auth	[success=5 default=ignore]	pam_exec.so quiet /usr/bin/false
#auth	[success=4 default=ignore]	pam_exec.so quiet /usr/bin/false
auth	[success=3 default=ignore]	pam_exec.so quiet /usr/local/sbin/ist-zuhause
auth	[success=2 default=ignore]	pam_exec.so quiet /usr/bin/false
auth	[success=1 default=ignore]	pam_unix.so nullok
auth	requisite			pam_deny.so

auth    optional			pam_gnome_keyring.so
auth	optional			pam_cap.so 

account 	include	gdm-password~2023-06-29
session 	include	gdm-password~2023-06-29
password	include	gdm-password~2023-06-29

Zeitsperre

Man kann Benutzern die Anmeldung zu bestimmten Zeiten sperren und damit beispielsweise Kindern die nächtliche Benutzung des Rechners unmöglich machen. Siehe hierzu: pam time

Verschlüsseltes Benutzerverzeichnis

Jeder Benutzer kann sein eigenes (z.B per LUKS) verschlüsseltes Homeverzeichnis haben, welches erst bei seiner Anmeldung eingebunden und aufgeschlossen wird. Siehe hierzu: Daten verschlüsseln (Abschnitt „Mit-LUKS-verschluesselte-home-Partition-automatisch-beim-Anmelden-einbinden“)