So verwenden Sie den chroot-Befehl unter Linux

Der Befehl chroot kann Sie ins Gefängnis schicken, Ihre Entwicklungs- oder Testumgebungen isoliert halten oder einfach nur die Sicherheit Ihres Systems verbessern. Wir zeigen Ihnen, wie Sie es am einfachsten verwenden.

Was ist ein Chroot?

Wenn Sie versuchen, die Nützlichkeit eines Befehls zu messen, müssen Sie seine Funktionalität und seine Benutzerfreundlichkeit berücksichtigen. Wenn es für die Leute zu kompliziert oder zu langatmig ist, um sie dazu zu bringen, es zu benutzen, kann die Funktionalität genauso gut Null sein. Wenn es von niemandem verwendet wird, bietet es keine Funktionalität.

In Diskussionen mit Linux-Benutzern – persönlich und in Foren – scheint der Befehl chroot einer zu sein, der als schwierig zu verwenden oder zu umständlich und mühsam einzurichten gilt. Es scheint, dass dieses großartige Dienstprogramm nicht so oft verwendet wird, wie es sein könnte.

Mit chroot kannst du einrichten und Ausführen von Programmen oder interaktiven Shells wie Bash in einem gekapselten Dateisystem, das daran gehindert ist, mit Ihrem regulären Dateisystem zu interagieren. Alles in der chroot-Umgebung ist eingepfercht und enthalten. Nichts in der chroot-Umgebung kann über sein eigenes, spezielles Root-Verzeichnis hinaussehen, ohne zu Root-Rechten zu eskalieren. Das hat dieser Art von Umgebung den Spitznamen Chroot-Gefängnis eingebracht. Der Begriff „Gefängnis“ sollte nicht verwechselt werden mit FreeBSDs jail-Befehl, der eine chroot-Umgebung erstellt das ist sicherer als die übliche chroot-Umgebung.

Aber eigentlich gibt es einen sehr einfachen Weg, chroot zu verwenden, den wir durchgehen werden. Wir verwenden normale Linux-Befehle, die auf allen Distributionen funktionieren. Einige Linux-Distributionen verfügen über dedizierte Tools zum Einrichten von Chroot-Umgebungen, wie z debootstrap für Ubuntu, aber wir sind hier distro-agnostisch.

Wann sollten Sie eine Chroot verwenden?

Eine Chroot-Umgebung bietet ähnliche Funktionen wie eine virtuelle Maschine, ist jedoch eine einfachere Lösung. Für das Captive-System muss kein Hypervisor installiert und konfiguriert werden, wie z VirtualBox oder Virtual Machine Manager. Es muss auch kein Kernel im Captive-System installiert sein. Das Captive-System teilt Ihren vorhandenen Kernel.

In gewisser Hinsicht sind chroot-Umgebungen näher an Containern wie z LXC als bei virtuellen Maschinen. Sie sind leichtgewichtig, schnell bereitzustellen und können automatisiert erstellt und gestartet werden. Wie bei Containern besteht eine bequeme Möglichkeit, sie zu konfigurieren, darin, gerade so viel des Betriebssystems zu installieren, dass Sie die erforderlichen Schritte ausführen können. Die Frage, was erforderlich ist, wird beantwortet, indem Sie sich ansehen, wie Sie Ihre chroot-Umgebung verwenden werden.

Einige häufige Verwendungen sind:

Softwareentwicklung und Produktverifizierung. Entwickler schreiben Software und das Product Verification Team (PV) testet sie. Manchmal werden von PV Probleme gefunden, die auf dem Computer des Entwicklers nicht repliziert werden können. Der Entwickler hat alle möglichen Tools und Bibliotheken auf seinem Entwicklungscomputer installiert, die der durchschnittliche Benutzer – und PV – nicht haben wird. Oft stellt sich heraus, dass neue Software, die für den Entwickler funktioniert, aber nicht für andere, eine Ressource auf dem PC des Entwicklers verwendet, die nicht in der Testversion der Software enthalten ist. chroot ermöglicht es den Entwicklern, eine einfache Vanille-Umgebung auf ihrem Computer zu haben, in die sie die Software eintauchen können, bevor sie sie an PV weitergeben. Die Captive-Umgebung kann mit den minimalsten Abhängigkeiten konfiguriert werden, die die Software erfordert.

  So finden Sie Ihre IP-Adresse unter Linux

Verringerung des Entwicklungsrisikos. Der Entwickler kann eine dedizierte Entwicklungsumgebung erstellen, damit nichts, was darin passiert, seinen eigentlichen PC durcheinander bringen kann.

Ausführen veralteter Software. Manchmal muss man einfach eine alte Version von etwas laufen lassen. Wenn die alte Software Anforderungen hat, die mit Ihrer Linux-Version kollidieren oder nicht kompatibel sind, können Sie eine Umgebung für die problematische Software chrooten.

