GeeksforGeeks

Was ist ein Chroot-Gefängnis?

Ein Chroot unter Unix-Betriebssystemen ist ein Vorgang, der das scheinbare Stammverzeichnis für den aktuell ausgeführten Prozess und seine untergeordneten Prozesse ändert. Die Programme, die in dieser geänderten Umgebung ausgeführt werden, können nicht auf die Dateien außerhalb des angegebenen Verzeichnisbaums zugreifen. Dies schränkt im Wesentlichen ihren Zugriff auf einen Verzeichnisbaum ein und daher erhalten sie den Namen „chroot jail“.

Die Idee ist, dass Sie einen Verzeichnisbaum erstellen, in dem Sie alle Systemdateien kopieren oder verknüpfen, die für die Ausführung eines Prozesses erforderlich sind. Sie verwenden dann den Chroot-Systemaufruf, um das Stammverzeichnis so zu ändern, dass es sich an der Basis dieser neuen Struktur befindet, und starten den Prozess, der in dieser Chroot-Umgebung ausgeführt wird. Da es keine Pfade außerhalb des geänderten Stamms referenzieren kann, kann es diese Speicherorte nicht böswillig lesen oder schreiben.

Warum ist es erforderlich und wie unterscheidet es sich von den virtuellen Maschinen?
Dies ist eine Virtualisierung auf Betriebssystemebene und wird häufig anstelle von virtuellen Maschinen verwendet, um mehrere isolierte Instanzen des Host-Betriebssystems zu erstellen. Dies ist eine Kernel-Level-Virtualisierung und hat praktisch keinen Overhead im Vergleich zu virtuellen Maschinen, die eine Anwendungsschicht-Virtualisierung sind, als Ergebnis bietet es eine sehr gute Methode zum Erstellen mehrerer isolierter Instanzen auf der gleichen Hardware. Eine virtuelle Maschine (VM) ist eine Softwareimplementierung einer Maschine und nutzt häufig die sogenannte Hardwarevirtualisierung aus, um virtuelle Images eines funktionierenden Betriebssystems zu rendern.

Wie verwende ich es?
Der grundlegende Befehl zum Erstellen einer Chroot-Jail lautet wie folgt:

 chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot /path/to/new/root /path/to/server

Hinweis: Nur ein root / privilegierter Benutzer kann den Chroot-Systemaufruf verwenden. Ein nicht privilegierter Benutzer mit Zugriff auf den Befehl kann die Chroot-Jail umgehen.

Schritte zum Erstellen eines Mini-Gefängnisses für den Befehl ‚bash‘ und den Befehl ‚ls‘

1. Erstellen Sie ein Verzeichnis, das als Stammverzeichnis des Befehls fungiert.

 $ mkdir jailed $ cd jailed

2. Erstellen Sie alle wichtigen Verzeichnisse für die Ausführung des Befehls: Je nach Betriebssystem können sich die erforderlichen Verzeichnisse ändern. Logischerweise erstellen wir alle diese Verzeichnisse, um eine Kopie der erforderlichen Bibliotheken aufzubewahren. Um zu sehen, was alle Verzeichnisse erforderlich sind, siehe Schritt 4.

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3.Führen Sie den Befehl ‚which‘ aus: Führen Sie den Befehl ‚which‘ aus, um den Speicherort des Befehls ls und bash zu ermitteln. Nachdem Sie diesen Befehl ausgeführt haben, kopieren Sie diese Binärdateien in das Verzeichnis ‚bin‘ unseres Gefängnisses. Stellen Sie sicher, dass Sie keinen dieser Befehle als Alias haben. Von nun an würden wir unser Verzeichnis der Einfachheit halber als ‚Jailed‘ -Verzeichnis bezeichnen.

 $ unalias ls # Required only if you have aliased ls command $ unalias bash # Required only if you have aliased bash command $ cp $(which ls) ./bin/ $ cp $(which bash) ./bin/

4. Kopieren Sie die entsprechenden Bibliotheken / Objekte: Damit die ausführbaren Dateien in unserem Jailed-Verzeichnis funktionieren, müssen wir die entsprechenden Bibliotheken / Objekte in das JAILED-Verzeichnis kopieren. Standardmäßig betrachtet die ausführbare Datei die Speicherorte, die mit ‚/‘ beginnen. Um die Abhängigkeiten zu finden, verwenden wir den Befehl ‚ldd‘

