logo

Linux -Virtualisierung - Chroot -Gefängnis

Ein Chroot auf UNIX -Betriebssystemen ist ein Betrieb, der das scheinbare Root -Verzeichnis für den aktuellen laufenden Prozess und seine Kinder verändert. Die Programme, die in dieser geänderten Umgebung ausgeführt werden, können nicht auf die Dateien außerhalb des benannten Verzeichnisbaums zugreifen. Dies schränkt im Wesentlichen ihren Zugang zu einem Verzeichnisbaum ein und erhält somit den Namen "Chroot -Gefängnis".

Die Idee ist, dass Sie einen Verzeichnisbaum erstellen, in dem Sie alle Systemdateien kopieren oder verknüpfen, die für einen Prozess ausgeführt werden müssen. Anschließend verwenden Sie den CHROOT -Systemaufruf, um das Stammverzeichnis zu ändern, um sich an der Basis dieses neuen Baumes zu befinden, und starten den Prozess, der in dieser chrootenden Umgebung ausgeführt wird. Da es nicht wirklich auf die geänderten Stamme verweisen kann, kann es diese Orte 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 Virtualisierung auf Kernelebene und hat im Vergleich zu virtuellen Maschinen praktisch keinen Overhead, bei denen es sich um eine Virtualisierung der Anwendungsschicht handelt. Es bietet eine sehr gute Methode, um mehrere isolierte Instanzen auf derselben Hardware zu erstellen. Eine virtuelle Maschine (VM) ist eine Software -Implementierung einer Maschine und nutzen häufig das, was als Hardware -Virtualisierung bezeichnet wird, um ein virtuelles Bild eines Arbeitssystems zu machen.

So verwenden Sie das Chroot -Gefängnis

Der grundlegende Befehl zum Erstellen eines Chroot -Gefängnisses lautet wie folgt:

 chroot /path/to/new/root command  
OR
chroot /path/to/new/root /path/to/server
OR
chroot [options] /path/to/new/root /path/to/server

HINWEIS: Nur ein Root/Privilegd -Benutzer kann den Chroot -Systemanruf verwenden. Ein nicht privilegierter Benutzer mit dem Zugriff auf den Befehl kann das Chroot-Gefängnis umgehen.



Schritte zum Erstellen eines Mini-Jail für den Befehl "Bash" und "LS"


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

Konvertieren Sie einen String in int
 $ mkdir jailed  
$ cd jailed

2. Erstellen Sie alle wesentlichen Verzeichnisse, damit der Befehl ausgeführt werden soll: Abhängig von Ihrem Betriebssystem können sich die erforderlichen Verzeichnisse ändern. Logischerweise erstellen wir alle diese Verzeichnisse, um eine Kopie der erforderlichen Bibliotheken zu führen. Um zu sehen, welche Verzeichnisse erforderlich sind, siehe Schritt 4.

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

3.Run Sie den Befehl "welcher": Führen Sie den Befehl "Welches" aus, um den Ort des Befehls von LS und Bash zu finden. Nach dem Ausführen der Befehlsbefehl diese Binärdateien im Verzeichnis "Bin" unseres Gefängnisses. Stellen Sie sicher, dass Sie keinen dieser Befehle bei Alias ​​haben. Von nun an würden wir unser Verzeichnis als Verzeichnis beziehen 'Inhaftiert' Verzeichnis aus Bequemlichkeit.



 $ 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 : Für die ausführbaren in unserem Inhaftiert Verzeichnis zur Arbeit Wir müssen die entsprechenden Bibliotheken/Objekte im inhaftierten Verzeichnis kopieren. Standardmäßig befasst sich die ausführbare Datei mit den Standorten, die mit '/' beginnt. Um die Abhängigkeiten zu finden, verwenden wir den Befehl 'LDD'

Computer definieren
$ 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 geeignete 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-linux-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 diesem ähnlich sein

Chroot Gefängnis' title=

5. sudo chroot: Führen Sie diesen Befehl aus, um die Stamme zusammen mit dem Pfad zur Shell in das inhaftierte Verzeichnis zu ändern. Standardmäßig wird versucht, '/bin/sh' Shell zu laden.

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

Sie können sich diesem Fehler stellen, während Sie den Befehl chroot ausführen 

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

Dies kann auf zwei Gründe liegen, aus denen entweder die Datei nicht vorhanden ist (was offensichtlich ist) oder wenn die Ladebibliothek ausfällt oder nicht verfügbar ist. Doppelüberprüfung, wenn sich die Bibliotheken am richtigen Ort befinden.

6. Eine neue Hülle muss auftauchen: Es ist unsere inhaftierte Bash. Wir haben derzeit nur 2 Befehle installiert Bash und LS. Glücklicherweise sind CD und PWD -Befehle in Bash -Shell gebaut und können sie auch verwenden.

Durchstreifen Sie durch das Verzeichnis. Versuchen Sie den Zugriff auf 'CD /../' oder ähnliches. Versuchen Sie, das Gefängnis zu brechen, wahrscheinlich werden Sie es nicht können. :)

if else-Anweisungen Java

Aus dem Gefängnis verlassen 

 $ exit

Der wichtigste und interessanteste Teil ist, dass beim Laufen Sie laufen 

 $ ps aux

und finden Sie den Prozess, dass Sie nur einen Prozess gibt 

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

Interessanterweise werden Prozesse in der inhaftierten Shell als einfacher Kinderprozess dieser Hülle ausgeführt. Alle Prozesse in der inhaftierten Umgebung sind im Host -Betriebssystem nur einfacher Benutzerebene und werden durch die vom Kernel bereitgestellten Namespaces isoliert. Daher gibt es minimale Overheads und als zusätzlichen Vorteil erhalten wir Isolation.

In ähnlicher Weise können Sie Ihre virtuelle inhaftierte Umgebung mehr Befehle hinzufügen. Um komplexere Programme hinzuzufügen, müssen Sie möglicherweise mehr Verzeichnisse wie '/proc' und '/dev' erstellen. Diese erhöhen die Komplexität des Prozesses. Hoffentlich benötigen wir es nicht für unseren Zweck.

wie man das Skript unter Linux ausführt

Dies ist alles, was Sie über Chroot und das Gefängnis von Verzeichnissen wissen müssen. Unser ultimatives Ziel ist es, zu verstehen, was Container sind und wie Dienste wie AWS (Amazon Web Services) Google Cloud und Docker in der Lage sind, so viele virtuelle Instanzen von Betriebssystemen auf Bedarf bereitzustellen. Auch wie führt Sys-Admin mehrere Webserver für mehrere Domänen auf einer einzelnen physischen Maschine aus. Dies war nur ein Schritt, um es zu verstehen?