pro Prozess private Dateisystem-Mountpunkte

24

Ich habe den unshareBefehl überprüft und gemäß seiner Manpage

   unshare - run program with some namespaces unshared from parent

Ich sehe auch, dass es eine Art Namespace gibt,

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

Was genau ist der Zweck dieses Mount-Namespace ? Ich versuche dieses Konzept anhand eines Beispiels zu verstehen.

Ramesh
quelle
1
Siehe auch kernel: Namespaces support und Artikel von Michael Kerrisk zu Namespaces auf LWN .
Gilles 'SO- hör auf böse zu sein'
@ Gilles, danke. Ich werde es mir ansehen. Bitte teilen Sie mir in der Zwischenzeit mit, ob in der Antwort noch etwas hinzugefügt werden muss.
Ramesh

Antworten:

29

Durch die Ausführung unshare -merhält der aufrufende Prozess eine private Kopie seines Mount-Namespace und die Freigabe von Dateisystemattributen wird aufgehoben, sodass das Stammverzeichnis, das aktuelle Verzeichnis oder die umask-Attribute nicht mehr für andere Prozesse freigegeben werden.

Also, was sagt der obige Absatz? Versuchen wir es anhand eines einfachen Beispiels.

Terminal 1:

Ich mache die folgenden Befehle im ersten Terminal.

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

Der letzte Befehl gibt mir die Ausgabe als,

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

Jetzt habe ich auch die folgenden Befehle ausgeführt.

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

Die Ausgabe des lsBefehls lautet:

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

Was ist die große Sache dabei? Warum soll ich das machen?

Ich öffne jetzt ein anderes Terminal ( Terminal 2 ) und führe die folgenden Befehle aus.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

Die Ausgabe ist wie folgt.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

Die Dateien hellound helloagainsind nicht sichtbar und ich habe mich sogar als root angemeldet, um diese Dateien zu überprüfen. Der Vorteil ist also, dass wir mit dieser Funktion ein privates temporäres Dateisystem erstellen können, das selbst andere Stammprozesse nicht sehen oder durchsuchen können.

Aus der Manpage von unshare,

Mount-Namespace Das Aktivieren und Deaktivieren von Dateisystemen hat keine Auswirkungen auf den Rest des Systems (CLONE_NEWNS-Flag), mit Ausnahme von Dateisystemen, die explizit als freigegeben markiert sind (mit mount --make-shared; siehe / proc / self / mountinfo für die freigegebenen Flags).

Es wird empfohlen, mount --make-rprivate oder mount --make-rslave nach unshare --mount zu verwenden, um sicherzustellen, dass die Mountpunkte im neuen Namespace wirklich nicht vom übergeordneten Namespace geteilt werden.

Der für den Namespace verwendete Speicher ist VFS, der vom Kernel stammt. Und - wenn wir es von Anfang an richtig eingerichtet haben - können wir ganze virtuelle Umgebungen erstellen, in denen wir der Root-Benutzer ohne Root-Berechtigungen sind.

Verweise:

Das Beispiel ist mit den Details aus diesem Blog-Beitrag gerahmt . Auch die Zitate dieser Antwort stammen aus dieser wunderbaren Erklärung von Mike . Eine weitere wundervolle Lektüre dazu finden Sie in der Antwort von hier .

Ramesh
quelle
1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.Und im Vergleich zu chroot, mit chrootDateien sind für andere sichtbar. Das ist erstaunlich und dieser Satz sollte wahrscheinlich ganz oben auf der Antwort stehen. + 1ed.
Sergiy Kolodyazhnyy
1
Nichts entgeht der Wurzel! Mit können nsenterSie den Namespace eingeben und die temporären Dateien anzeigen. Wenn Sie nur eine Freigabe aufheben (diejenige, die das tempdir besitzt), sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pkönnen Sie den Inhalt
anzeigen
2

Wenn Sie Bubble Wrap auf Ihrem System installiert haben , können Sie dies problemlos in einem Schritt tun:

bwrap --dev-bind / / --tmpfs /tmp bash

Im obigen Beispiel hat die innere Bash eine eigene Sicht auf / tmp.

Lösung von @ Ramesh-s Antwort inspiriert - danke dafür!

VasyaNovikov
quelle