Zum Inhalt springen

Pam namespace.so: Unterschied zwischen den Versionen

Aus Foxwiki
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