Ubuntu chroot: Dateisystem-Isolation & Systemrettung

Einführung & Grundlagen

Das Unix-Werkzeug chroot erlaubt es Administratoren, das scheinbare Wurzelverzeichnis (/) für einen laufenden Prozess und dessen Kindprozesse dynamisch neu zu definieren. Dieser Leitfaden demonstriert den praxistauglichen Einsatz dieses Mechanismus: vom Aufsetzen schlanker Test-Sandboxes über die Rettung unbootbarer Linux-Installationen mittels Live-Medien bis hin zur gehärteten SFTP-Benutzerisolation.

Funktionsweise von chroot & Minimal-Jail mit BusyBox

Für eine leichtgewichtige Testumgebung ohne externe Abhängigkeiten empfiehlt sich BusyBox in seiner statisch gelinkten Variante. Das Paket lässt sich über den Paketmanager rasch einspielen:

BusyBox-Paket statisch unter Ubuntu installieren

Als Nächstes wird die Verzeichnisstruktur für das künftige Gefängnis angelegt; hierfür erstellen wir das Zielverzeichnis samt Unterordner für Binärdateien:

sudo mkdir -p /opt/mini-jail/bin

Zielverzeichnisstruktur für das Jail erstellen

Damit innerhalb der isolierten Zone grundlegende Shell-Befehle verfügbar sind, kopieren wir die statische BusyBox-Binärdatei an den vorgesehenen Speicherort:

sudo cp /bin/busybox /opt/mini-jail/bin/

Statische BusyBox-Binärdatei in das Jail-Verzeichnis kopieren

Sobald chroot aufgerufen wird, verlagert der Kernel den Bezugspunkt des Stammverzeichnisses für den gestarteten Prozess auf das angegebene Verzeichnis. Ein Zugriff auf übergeordnete Ebenen des Host-Systems ist standardmäßig blockiert.
Beim Start sieht der Befehl /opt/mini-jail als vollständiges Root-Dateisystem (/). Eine Verzeichnisabfrage belegt die wirksame Trennung vom Host.
⚙️ [Wichtige Parameter]

--userspec=USER:GROUP : Legt fest, unter welcher Benutzer- und Gruppenkennung der Befehl im Jail ausgeführt wird.
--groups=G_LIST : Definiert eine kommagetrennte Liste zusätzlicher Gruppenmitgliedschaften innerhalb der Sandbox.
--skip-chdir : Verhindert den automatischen Wechsel in das neue Stammverzeichnis und behält das aktuelle Arbeitsverzeichnis bei.

Ausführung von BusyBox innerhalb der chroot-Umgebung verifizieren

Autonome Bash-Umgebung inklusive dynamischer Shared Libraries

Sollen vollwertige Standard-Shells wie Bash genutzt werden, müssen alle benötigten Shared Libraries bereitgestellt werden. Zunächst erzeugen wir die hierfür erforderliche Ordnerhierarchie:

sudo mkdir -p /opt/bash-jail/{bin,lib,lib64}

Erforderliche Ordner für Binaries und Bibliotheken anlegen

Um interaktive Sitzungen sowie grundlegende Dateilistings zu ermöglichen, transferieren wir die entsprechenden Programme direkt in den isolierten Pfad:

sudo cp /bin/bash /bin/ls /opt/bash-jail/bin/

Kopieren von bash und ls in das isolierte Dateisystem

Da moderne Systemprogramme dynamisch gebunden sind, verlangt deren Start nach den passenden x86_64-Laufzeitbibliotheken. Wir spiegeln diesen Abhängigkeitsbaum in das Jail:

sudo cp -a /lib/x86_64-linux-gnu /opt/bash-jail/lib/

Kopieren der x86_64-Systembibliotheken ins Zielverzeichnis

Ebenso unentbehrlich ist der dynamische Linker (ld-linux-x86-64.so), welcher 64-Bit-Binärdateien erst zur Ausführung bringt. Dieser wird samt Basis-Links nach lib64 übertragen:

