Nachdem ich über Linux-Namespaces gelesen hatte, hatte ich den Eindruck, dass sie neben vielen anderen Funktionen eine Alternative zu chroot darstellen. Zum Beispiel in diesem Artikel :
Andere Verwendungen [von Namespaces] umfassen [...] die Isolierung eines Prozesses in der Art von chroot () für einen Teil der einzelnen Verzeichnishierarchie.
Wenn ich jedoch den Mount-Namespace klone, z. B. mit dem folgenden Befehl, wird immer noch der gesamte ursprüngliche Stammbaum angezeigt.
unshare --mount -- /bin/bash
Ich verstehe, dass ich jetzt in der Lage bin, zusätzliche Ladevorgänge in dem neuen Namespace durchzuführen, die nicht mit dem ursprünglichen Namespace geteilt werden, und dies stellt eine Isolierung dar, aber es ist immer noch derselbe Stamm, z. B. /etc
ist immer noch derselbe für beide Namespaces. Muss ich noch chroot
die Wurzel wechseln oder gibt es eine Alternative?
Ich hatte erwartet, dass diese Frage eine Antwort liefern würde, aber die Antwort verwendet nur chroot
wieder.
EDIT # 1
Es gab einen jetzt gelöschten Kommentar, der dies erwähnte pivot_root
. Da dies tatsächlich Teil von ist linux/fs/namespace.c
, ist es tatsächlich Teil der Namespaces-Implementierung. Dies deutet darauf hin, dass das Ändern des Stammverzeichnisses nur mit unshare
und mount
nicht möglich ist, Namespaces jedoch eine eigene, cleverere Version von chroot
. Trotzdem verstehe ich diesen Ansatz nicht als grundlegend anders chroot
, auch nicht nach dem Lesen des Quellcodes (im Sinne von z. B. Sicherheit oder besserer Isolation).
EDIT # 2
Dies ist kein Duplikat dieser Frage . Nach der Ausführung aller Befehle aus der Antwort habe ich separate /tmp/tmp.vyM9IwnKuY (oder ähnlich), aber das Stammverzeichnis ist immer noch das gleiche!
pivot_root
undchroot
: Ich habe mir die Docker-Quellen angesehen und festgestellt, dass diese Mechanismen , wenn sie nicht ausgeführt werden könnenpivot_root
,chroot
auf mindestens ähnliche Funktionen für Containerisierungszwecke zurückgreifen.Antworten:
Wenn Sie einen Mount-Namespace eingeben, bevor
chroot
Sie einen einrichten, können Sie vermeiden, dass der Host-Namespace mit zusätzlichen Mounts überladen wird, z/proc
. Sie könnenchroot
in einem Mount-Namespace einen netten und einfachen Hack verwenden.Ich denke, es gibt Vorteile beim Verstehen
pivot_root
, aber es hat eine gewisse Lernkurve. Die Dokumentation erklärt nicht alles ... obwohl es inman 8 pivot_root
(für den Shell-Befehl) ein Anwendungsbeispiel gibt .man 2 pivot_root
(für den Systemaufruf) könnte klarer sein, wenn es dasselbe tut und ein Beispiel-C-Programm enthält.So verwenden Sie pivot_root
Unmittelbar nach der Eingabe des Mount-Namespace benötigen Sie ebenfalls
mount --make-rslave /
oder ein gleichwertiges Element. Andernfalls werden alle Mount-Änderungen auf die Mounts im ursprünglichen Namespace übertragen, einschließlich derpivot_root
. Das willst du nicht :).Wenn Sie den
unshare --mount
Befehl verwendet haben, beachten Sie, dass die Anwendungmount --make-rprivate
standardmäßig dokumentiert ist . AFAICS Dies ist eine schlechte Standardeinstellung, und Sie möchten dies nicht im Produktionscode.eject
Zum Beispiel würde es an diesem Punkt aufhören , an einer eingebundenen DVD oder USB im Host-Namespace zu arbeiten. Die DVD oder der USB-Stick verbleiben im privaten Bereitstellungsbaum und der Kernel lässt Sie die DVD nicht auswerfen.Danach können Sie zB das von
/proc
Ihnen verwendete Verzeichnis einhängen . So wie du es für tun würdestchroot
.Anders als bei der Verwendung
chroot
ist espivot_root
erforderlich, dass Ihr neues Root-Dateisystem ein Mount-Punkt ist. Wenn es nicht ein bereits ist, können Sie diese erfüllen , indem einfach eine bind montieren:mount --rbind new_root new_root
.Verwenden Sie
pivot_root
- und dannumount
das alte Root-Dateisystem mit der Option-l
/MNT_DETACH
. ( Du brauchst nichtumount -R
, was länger dauern kann. )Technisch gesehen muss die Verwendung im
pivot_root
Allgemeinen auch die Verwendung umfassenchroot
. es ist nicht "entweder-oder".Per
man 2 pivot_root
, wird es nur als Swapping die Wurzel des Mount - Namensraum definiert. Es ist nicht definiert, auf welches physische Verzeichnis der Prozessstamm verweist. Oder das aktuelle Arbeitsverzeichnis (/proc/self/cwd
). Es kommt vor, dass dies der Fall ist , aber dies ist ein Hack, um Kernel-Threads zu behandeln. Die Manpage sagt, dass sich dies in Zukunft ändern könnte.Normalerweise möchten Sie diese Sequenz:
Die Position der
chroot
in dieser Sequenz ist noch ein weiteres subtiles Detail . Obwohlpivot_root
es darum geht, den Mount-Namespace neu zu ordnen, scheint der Kernel-Code das zu verschiebende Root-Dateisystem zu finden, indem er sich das pro Prozess definierte Root-Verzeichnis ansiehtchroot
.Warum soll ich pivot_root verwenden?
Grundsätzlich ist es sinnvoll,
pivot_root
für Sicherheit und Isolation zu verwenden. Ich denke gerne über die Theorie der leistungsbasierten Sicherheit nach . Sie übergeben eine Liste der benötigten Ressourcen, und der Prozess kann auf keine anderen Ressourcen zugreifen. In diesem Fall handelt es sich um die Dateisysteme, die an einen Mount-Namespace übergeben wurden. Diese Idee gilt allgemein für die Linux-Funktion "Namespaces", obwohl ich sie wahrscheinlich nicht sehr gut ausdrücken kann.chroot
Legt nur den Prozessstamm fest, der Prozess verweist jedoch weiterhin auf den vollständigen Mount-Namespace. Wenn ein Prozess die Berechtigung zum Ausführen behältchroot
, kann er den Namespace des Dateisystems sichern. Wie inman 2 chroot
"Der Superuser kann aus einem 'Chroot-Gefängnis' entkommen, bis ..." ausgeführt.Ein anderer nachdenklicher Weg zum Rückgängigmachen
chroot
istnsenter --mount=/proc/self/ns/mnt
. Dies ist vielleicht ein stärkeres Argument für das Prinzip.nsenter
/setns()
lädt den Prozessstamm notwendigerweise vom Stamm des Mount-Namespace neu ... obwohl die Tatsache, dass dies funktioniert, wenn sich die beiden auf unterschiedliche physische Verzeichnisse beziehen, als Kernel-Fehler angesehen werden kann. (Technischer Hinweis: Es können mehrere Dateisysteme im Stammverzeichnissetns()
übereinander montiert sein ; verwendet das oberste, zuletzt montierte Dateisystem ).Dies zeigt einen Vorteil der Kombination eines Mount-Namespaces mit einem "PID-Namespace". Wenn Sie sich in einem PID-Namespace befinden, können Sie den Mount-Namespace eines unbeschränkten Prozesses nicht eingeben. Außerdem wird verhindert, dass Sie die Wurzel eines nicht abgeschlossenen Prozesses eingeben (
/proc/$PID/root
). Und natürlich verhindert ein PID-Namespace auch, dass Sie einen Prozess beenden, der sich außerhalb befindet :-).quelle
mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL)
umount -l ./oldroot
pivot_root(".", ".")
Trick erklärt , derpivot_root
in den meisten Fällen am einfachsten anzuwenden ist (nichtchroot
erforderlich).