Ausführen von unshare -m
gibt dem aufrufenden Prozess eine private Kopie seines Mount-Namensraums und hebt auch die Freigabe von Dateisystemattributen auf, so dass er sein Stammverzeichnis, aktuelles Verzeichnis oder umask-Attribute nicht länger mit irgendeinem anderen Prozess teilt.
Was sagt also der obige Absatz aus? Versuchen wir es anhand eines einfachen Beispiels zu verstehen.
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 von ls
Befehl ist,
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 also die große Sache bei all dem? Warum sollte ich das tun?
Ich öffne jetzt ein anderes Terminal (Terminal 2 ) und führen Sie 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 hello
und helloagain
sind nicht sichtbar und ich habe mich sogar als root angemeldet, um diese Dateien zu überprüfen. Der Vorteil ist also, dass diese Funktion es uns ermöglicht, ein privates temporäres Dateisystem zu erstellen, das selbst andere root-eigene Prozesse nicht sehen oder durchsuchen können.
Aus der Manpage von unshare
,
Mount-Namespace Das Mounten und Unmounten von Dateisystemen wirkt sich nicht auf den Rest des Systems aus (CLONE_NEWNS-Flag), mit Ausnahme von Dateisystemen, die explizit als gemeinsam genutzt gekennzeichnet sind (mit mount--make-shared; siehe /proc/self/mountinfo für die gemeinsam genutzten Flags).
Es wird empfohlen, mount --make-rprivate oder mount --make-rslaveafter unshare--mount zu verwenden, um sicherzustellen, dass Einhängepunkte im neuen Namensraum wirklich vom Eltern-Namensraum getrennt werden.
Der für den Namensraum verwendete Speicher ist VFS, das vom Kernel stammt. Und – wenn wir es überhaupt richtig einrichten – können wir ganze virtuelle Umgebungen erstellen, in denen wir der Root-Benutzer ohne Root-Berechtigungen sind.
Referenzen:
Das Beispiel wird anhand der Details aus diesem Blogbeitrag eingerahmt. Auch die Zitate dieser Antwort stammen aus dieser wunderbaren Erklärung von Mike. Eine weitere wunderbare Lektüre dazu finden Sie in der Antwort von hier.
Wenn Sie Bubblewrap auf Ihrem System installiert haben, können Sie dies ganz einfach in einem Schritt tun:
bwrap --dev-bind / / --tmpfs /tmp bash
Im obigen Beispiel hat inner bash seine eigene Ansicht auf /tmp.
Lösung inspiriert von @Rameshs Antwort - danke dafür!