$ ldd $(which bash) linux-vdso.so.1 => (0x00007ffc75dd4000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000) /lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)

Führen Sie die folgenden Befehle aus, um die entsprechenden Verzeichnisse zu erstellen.

$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/

Ähnlich für ls,

$ ldd $(which ls) linux-vdso.so.1 => (0x00007fff4f05d000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000) /lib64/ld-liux-x86-64.so.2 (0x000055e836c69000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/

Die endgültige Verzeichnisstruktur muss dieser ähnlich sein,

Chroot Jail

5. Sudo chroot: Führen Sie diesen Befehl aus, um das Stammverzeichnis zusammen mit dem Pfad zur Shell in das JAILED-Verzeichnis zu ändern. Standardmäßig wird versucht, die Shell ‚/ bin / sh‘ zu laden.

 $ cd .. $ sudo chroot jailed /bin/bash

Dieser Fehler kann beim Ausführen des chroot-Befehls auftreten,

chroot: failed to run command `/bin/bash': No such file or directory

Dies kann 2 Gründe haben: Entweder existiert die Datei nicht (was offensichtlich ist) oder wenn die Ladebibliothek fehlschlägt oder nicht verfügbar ist. Überprüfen Sie, ob sich die Bibliotheken am richtigen Ort befinden.

6. Eine neue Shell muss auftauchen: Es ist unsere eingesperrte Bash. Wir haben derzeit nur 2 Befehle installiert, bash und ls. Glücklicherweise sind cd und pwd integrierte Befehle in der Bash-Shell, sodass Sie sie auch verwenden können.

Durchstreifen Sie das Verzeichnis und versuchen Sie, auf ‚cd / ../‘ oder etwas ähnliches. Versuchen Sie, das Gefängnis zu brechen, wahrscheinlich werden Sie nicht in der Lage sein. 🙂

Um das Gefängnis zu verlassen,

 $ exit

Der wichtigste und interessanteste Teil ist, dass, wenn Sie laufen,

 $ ps aux

und finden Sie den Prozess, werden Sie feststellen, dass es nur einen Prozess,

root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

Interessanterweise werden Prozesse in der Jailed Shell als einfacher untergeordneter Prozess dieser Shell ausgeführt. Alle Prozesse in der JAILED-Umgebung sind nur einfache Prozesse auf Benutzerebene im Host-Betriebssystem und werden durch die vom Kernel bereitgestellten Namespaces isoliert.

Eine Kopie des hier erläuterten jailed-bash-Verzeichnisses kann hier heruntergeladen werden.

Ebenso können Sie Ihrer virtuellen Umgebung weitere Befehle hinzufügen. Um komplexere Programme hinzuzufügen, müssen Sie möglicherweise weitere Verzeichnisse wie ‚/proc‘ und ‚/dev‘ erstellen. Diese erhöhen die Komplexität des Prozesses. Hoffentlich brauchen wir es nicht für unseren Zweck.

Dies ist alles, was Sie über Chroot und das Jailing von Verzeichnissen wissen müssen. Unser oberstes Ziel ist es zu verstehen, was Container sind und wie Dienste wie AWS (Amazon Web Services), Google Cloud und Docker so viele virtuelle Instanzen von Betriebssystemen bei Bedarf bereitstellen können. Wie führt sys-admin mehrere Webserver für mehrere Domänen auf einem einzigen physischen Computer aus. Dies war nur ein Schritt zum Verständnis 🙂

  • https://help.ubuntu.com/community/DebootstrapChroot
  • https://wiki.archlinux.org/index.php/Install_from_existing_Linux
  • http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
  • https://wiki.archlinux.org/index.php/change_root

Über den Autor:
Pinkesh Badjatiya stammt aus IIIT Hyderabad. Er ist im Herzen ein Geek mit zahlreichen Projekten, nach denen es sich zu suchen lohnt. Seine Projektarbeit kann hier eingesehen werden.

Wenn Sie auch Ihren Blog hier präsentieren möchten, lesen Sie bitte GBlog für das Schreiben von Gästeblogs auf GeeksforGeeks.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.