|
|
| (36 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| | {{navigation|Linux/SELinux/06 Benutzer|Linux/SELinux/07 Sandbox}} |
| | |
| '''Linux/SELinux/06 Benutzer/PAM''' - [[PAM]]-Module für [[SELinux]] | | '''Linux/SELinux/06 Benutzer/PAM''' - [[PAM]]-Module für [[SELinux]] |
|
| |
|
| == Grundlagen der PAM-Architektur == | | == Beschreibung == |
| '''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-Architektur == |
| | ; [[PAM]] ([[Pluggable Authentication Modules]]) |
| | Anwendungen können Vorgänge im Zusammenhang mit der Anmeldung an das System delegieren |
| | * modulares Subsystem |
| | |
| | Anwendungen |
| | * [[login]] |
| | * [[sshd]] |
| | * [[su]], ... |
|
| |
|
| Die PAM-Konfiguration befindet sich in der Regel unter /etc/pam.d/, wo für jeden Dienst ein eigener Modul-Stack definiert ist
| | ; 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'''
| | == Weitere Isolation == |
| | | {| class="wikitable options big" |
| == Erweiterte Isolation == | | ! Aufgabe !! Module !! Beschreibung |
| 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
| |
| | |
| 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
| |
| | |
| 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]] |