sudo cp -a /lib64/* /opt/bash-jail/lib64/

Einbinden des dynamischen Linkers in lib64

Über den Aufruf sudo chroot /opt/bash-jail /bin/bash -c "ls -la /" initiieren wir eine Bash-Instanz im neuen Wurzelverzeichnis und lassen den Inhalt von / auflisten.
Die Ausgabe beweist den Erfolg: Es sind ausschließlich die von uns bereitgestellten Pfade bin, lib sowie lib64 sichtbar. Das Programm agiert völlig abgekapselt und greift fehlerfrei auf die kopierten Shared Objects zu.

Erfolgreicher Start der gekapselten Bash-Instanz

Havarie-Wiederherstellung: Bind-Mounts virtueller Dateisysteme

Im Falle eines beschädigten Bootloaders oder fehlerhafter Kernel-Updates dient chroot als wichtigstes Reparaturwerkzeug von einem Live-System aus. Zuerst legen wir einen Einhängepunkt für die zu rettende Partition an:

sudo mkdir -p /mnt/sysroot

Mountpoint zur Systemwiederherstellung bereitstellen

Das zu reparierende Root-Dateisystem wird nun am vorbereiteten Mountpoint eingehängt (hier beispielhaft via Bind-Mount demonstriert):

sudo mount --bind / /mnt/sysroot

Wurzelverzeichnis an den Wiederherstellungspfad binden

Damit Werkzeuge wie grub-install oder Festplatten-Dienstprogramme direkten Zugriff auf Hardware-Geräteknoten haben, binden wir den Gerätedirektbaum /dev ein:

sudo mount --bind /dev /mnt/sysroot/dev

Gerätedateien /dev in die Rettungsumgebung einbinden

Zahlreiche Wartungsroutinen und Paketmanager setzen Prozess- und Systemstatusinformationen voraus; daher spiegeln wir das virtuelle Dateisystem /proc:

sudo mount --bind /proc /mnt/sysroot/proc

Virtuelles Dateisystem /proc bereitstellen

Um auch Treiberstrukturen, Hardware-Hierarchien und ACPI-Daten in die Chroot-Sitzung weiterzureichen, binden wir zusätzlich /sys ein:

sudo mount --bind /sys /mnt/sysroot/sys

Hardware-Schnittstelle /sys bind-mounten

Mit dem Befehl sudo chroot /mnt/sysroot /bin/bash -c "uname -a && df -h /" betreten wir die vollständig vorbereitete Umgebung, um Kernel-Parameter und Speichernutzung abzufragen.
Das System nutzt den Host-Kernel, betrachtet jedoch die eingehängte Festplatte als tatsächliche Systemwurzel. In diesem Zustand können Bootloader neu geschrieben, Kernel-Images gebaut oder defekte Pakete repariert werden.

Systemstatus und Root-Belegung im Rettungsmodus abfragen

Nach Abschluss der Reparaturen ist ein sauberes Aushängen unerlässlich, um Datenverlust zu vermeiden. Dies geschieht in strikt umgekehrter Reihenfolge von den Pseudo-Dateisystemen bis zur eigentlichen Wurzel:

sudo umount /mnt/sysroot/sys /mnt/sysroot/proc /mnt/sysroot/dev /mnt/sysroot

Sicheres Unmounten der virtuellen Verzeichnisse in umgekehrter Reihenfolge

Absicherung von SFTP-Zugängen mittels restriktiver Chroot-Pfade

Zur Bereitstellung eines geschützten Dateiübertragungszugangs unterbinden wir interaktive SSH-Logins komplett. Der dedizierte Benutzer wird mit /bin/false als Anmeldeshell angelegt:

sudo id -u jailuser &>/dev/null || sudo useradd -m -d /home/jailuser -s /bin/false jailuser

Dedizierten SFTP-Benutzer mit gesperrter Shell anlegen

Da Benutzer in einem Root-Besitz befindlichen Chroot-Verzeichnis selbst keine Schreibrechte besitzen dürfen, wird ein dedizierter Unterordner für Datentransfers eingerichtet:

sudo mkdir -p /home/jailuser/uploads

Upload-Ordner für Datentransfers einrichten

OpenSSH erzwingt strikte Sicherheitsvorgaben zur Abwehr von Jailbreaks: Das Chroot-Basisverzeichnis muss zwingend root gehören und darf für Gruppen oder Andere keinesfalls schreibbar sein:

sudo chown root:root /home/jailuser && sudo chmod 755 /home/jailuser

Strikte Root-Rechte und 755 auf dem Chroot-Basispfad vergeben

Erst im untergeordneten Transferordner erhält der SFTP-Nutzer vollständige Schreib- und Leserechte, indem der Besitz übertragen wird:

sudo chown jailuser:jailuser /home/jailuser/uploads

Benutzerrechte auf den Unterordner uploads übertragen

Eine Überprüfung der Berechtigungsstruktur erfolgt über ls -ld /home/jailuser /home/jailuser/uploads.
Die Ausgabe bestätigt die korrekte Trennung: Der übergeordnete Ordner verbleibt unter root:root mit drwxr-xr-x, während uploads dem Benutzer jailuser:jailuser zugewiesen ist – genau so, wie es die SSH-Spezifikation für ein ausbruchssicheres Jail verlangt.

Berechtigungen und Besitzer der Verzeichnisse überprüfen

Mit diesen Techniken steht Ihnen ein wirkungsvolles Bordmittel zur Verfügung, um Dateisysteme auf Ubuntu-Systemen gezielt einzugrenzen oder schwerwiegende Bootfehler kontrolliert zu beheben. Ob zur forensischen Analyse, für saubere Testläufe oder die administrative Notfallwartung: Das Beherrschen von chroot gehört zum soliden Repertoire jedes Linux-Systemadministrators.