Wiederherstellung und Dateisystem-Upgrades: Wenn eine Linux-Installation funktionsunfähig wird, können Sie das beschädigte Dateisystem mit chroot an einem Einhängepunkt auf einer Live-CD mounten. Auf diese Weise können Sie in dem beschädigten System arbeiten und versuchen, es zu reparieren, als ob es normal unter root / gemountet wäre. Dies bedeutet, dass die erwarteten Dateipfade innerhalb des beschädigten Systems vom Stammverzeichnis aus korrekt referenziert werden und nicht vom Einhängepunkt der Live-CD. Eine ähnliche Technik wurde in dem Artikel verwendet, der beschreibt, wie das Linux-Dateisystem von ext2 oder ext3 auf ext4 migriert wird.

Ringfencing-Anwendungen. Das Ausführen eines FTP-Servers oder einer anderen mit dem Internet verbundenen Appliance in einer Chroot-Umgebung begrenzt den Schaden, den ein externer Angreifer anrichten kann. Dies kann ein wertvoller Schritt zur Erhöhung der Sicherheit Ihres Systems sein.

Erstellen einer chroot-Umgebung

Wir benötigen ein Verzeichnis, das als Stammverzeichnis der chroot-Umgebung fungiert. Damit wir eine Abkürzung für dieses Verzeichnis haben, erstellen wir eine Variable und speichern den Namen des Verzeichnisses darin. Hier richten wir eine Variable ein, um einen Pfad zum Verzeichnis „testroot“ zu speichern. Es spielt keine Rolle, ob dieses Verzeichnis noch nicht existiert, wir werden es bald erstellen. Wenn das Verzeichnis vorhanden ist, sollte es leer sein.

chr=/home/dave/testroot

Wenn das Verzeichnis nicht existiert, müssen wir es erstellen. Das können wir mit diesem Befehl tun. Die Option -p (parents) stellt sicher, dass alle fehlenden übergeordneten Verzeichnisse gleichzeitig erstellt werden:

mkdir -p $chr

Wir müssen Verzeichnisse erstellen, um die Teile des Betriebssystems zu speichern, die unsere chroot-Umgebung benötigt. Wir werden eine minimalistische Linux-Umgebung einrichten, die Bash als interaktive Shell verwendet. Wir werden auch die Befehle touch, rm und ls einschließen. Dadurch können wir alle integrierten Befehle der Bash sowie touch, rm und ls verwenden. Wir werden in der Lage sein, Dateien zu erstellen, aufzulisten und zu entfernen und Bash zu verwenden. Und – in diesem einfachen Beispiel – das ist alles.

  So bringen Sie Kanboard auf Ihrem Linux-Server zum Laufen

Listen Sie die Verzeichnisse auf, die Sie innerhalb von {} erstellen müssen. Strebenerweiterung.

mkdir -p $chr/{bin,lib,lib64}

Jetzt ändern wir das Verzeichnis in unser neues Stammverzeichnis.

cd $chr

Lassen Sie uns die Binärdateien, die wir in unserer minimalistischen Linux-Umgebung benötigen, aus Ihrem regulären „/bin“-Verzeichnis in unser chroot-Verzeichnis „/bin“ kopieren. Die Option -v (verbose) veranlasst cp, uns mitzuteilen, was es tut, während es jede Kopieraktion ausführt.

cp -v /bin/{bash,touch,ls,rm} $chr

Die Dateien werden für uns einkopiert:

Diese Binärdateien haben Abhängigkeiten. Wir müssen herausfinden, was sie sind, und diese Dateien ebenfalls in unsere Umgebung kopieren, sonst können bash, touch, rm und ls nicht funktionieren. Wir müssen dies der Reihe nach für jeden unserer ausgewählten Befehle tun. Wir machen zuerst Bash. Der ldd-Befehl wird Liste die Abhängigkeiten auf für uns.

ldd /bin/bash

Die Abhängigkeiten werden identifiziert und im Terminalfenster aufgelistet:

Wir müssen diese Dateien in unsere neue Umgebung kopieren. Die Details aus dieser Liste herauszusuchen und sie einzeln zu kopieren, wird zeitaufwändig und fehleranfällig sein.

Zum Glück können wir es halbautomatisieren. Wir listen die Abhängigkeiten erneut auf, und diesmal erstellen wir eine Liste. Dann durchlaufen wir die Liste und kopieren die Dateien.

