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önnen chroot
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 in man 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 der pivot_root
. Das willst du nicht :).
Wenn Sie den unshare --mount
Befehl verwendet haben, beachten Sie, dass die Anwendung mount --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ürdest chroot
.
Anders als bei der Verwendung chroot
ist es pivot_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 dann umount
das alte Root-Dateisystem mit der Option -l
/ MNT_DETACH
. ( Du brauchst nicht umount -R
, was länger dauern kann. )
Technisch gesehen muss die Verwendung im pivot_root
Allgemeinen auch die Verwendung umfassen chroot
. 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:
chdir(new_root); // cd new_root
pivot_root(".", put_old); // pivot_root . put_old
chroot("."); // chroot .
Die Position der chroot
in dieser Sequenz ist noch ein weiteres subtiles Detail . Obwohl pivot_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 ansieht chroot
.
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ält chroot
, kann er den Namespace des Dateisystems sichern. Wie in man 2 chroot
"Der Superuser kann aus einem 'Chroot-Gefängnis' entkommen, bis ..." ausgeführt.
Ein anderer nachdenklicher Weg zum Rückgängigmachen chroot
ist nsenter --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 Stammverzeichnis setns()
ü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 :-).
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.