Zum Inhalt springen

Linux/SELinux/06 Benutzer/PAM: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
 
(33 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 4: Zeile 4:


== Beschreibung ==
== Beschreibung ==
== Grundlagen der PAM-Architektur ==
== PAM-Architektur ==
'''PAM (Pluggable Authentication Modules)''' ist ein modulares Subsystem, über das Anwendungen wie login, sshd, su und andere Vorgänge im Zusammenhang mit der Anmeldung an das System delegieren
; [[PAM]] ([[Pluggable Authentication Modules]])
Anwendungen können Vorgänge im Zusammenhang mit der Anmeldung an das System delegieren
* modulares Subsystem


Die PAM-Konfiguration befindet sich in der Regel unter /etc/pam.d/, wo für jeden Dienst ein eigener Modul-Stack definiert ist
Anwendungen
* [[login]]
* [[sshd]]
* [[su]], ...
 
; Konfiguration
/etc/pam.d/
* Ein Modul je jeden Dienst


=== Grundlegende PAM-Gruppen ===
=== Grundlegende PAM-Gruppen ===
* auth Bestätigung der Identität des Benutzers und initiale Vergabe von Credentials;
{| class="wikitable options big"
* account Prüfung, ob der Zugriff auf den Dienst als solcher erlaubt ist;
! Gruppe !! Beschreibung
* password Änderung des Authentifizierungs-Tokens;
|-
* session Aktionen, die '''vor''' der Bereitstellung einer Sitzung und '''nach''' deren Beendigung ausgeführt werden müssen
| auth || Bestätigung der Identität des Benutzers und initiale Vergabe von Credentials
|-
| account || Prüfung, ob der Zugriff auf den Dienst als solcher erlaubt ist
|-
| password || Änderung des Authentifizierungs-Tokens
|-
| session || Aktionen, die '''vor''' der Bereitstellung einer Sitzung und '''nach''' deren Beendigung ausgeführt werden müssen
|}


Für SELinux ist insbesondere die Gruppe session kritisch, da die Zuweisung des SELinux-Kontexts eines Benutzers zur Vorbereitung der Laufzeitumgebung für die zukünftige Sitzung gehört
; Gruppe session
Für SELinux ist insbesondere die Gruppe session kritisch
* da die Zuweisung des SELinux-Kontexts eines Benutzers zur Vorbereitung der Laufzeitumgebung für die zukünftige Sitzung gehört


=== pam_selinux.so ===
=== pam_selinux.so ===
Ein Modul aus der Gruppe session
{| class="wikitable options big"
 
! Aufgabe !! Module !! Beschreibung
Seine Aufgabe besteht darin, '''den Sicherheitskontext für den als Nächstes gestarteten Prozess''' festzulegen
|-
* Während des Ablaufs eines Login-Programms (login, sshd usw.) bereitet das Modul den SELinux-Kontext für '''den nächsten''' zu startenden Prozess vor
| || [[pam_selinux.so]] || Sicherheitskontext für den nächstes gestarteten Prozess festlegen
 
|}
==== open_session ====
Nachdem der Benutzer die Login-Prüfung erfolgreich durchlaufen hat, wechselt PAM in die Phase open_session
* In diesem Moment '''bereitet''' pam_selinux.so '''den SELinux-Kontext für die Benutzersitzung vor'''
 
===== Funktionsprinzip =====
Zuordnung von Linux user zu SELinux user
* Verwendet wird die Datei seusers
 
Nachdem der SELinux user ermittelt wurde, muss das Modul bestimmen, welcher Login-Kontext für diese Sitzung gewählt werden kann und soll
* Verwendet werden die Datei default_contexts sowie benutzerspezifische Einstellungen unter /etc/selinux/<POLICY>/contexts/users/
* pam_selinux.so konfiguriert das System so, dass der als Nächstes gestartete Prozess bereits in diesem Kontext startet
* Danach startet das Login-Programm die Shell des Benutzers, und die Shell erscheint bereits mit dem korrekten SELinux-Kontext
 
==== close_session ====
Wenn der Benutzer seine Arbeit beendet und die Sitzung geschlossen wird, ruft PAM die Phase close_session auf
 
Das Modul pam_selinux.so '''entfernt die temporären Einstellungen, die mit der geöffneten Sitzung verbunden sind, und stellt den vorherigen Zustand wieder her'''
 
== Erweiterte Isolation ==
Hier werden noch einige weitere Module behandelt
 
=== pam_sepermit.so ===
Dieses Modul '''erlaubt oder verweigert die Anmeldung am System''' abhängig davon, ob SELinux im Modus '''Enforcing''' arbeitet
* Es stellt die Gruppen auth und account bereit, beteiligt sich also unmittelbar an der Entscheidung, ob ein Login in der Kette weiter zugelassen wird
 
; Wenn ein Benutzer oder eine Gruppe auf eine Regel aus der Konfiguration passt, wird die Anmeldung nur im Enforcing-Modus erlaubt
Im Modus permissive oder disabled gibt das Modul einen Zugriffsfehler zurück
* Für Benutzer, die zu keinem Eintrag passen, wird die Entscheidung an andere PAM-Module weitergereicht
 
Das Modul wird eingesetzt, wenn eine Anmeldung '''nur dann erlaubt werden soll, wenn SELinux die Richtlinie tatsächlich erzwingt'''
 
==== Konfiguration ====
Standardmäßig verwendet das Modul die Datei /etc/security/sepermit.conf
* Falls diese Datei nicht vorhanden ist, wird die Vendor-Datei aus /usr/share/pam/security/sepermit.conf verwendet
 
In sepermit.conf enthält jede Zeile eine der folgenden Varianten
* einen konkreten Benutzernamen (zum Beispiel alice)
* eine Gruppe über @group (zum Beispiel @devops)
* einen SELinux user über %seuser (zum Beispiel %user_u)
 
Zusätzlich können die Optionen exclusive oder ignore angegeben werden
* exclusive beschränkt den Benutzer auf eine einzige Login-Sitzung und beendet seine Prozesse beim Abmelden
* ignore bewirkt, dass das Modul im Enforcing-Modus PAM_IGNORE und in den übrigen Modi PAM_AUTH_ERR zurückgibt
* Die weitere Entscheidung trifft dann der restliche PAM-Stack
 
=== pam_namespace.so ===
Das gemeinsame Verzeichnis /tmp ist in einem Mehrbenutzersystem traditionell eine Quelle verschiedener Risiken, etwa
* Manipulation temporärer Dateien
* Race Conditions
* unerwünschte Überschneidung von Arbeitsdaten zwischen Benutzern
* Ansammlung von Artefakten, die das Verhalten von Anwendungen in einer anderen Sitzung beeinflussen


; Dieses Modul richtet für die Benutzersitzung private Namensräume mit sogenannten ''polyinstantiated directories'' ein
== Weitere Isolation ==
 
{| class="wikitable options big"
Die Idee der ''polyinstantiated directories'' besteht darin, dass dasselbe logische Verzeichnis, zum Beispiel /tmp, '''unterschiedliche physische Instanzen''' für verschiedene Benutzer oder — in SELinux-Szenarien — für unterschiedliche Sicherheitskontexte und Levels besitzen kann
! Aufgabe !! Module !! Beschreibung
 
pam_namespace.so wird als letzte Zeile der Gruppe session in der PAM-Konfiguration des jeweiligen Dienstes eingebunden
* Entsprechend wird es erst nach pam_selinux.so aktiv und arbeitet somit mit einem bereits bestimmten Kontext
 
==== Konfiguration ====
Die zentrale Konfigurationsdatei ist /etc/security/namespace.conf
* Falls sie nicht vorhanden ist, wird /usr/share/pam/security/namespace.conf verwendet
* Zusätzlich werden .conf-Dateien aus den Verzeichnissen /etc/security/namespace.d/ und /usr/share/pam/security/namespace.d/ eingelesen
 
Format einer Regel in namespace.conf
<syntaxhighlight lang="bash" highlight="1" copy line>
polydir instance_prefix method list_of_uids
</syntaxhighlight>
 
* polydir — Zielverzeichnis
* instance_prefix — Basispfad für die Instanzen
* method — Trennungsmethode
* list_of_uids — Ausnahmen, für die die Verzeichnisaufteilung nicht angewendet wird
 
===== Methoden =====
namespace.conf unterstützt mehrere Methoden
{| class="wikitable sortable options gnu big"
|-
! Unix !! GNU !! Parameter !! Beschreibung
|-
| user — Trennung nach Benutzername
|-
| level — Trennung nach MLS/MCS-Level und Benutzername
|-
|-
| context — Trennung nach vollständigem Sicherheitskontext und Benutzername
| || [[pam_sepermit.so]] ||
|-
|-
| tmpfs — die Instanz wird als separates tmpfs erzeugt
| || [[pam_namespace.so]] ||
|-
|-
| tmpdir — es wird ein temporäres Verzeichnis erstellt
| || [[pam_oddjob_mkhomedir.so]] ||
|}
|}


Für die Zugriffskontrolle mit SELinux sind die Methoden context und level besonders nützlich
-----
 
; Wichtig
: Für den korrekten Betrieb ..
 
=== pam_oddjob_mkhomedir.so ===
pam_oddjob_mkhomedir.so arbeitet in der Gruppe session
* Es prüft, ob das Home-Verzeichnis des Benutzers existiert
* Falls das Verzeichnis nicht existiert, initiiert das Modul dessen Erstellung
* Im Unterschied zum Standardmodul pam_mkhomedir.so '''kann dieses Modul Home-Verzeichnisse mit korrekten SELinux-Labels anlegen'''
 
Für den Betrieb dieses Moduls werden das Paket oddjob-mkhomedir, der laufende Dienst oddjobd sowie die zugehörige D-Bus- und oddjobd-Konfiguration benötigt
* Außerdem müssen die entsprechenden Dateipräfixe in der aktiven Policy vorhanden sein
 
Dieses Modul ist nützlich, wenn ein lokales Home-Verzeichnis erst beim ersten tatsächlichen Login angelegt werden soll
 
=== Praxis zu pam_namespace.so ===
Isolation von /tmp unterschiedlicher Sitzungen mit Hilfe von pam_namespace.so
 
Für su wird die Option unmnt_remnt empfohlen, da bei solchen Programmen die Polyinstanziierung möglicherweise bereits für die ursprüngliche Login-Sitzung eingerichtet ist und vor einer neuen Einrichtung sauber zerlegt und erneut aufgebaut werden muss
 
Benutzer vorbereiten
<syntaxhighlight lang="bash" highlight="" copy line>
useradd -m alice
useradd -m bob
passwd alice
passwd bob
</syntaxhighlight>
 
Für diese Übung kann der Modus permissive gesetzt werden, da hier keine Blockierungen benötigt werden; wichtig ist lediglich, dass SELinux aktiviert ist
<syntaxhighlight lang="bash" highlight="1" copy line>
setenforce 0
</syntaxhighlight>
 
Boolean prüfen und aktivieren, damit diese Funktion in der Policy erlaubt wird
<syntaxhighlight lang="bash" highlight="" copy line>
setsebool -P allow_polyinstantiation 1
getsebool allow_polyinstantiation
</syntaxhighlight>
 
Verzeichnis für die /tmp-Instanzen anlegen
<syntaxhighlight lang="bash" highlight="1" copy line>
mkdir /tmp-inst --mode 000
</syntaxhighlight>
 
Nach der Erstellung muss dafür der erwartete SELinux-Kontext wiederhergestellt werden
<syntaxhighlight lang="bash" highlight="1" copy line>
restorecon -Fv /tmp-inst
</syntaxhighlight>
 
Prüfung
<syntaxhighlight lang="bash" highlight="1" copy line>
ls -ldZ /tmp-inst
</syntaxhighlight>
 
Anschließend namespace.conf konfigurieren
 
Zunächst eine Sicherungskopie anlegen
<syntaxhighlight lang="bash" highlight="1" copy line>
cp /etc/security/namespace.conf /etc/security/namespace.conf.bak
</syntaxhighlight>
 
Danach muss in die Datei /etc/security/namespace.conf folgende Konfiguration eingetragen werden
<syntaxhighlight lang="bash" highlight="1" copy line>
/tmp    /tmp-inst/    user    root,adm
</syntaxhighlight>
 
Diese Zeile bedeutet Folgendes
* /tmp — das logische Verzeichnis, das isoliert werden soll
* /tmp-inst/ — der Basispfad, unter dem die realen Instanzen abgelegt werden
* user — Trennungsmethode nach Benutzername
 
Zur Veranschaulichung wird hier die Methode user verwendet
* root,adm — Liste der Ausnahmen
 
Nun pam_namespace.so für su aktivieren
* Dazu muss in der Datei /etc/pam.d/su im Abschnitt session Folgendes ergänzt werden
 
<syntaxhighlight lang="bash" highlight="1" copy line>
session    required  pam_namespace.so  unmnt_remnt
</syntaxhighlight>
 
Wie bereits erwähnt, gehört pam_namespace.so zum Typ session, da es weder die Passwortprüfung noch das eigentliche Zugangsrecht behandelt, sondern die Laufzeitumgebung für eine neue Benutzersitzung vorbereitet
* Damit ist die Konfiguration abgeschlossen
* Nun kann aus zwei verschiedenen Terminals eine Anmeldung für die Benutzer alice und bob mit Hilfe von su initiiert werden
 
Befehlssatz zur Prüfung für alice
<syntaxhighlight lang="bash" highlight="" copy line>
su - alice
findmnt --mountpoint /tmp
touch /tmp/alice.test
ls -la /tmp
</syntaxhighlight>
 
Zur Prüfung für bob
<syntaxhighlight lang="bash" highlight="" copy line>
su - bob
findmnt --mountpoint /tmp
ls -la /tmp
touch /tmp/bob.test
ls -la /tmp
</syntaxhighlight>
 
Der Befehl findmnt --mountpoint /tmp zeigt, dass /tmp innerhalb der Sitzung nicht mehr einfach das gemeinsame Systemverzeichnis ist, sondern aus einer separaten Instanz eingebunden wird, die auf Grundlage von /tmp-inst/ aufgebaut wurde
 
==== Rückbau ====
Nach Abschluss des Labors können die Änderungen manuell zurückgenommen werden
 
Aus /etc/pam.d/su muss die Zeile
<syntaxhighlight lang="bash" highlight="1" copy line>
session    required  pam_namespace.so  unmnt_remnt
</syntaxhighlight>
entfernt werden
 
Anschließend die ursprüngliche namespace.conf wiederherstellen
<syntaxhighlight lang="bash" highlight="1" copy line>
cp /etc/security/namespace.conf.bak /etc/security/namespace.conf
</syntaxhighlight>
 
Danach den Boolean wieder deaktivieren
<syntaxhighlight lang="bash" highlight="1" copy line>
setsebool -P allow_polyinstantiation 0
</syntaxhighlight>
 
Abschließend das angelegte Verzeichnis und die Benutzer entfernen
<syntaxhighlight lang="bash" highlight="" copy line>
rm -rf /tmp-inst
userdel bob
userdel alice
</syntaxhighlight>
 
{{navigation|Linux/SELinux/06 Benutzer|Linux/SELinux/07 Sandbox}}
{{navigation|Linux/SELinux/06 Benutzer|Linux/SELinux/07 Sandbox}}
----


[[Kategorie:Linux/SELinux/06]]
[[Kategorie:Linux/SELinux/06]]

Aktuelle Version vom 12. Juni 2026, 16:40 Uhr

Linux/SELinux/06 Benutzer/PAM - PAM-Module für SELinux

Beschreibung

PAM-Architektur

PAM (Pluggable Authentication Modules)

Anwendungen können Vorgänge im Zusammenhang mit der Anmeldung an das System delegieren

  • modulares Subsystem

Anwendungen

Konfiguration

/etc/pam.d/

  • Ein Modul je jeden Dienst

Grundlegende PAM-Gruppen

Gruppe Beschreibung
auth Bestätigung der Identität des Benutzers und initiale Vergabe von Credentials
account Prüfung, ob der Zugriff auf den Dienst als solcher erlaubt ist
password Änderung des Authentifizierungs-Tokens
session Aktionen, die vor der Bereitstellung einer Sitzung und nach deren Beendigung ausgeführt werden müssen
Gruppe session

Für SELinux ist insbesondere die Gruppe session kritisch

  • da die Zuweisung des SELinux-Kontexts eines Benutzers zur Vorbereitung der Laufzeitumgebung für die zukünftige Sitzung gehört

pam_selinux.so

Aufgabe Module Beschreibung
pam_selinux.so Sicherheitskontext für den nächstes gestarteten Prozess festlegen

Weitere Isolation

Aufgabe Module Beschreibung
pam_sepermit.so
pam_namespace.so
pam_oddjob_mkhomedir.so