Pam namespace.so: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „=== pam_namespace.so === ; Risiko /tmp 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 sogenan…“ |
Keine Bearbeitungszusammenfassung |
||
| Zeile 54: | Zeile 54: | ||
| [[tmpdir]] || es wird ein temporäres Verzeichnis erstellt | | [[tmpdir]] || es wird ein temporäres Verzeichnis erstellt | ||
|} | |} | ||
=== 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> | |||
Version vom 12. Juni 2026, 16:29 Uhr
pam_namespace.so
- Risiko /tmp
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
polydir instance_prefix method list_of_uids
| polydir | Zielverzeichnis |
| instance_prefix | Basispfad für die Instanzen |
| method | - |
| list_of_uids | Ausnahmen, für die die Verzeichnisaufteilung nicht angewendet wird |
Methoden
- namespace.conf unterstützt mehrere Methoden
Für die Zugriffskontrolle mit SELinux sind die Methoden context und level besonders nützlich
| Methoden | Beschreibung |
|---|---|
| user | Trennung nach Benutzername |
| level | Trennung nach MLS/MCS-Level und Benutzername |
| context | Trennung nach vollständigem Sicherheitskontext und Benutzername |
| tmpfs | die Instanz wird als separates tmpfs erzeugt |
| tmpdir | es wird ein temporäres Verzeichnis erstellt |
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
useradd -m alice
useradd -m bob
passwd alice
passwd bob
Für diese Übung kann der Modus permissive gesetzt werden, da hier keine Blockierungen benötigt werden; wichtig ist lediglich, dass SELinux aktiviert ist
setenforce 0
Boolean prüfen und aktivieren, damit diese Funktion in der Policy erlaubt wird
setsebool -P allow_polyinstantiation 1
getsebool allow_polyinstantiation
Verzeichnis für die /tmp-Instanzen anlegen
mkdir /tmp-inst --mode 000
Nach der Erstellung muss dafür der erwartete SELinux-Kontext wiederhergestellt werden
restorecon -Fv /tmp-inst
Prüfung
ls -ldZ /tmp-inst
Anschließend namespace.conf konfigurieren
Zunächst eine Sicherungskopie anlegen
cp /etc/security/namespace.conf /etc/security/namespace.conf.bak
Danach muss in die Datei /etc/security/namespace.conf folgende Konfiguration eingetragen werden
/tmp /tmp-inst/ user root,adm
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
session required pam_namespace.so unmnt_remnt
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
su - alice
findmnt --mountpoint /tmp
touch /tmp/alice.test
ls -la /tmp
Zur Prüfung für bob
su - bob
findmnt --mountpoint /tmp
ls -la /tmp
touch /tmp/bob.test
ls -la /tmp
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
session required pam_namespace.so unmnt_remnt
entfernt werden
Anschließend die ursprüngliche namespace.conf wiederherstellen
cp /etc/security/namespace.conf.bak /etc/security/namespace.conf
Danach den Boolean wieder deaktivieren
setsebool -P allow_polyinstantiation 0
Abschließend das angelegte Verzeichnis und die Benutzer entfernen
rm -rf /tmp-inst
userdel bob
userdel alice