Hier verwenden wir ldd, um die Abhängigkeiten aufzulisten und die Ergebnisse über eine Pipe in egrep einzuspeisen. Die Verwendung von egrep entspricht der Verwendung von grep mit der Option -E (erweiterte reguläre Ausdrücke). Die Option -o (nur übereinstimmende) beschränkt die Ausgabe auf die übereinstimmenden Teile von Zeilen. Wir suchen nach passenden Bibliotheksdateien, die auf eine Zahl enden [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

Wir können den Inhalt der Liste mit echo überprüfen:

echo $list

Jetzt, da wir die Liste haben, können wir sie mit der folgenden Schleife durchgehen und die Dateien nacheinander kopieren. Wir verwenden die Variable i, um durch die Liste zu gehen. Für jedes Mitglied der Liste kopieren wir die Datei in unser chroot-Root-Verzeichnis, das der Wert in $chr ist.

Die Option -v (verbose) bewirkt, dass cp jede Kopie ankündigt, während es sie ausführt. Die Option –parents stellt sicher, dass alle fehlenden übergeordneten Verzeichnisse in der chroot-Umgebung erstellt werden.

for i in $list; do cp -v --parents "$i" "${chr}"; done

für i in $liste;  do cp -v --parents

Und das ist die Ausgabe:

Wir verwenden diese Technik, um die Abhängigkeiten der anderen Befehle zu erfassen. Und wir verwenden die Loop-Technik, um das eigentliche Kopieren durchzuführen. Die gute Nachricht ist, dass wir nur eine kleine Änderung an dem Befehl vornehmen müssen, der die Abhängigkeiten sammelt.

  So installieren Sie KDE Plasma 5 unter Linux

Wir können den Befehl aus unserem Befehlsverlauf abrufen, indem wir einige Male die Aufwärtspfeiltaste drücken und dann die Bearbeitung vornehmen. Der Schleifenkopierbefehl muss sich überhaupt nicht ändern.

Hier haben wir den Aufwärtspfeil verwendet, um den Befehl zu finden, und ihn so bearbeitet, dass er Touch statt Bash sagt.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

Wir können jetzt genau den gleichen Schleifenbefehl wie zuvor wiederholen:

for i in $list; do cp -v --parents "$i" "${chr}"; done

für i in $liste;  do cp -v --parents

Und unsere Dateien werden für uns kopiert:

Wir können jetzt die Listenbefehlszeile für ls bearbeiten:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Auch hier verwenden wir denselben Schleifenbefehl. Es ist egal, welche Dateien sich in der Liste befinden. Es arbeitet sich blind durch die Liste und kopiert die Dateien für uns.

for i in $list; do cp -v --parents "$i" "${chr}"; done

für i in $liste;  do cp -v --parents

Und die Abhängigkeiten für ls werden für uns übernommen:

Wir bearbeiten die Listenbefehlszeile zum letzten Mal, damit sie für rm funktioniert:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Wir verwenden den Schleifenkopierbefehl ein letztes Mal:

for i in $list; do cp -v --parents "$i" "${chr}"; done

Die letzten unserer Abhängigkeiten werden in unsere chroot-Umgebung kopiert. Wir sind endlich bereit, den chroot-Befehl zu verwenden. Dieser Befehl legt das Stammverzeichnis der chroot-Umgebung fest und gibt an, welche Anwendung als Shell ausgeführt werden soll.

sudo chroot $chr /bin/bash

Unsere chroot-Umgebung ist jetzt aktiv. Die Eingabeaufforderung des Terminalfensters hat sich geändert, und die interaktive Shell wird in unserer Umgebung von der Bash-Shell verarbeitet.

Wir können die Befehle, die wir in die Umgebung gebracht haben, ausprobieren.

ls
ls /home/dave/Documents

Der Befehl ls funktioniert wie erwartet, wenn wir ihn in der Umgebung verwenden. Wenn wir versuchen, auf ein Verzeichnis außerhalb der Umgebung zuzugreifen, schlägt der Befehl fehl.

Wir können touch verwenden, um eine Datei zu erstellen, ls, um sie aufzulisten, und rm, um sie zu entfernen.

touch sample_file.txt
ls
rm sample_file.txt
ls

Natürlich können wir auch die integrierten Befehle der Bash-Shell verwenden. Wenn Sie in der Befehlszeile help eingeben, listet Bash sie für Sie auf.

help

Verwenden Sie exit, um die chroot-Umgebung zu verlassen:

exit

Wenn Sie die chroot-Umgebung entfernen möchten, können Sie sie einfach löschen:

rm -r testroot/

Dadurch werden die Dateien und Verzeichnisse in der chroot-Umgebung rekursiv gelöscht.

Komfortabel automatisieren

Wenn Sie der Meinung sind, dass Chroot-Umgebungen für Sie nützlich sein könnten, sie jedoch etwas fummelig einzurichten sind, denken Sie daran, dass Sie sich wiederholende Aufgaben jederzeit entlasten und riskieren können, indem Sie Aliase, Funktionen und Skripte verwenden.