[[Vorlage(Getestet, general)]] [[Vorlage(Fortgeschritten) ]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme_starten: Starten von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] PAM steht generell für ''[wikipedia:Pluggable_Authentication_Modules:'''P'''luggable '''A'''uthentication '''M'''odules]'' und in diesem Artikel geht es um deren Implementation für Linux (Linux-PAM). PAM wurde spezifiziert mit der [#Links Spezifikation P702] von "The Open Group" nach Vorarbeit von SunSoft mit Dokumentation als [#Links OSF-RFC 86.0]. Linux-PAM (im folgenden kurz: PAM) ist eine Kollektion von gemeinsam genutzten Modulen mit deren Hilfe der [:root: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:], [:Samba: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]: {{{#!vorlage Paketinstallation libpam-runtime, Laufzeitunterstützung für die PAM-Bibliothek, main libpam-systemd, System- und Diensteverwaltung - PAM-Modul, main libpam-cap, POSIX 1003.1e capabilities (PAM module), main libpam-modules, Pluggable Authentication Modules für PAM, main libpam-modules-bin, Pluggable Authentication Modules für PAM - Hilfsprogramme, main }}} Bei Desktops mit Gnome oder darauf basierenden Oberflächen wird auch standardmäßig installiert: {{{#!vorlage Paketinstallation libpam-gnome-keyring, PAM-Modul zum Entsperren des GNOME-Schlüsselbundes bei der Anmeldung, main }}} 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: {{{#!vorlage Paketinstallation libpam-doc, PAM-Dokumentation, main }}} Siehe [#Dokumentation 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: * Die jeweilige Applikation muss den Anmeldevorgang nicht selber implementieren, sondern nur standardisierte Funktionen einer Systembibliothek von PAM aufrufen. * Die Systembibliothek von PAM kann unabhängig von der Applikation entwickelt, getestet, geprüft werden – damit ist grundsätzlich ein höherer Qualität- und Sicherheitsstandard möglich als wenn jede Applikation das Rad neu erfinden müsste. * Die Einzelheiten des Anmeldeprozesses, beispielsweise zulässige Authentifizierungsmethoden können unabhängig von der Applikation spezifisch für das jeweilige System vom Systemverwalter konfiguriert werden. Dazu bedarf es keines Eingriffs in die jeweilige Applikation, sondern nur textuelle Änderungen in Konfigurationsdateien für PAM. PAM kennt vier Themen: * Authentifizierung: Ist der sich anmeldende Benutzer (mutmaßlich) tatsächlich derjenige, der er behauptet zu sein? Zur Beantwortung diese Frage können verschiedene Authentifizierungsmethoden einzeln oder in Kombination benutzt werden: Passworte (statisches klassisches UNIX-Passwort, Einmal-Passwort, spezielle Protokolle (wie Radius, Kerberos, LDAP, SMB, SMTP, IMAP u.a.), Vorzeigen von Hardware-Schlüsseln (per USB, Bluetooth etc.), biometrische Eigenschaften (z.B. Fingerabdruck) und mehr. Selbstverständlich muss die zur Nutzung dieser Möglichkeiten erforderliche Hardware unabhängig von PAM bereits funktionieren. * Benutzerkonto (Account): Darf der Benutzer sich anmelden? Das Benutzerkonto kann zeitweise oder dauerhaft gesperrt sein oder wegen gerade laufender Wartungsarbeiten darf sich momentan niemand anmelden. * Session: Sofern der Benutzer identifiziert, erfolgreich authentifiziert und keine Restriktionen des Benutzerkontos einer Anmeldung entgegenstehen, wird dem Benutzer Zugang zum System gewährt und es werden von PAM die für den Aufbau einer Session konfigurierten Aktionen durchgeführt. Dazu können u.a. gehören: * Bereitstellung weiterer, für den Benutzer spezifischen Dateisysteme, beispielsweise das eigene, vielleicht verschlüsselte [:Homeverzeichnis:] * Bereitstellung und Konfiguration einer Programmumgebung, z.B. von [:Umgebungsvariablen:] und Wert für [:umask:] * Start einer Sitzung im Systemd-Login-Manager * Öffnen eines Schlüsselbunds mit Anmeldedaten für andere Stellen * Start einer [:Shell:] * Benachrichtigung der aufrufenden Applikation über die erfolgreiche Anmeldung, diese kann weitere Aktionen zur Ausgestaltung der Session ergreifen, beispielsweise einen grafischen [:Desktop:] starten. * Passwortpflege: Dies gehört eigentlich zu Session, wird aber von PAM traditionell wegen seiner Wichtigkeit als eigenständiges Thema behandelt. Hier werden Methoden gesammelt, mit denen ein authentifizierter Benutzer sein Passwort ändern kann oder zwangsweise nach Ablauf der Gültigkeit ändern muss oder vielleicht auch verschiedene Passworte synchronisieren kann. Dabei können Vorgaben zur Passwortlänge und -komplexität überprüft und durchgesetzt werden. 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: \\ {{{ }}} 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. 1. 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/#Der-SSH-Server: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: \\ {{{ }}} Das Feld 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]: [[Vorlage(Befehl, "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 bedeutet, dass eine andere Datei an dieser Stelle textuell eingefügt werden soll. Das führt hier zu folgender effektiver Konfiguration: [[Vorlage(Befehl, "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 }}} {{{#!vorlage Warnung * 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. 1. Leerzeilen enthalten gar nichts und werden auch ignoriert. 1. Konfigurationszeilen beginnen mit einem Schlüsselwort nach [#Tabelle-1 Tabelle 1]. Andere Zeilen als die drei vorstehend genannten sind unzulässig. Die vier Felder einer Konfigurationszeile können diese Werte enthalten: * Das erforderlich erste Feld muss einem der in [#Tabelle-1 Tabelle 1] genannten Schlüsselworten entsprechen. * Das (außer bei `@include`) erforderliche dritte Feld muss eines der PAM-Module benennen. PAM-Module werden (für CPUs der Gruppe `x86_64`) im Ordner '''/lib/x86_64-linux-gnu/security/''' aufbewahrt. Für jedes dort abgelegt Modul gibt es eine eigene [:Manpage:]; für das Modul `pam_unix.so` z.B.: [[Vorlage(Befehl, "man pam_unix" ) ]] * Das optionale vierte Feld enthält Daten für das Modul im dritten Feld. * Des erforderliche zweite Feld beschreibt, wie die Rückgabe des Moduls im dritten Feld Einfluss auf die weitere Abarbeitung der Konfiguration und ob das abschließende Ergebnis des Anmeldeversuchs erfolgreich sein kann oder nicht. Mögliche Werte siehe [#Tabelle-2 Tabelle 2]. [[Anker(Tabelle-1)]] {{{#!vorlage Tabelle <-2 tableclass="zebra_start3" rowclass="titel" :> 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. }}} * Jedes der vier Themen `account, auth, password, session` wird zunächst unabhängig von den drei anderen bearbeitet und danach werden die vier einzelnen Ergebnisse zu einem Gesamtergebnis verrechnet, welches dann als erfolgreiche oder abgewiesene Anmeldung an die PAM aufrufende Applikation zurückgemeldet wird. [[Anker(Tabelle-2)]] {{{#!vorlage Tabelle <-2 tableclass="zebra_start3" rowclass="titel" :> Tabelle 2: Schlüsselworte im zweiten Feld +++ Langform[[BR]]Schlüsselwort Ergebnis +++ [success=ok new_authtok_reqd=ok ignore=ignore default=bad][[BR]]required Wenn der PAM-Modul `ignore` zurückmeldet, dann hat diese Zeile keinen Einfluss auf des Ergebnis.[[BR]] Wenn der PAM-Modul ''„Prüfung bestanden“'' oder ''„Passwort muss geändert werden!“'' zurückmeldet, kann der Anmeldeversuch (später) erfolgreich sein.[[BR]] 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][[BR]]requisite Wenn der PAM-Modul `ignore` zurückmeldet, dann hat diese Zeile keinen Einfluss auf des Ergebnis. [[BR]] Wenn der PAM-Modul ''„Prüfung bestanden“'' oder ''„Passwort muss geändert werden!“'' zurückmeldet, kann der Anmeldeversuch (später) erfolgreich sein. [[BR]] 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][[BR]]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][[BR]]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 [#Status-Codes benannten Rückgabewert] der PAM-Module, und der Teil `action` steht für die Reaktion nach [#Tabelle-3 Tabelle 3], welche in diesem Fall erfolgen soll. }}} [[Anker(Status-Codes)]] * Mögliche Rückgabewerte eines PAM-Moduls sind: * Im Erfolgsfall der Wert `0` für `success`. * Bei Misserfolg oder Fehler eine positive Zahl im Bereich `1, 2 … 32` für `open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete`. * Jeder andere als bereits genannter Rückgabewert wird ebenfalls als Fehler verstanden. * Ein PAM-Modul kann sich aber auf eine zweckmäßige Auswahl aus dieser Liste beschränken und muss nicht alle diese Werte realisieren. * Als weiterer Wert für `value` in einer Auswertungsliste ist an letzter Stelle möglich: `default`. Das steht dann für: ''„Alle anderen bisher nicht explizit genannten Rückgabewerte.“'' Man sollte `default=action` immer in einer Auswerteliste verwenden, da sonst für nicht genannte Werte irgendwelche Vorgaben wirksam werden könnten. [[Anker(Tabelle-3)]] {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :> 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 * die Abarbeitung mit einer [#Tabelle-3 Aktion] `die` oder `done` beendet wird, oder * mit Sprungbefehlen explizit Zeilen übersprungen werden. Man kann nur vorwärts springen, d.h. es gibt in diesen Konfigurationsdateien keine Programmschleifen. Zur Erläuterung dieses verkappten [https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf GOTO-Befehls] {en} wird hier die Authentifizierung mittels '''common-auth''' besprochen: {{{#!code text 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 [#Tabelle-2 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 [#Tabelle-2 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: * ''„Gib eine gültige Kombination aus UNIX-Benutzernamen und -Passwort ein, oder Du kommst hier nicht rein!“'' = Dokumentation = Das unter [#Installation Installation] erwähnte Dokumentationspaket enthält u.a. diese Handbücher: * für den Systemadministrator: SAG – The Linux-PAM System Administrators' Guide * für Programmierer von PAM-Modulen: MWG – The Linux-PAM Module Writers' Guide * für Programmierer von Applikationen: ADG – The Linux-PAM Application Developers' Guide Die Dokumentation findet man im Ordner '''/usr/share/doc/libpam-doc/html/''': [file:///usr/share/doc/libpam-doc/html/index.html] {en} (Dieser Link auf den eigenen Rechner wird nur in die Adresszeile des Browsers geladen und muss dann händisch aktiviert werden.) Es gibt [:Manpages:]: {{{#!vorlage Befehl 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 [:Administrator: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. 1. 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:] 1. 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: {{{#!code text #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 }}} * Die Zeilen 6-17 referieren den bisherigen effektiven Inhalt von '''gdm-password''' hinsichtlich `auth`. * Zeilen 19 und 20 sind unverändert übernommen. Ebenso Zeile 29. * Zeile 26 entspricht der ersten Zeile aus dem früher inkludierten '''common-auth''', dessen Zeilen nun direkt in der neuen Datei an Position 26, 27 und 30 stehen. * Neu sind die vier Zeilen 22-25, in denen bis zu 4 alternative Authenfizierungsmehoden stehen können. Die erste erfolgreiche überspringt die folgenden. Für die aktuelle Aufgabe wird nur eine der vier Zeilen benötigt, die anderen sind auf Fehlschag programmiert. (Beachte: Zeilen 22 und 23 sind durch Kommentarzeichen deaktiviert, jedoch nicht Zeile 25. Wenn man Zeile 25 auch deaktiviern möchte, muss man in Zeile 24 die Sprungweite anpassen, da hierfür nur die aktiven Zeilen gezählt werden!) * Schießlich werden mit den Zeilen 32-34 noch jeweils für die anderen Themen die Regeln aus der alten Datei eingebunden. == 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/#Mit-LUKS-verschluesselte-home-Partition-automatisch-beim-Anmelden-einbinden:] = Links = * [https://pubs.opengroup.org/onlinepubs/8329799/toc.htm Spezifikation P702 von "The Open Group] {en} * [http://www.opengroup.org/rfc/rfc86.0.html] {en} – UNIFIED LOGIN WITH PLUGGABLE AUTHENTICATION MODULES (PAM) * [wikipedia_en:Linux_PAM:] * [https://github.com/linux-pam/linux-pam] {en} – Projektseite von Linux-PAM * [https://www.linux-magazin.de/ausgaben/2004/05/hereinspaziert/ Die Pforten zur Linux-Maschine: Pluggable Authentication Modules] {de} – Artikel in Linux-Magazin 05/2004 * [https://tldp.org/HOWTO/User-Authentication-HOWTO/index.html User Authentication HOWTO] {en} – Howto bei TLDP (The Linux Dokumentation Project), zu PAM siehe dort speziell Kapitel 3ff * [https://dl.acm.org/doi/10.1145/362929.362947 Communications of the ACM Volume 11, Issue 3, p147] {en} – Expertenmeinung zu GOTO #tag: System, Sicherheit,