chroot-jail
Archivierte Anleitung
Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.
Voraussetzungen¶
In diesem HowTo wird davon ausgegangen, dass es sich um einen Server handelt, dementsprechend werden alle Änderungen an Dateien und Verzeichnissen mit Kommandozeilenprogrammen vorgenommen. So erklärt sich auch die Auswahl der Programme, die schlussendlich im chroot() jail zur Verfügung stehen. Beispielsweise ist der Editor vi/vim verfügbar auf eigentlich jedem *NIX System. Für bequeme Navigation im Verzeichnisbaum steht der Midnight Commander zur Verfügung. Man sollte folgendes für dieses HowTo mitbringen:
Erfahrung auf der Kommandozeile
Grundsätzliches Verständnis von Dateiberechtigungen und dem Verzeichnisaufbau unter *NIX
Zeit und Geduld
Die Anleitung auf dieser Seite soll dabei helfen, das Prinzip des chroots zu verstehen. Alternativ kann man das Ganze natürlich komfortabel per Skript und sowie auch unten beschrieben erledigen.
Was ist ein chroot() jail?¶
chroot ist ein Programm, welches den Benutzer in eine andere Umgebung wechseln lässt, er definiert ein anderes Verzeichnis als bisher zu /. Beispiel:
/ bin/ boot/ dev/ etc/ home/ lib/ opt/ proc/ root/ sbin/ sys/ tmp/ usr/ var/
So sieht ein üblicher Verzeichnisbaum aus, / ist in diesem Falle die oberste Ebene. Nun zum interessanten Teil.
/ home/ chroot/ bin/ boot/ dev/ etc/ home/ lib/ opt/ proc/ root/ sbin/ sys/ tmp/ usr/ var/
Im Verzeichnis /home/chroot existiert dieser Verzeichnisbaum nochmal. Wenn man nun die grundsätzlich benötigten Programme und Bibliotheken in die entsprechenden Verzeichnisse kopiert, kann man per
chroot /home/chroot /bin/bash
in diese Umgebung wechseln. Hat man das getan, sieht man zuerst keinen Unterschied, ls /
gibt nichts anderes aus als vorher auch schon. Bemerkbar macht sich das Ganze erst, wenn man feststellt, "was plötzlich nicht mehr geht". Kleines Beispiel: man hat per chroot die neue Umgebung betreten und möchte sich mit dem Midnight Commander etwas umsehen. Das Programm lässt sich jedoch nicht aufrufen, es erscheint nur eine Fehlermeldung. Aber man hat das Ding doch installiert... Nun, das mag schon sein, aber man befindet sich ja im chroot-jail.
/ |- bin/ |- boot/ |- dev/ |- etc/ |- home/ | \_chroot/ | |- bin/ | |- boot/ | |- dev/ | |- etc/ | |- home/ | |- lib/ | |- opt/ | |- proc/ | |- root/ | |- sbin/ | |- sys/ | |- tmp/ | |- usr/ | \ var/ |- lib/ |- opt/ |- proc/ |- root/ |- sbin/ |- sys/ |- tmp/ |- usr/ \_var/
Der User im chroot jail sieht das Verzeichnis /home/chroot als /, dort hört für ihn das sichtbare Filesystem auf. Und genau an dieser Stelle wird es sicherheitstechnisch interessant. Durch dieses Verhalten kann man diesem User genaueste Vorgaben machen, welche Möglichkeiten er überhaupt vorfindet. Hat er keinen "gcc", keine Entwicklungsbibliotheken und kein "wget" in seiner Umgebung, kann er sie auch nicht benutzen.
Was bedeutet das auf einem Server?¶
Durch die Tatsache, dass ein in einem chroot() jail eingesperrter User nur das benutzen kann, was in diesem angelegt ist, erhöht sich der Sicherheitsaspekt enorm. Ein chroot() jail benötigt nichtmal einen rootuser, Befehle wie sudo
oder su
werden nicht hineinkopiert. Es gibt also de facto keinen Root-Account, den man knacken kann. Und ohne wget
wird es schwierig, Rootkits o.ä. aus dem Netz nachzuladen.
Der Nachteil an dieser Geschichte ist, dass man einiges an administrativem Aufwand in Kauf nehmen muss.
Einrichten eines chroot() jails¶
Hinweis:
Die Shellbefehle sind als sudo und root auszuführen.
chrlogin¶
Normalerweise bekommt man einen Login, der einem eine gültige Shell zur Verfügung stellt. Im Falle eines chroot() Jails soll der User aber sofort eingesperrt werden. Hierfür verwendet man das Programm chrlogin von Harald Weidner 🇬🇧 . Einfach den Inhalt in eine Datei mit Namen chrlogin.c kopieren, anpassen und speichern. Wichtig ist die Verzeichnistiefe, im hier vorgestellten Beispiel wird das chroot() jail im Verzeichnis /home/chroot/testuser erstellt, im File müsste man in Zeile 45 folgendes eintragen:
#define CHROOT_LEVEL 3
Das Warum ist im Fileheader gut verständlich beschrieben. Kompiliert wird das ganze dann mit dem Befehl
gcc -Wall -O2 -s chrlogin.c -o chrlogin
Damit das Programm beim Aufruf ohne vollständigen Pfad gefunden wird, sollte man es in ein entsprechendes Verzeichnis kopieren:
cp chrlogin /usr/local/bin/
Dateiberechtigungen werden ebenfalls noch angepasst:
chown root:root /usr/local/bin/chrlogin chmod 4755 /usr/local/bin/chrlogin
Grundstruktur¶
Nun geht es an den weiteren Bau der Umgebung:
mkdir -p /home/chroot/testuser cd /home/chroot/testuser mkdir bin dev etc home lib usr var tmp mkdir usr/bin var/tmp chmod 1777 tmp
Jetzt kommen endlich die Programme, ein User ohne Shell ist nur der halbe Spaß:
cp /bin/bash /home/chroot/testuser/bin/
Diesem netten Programm fehlen allerdings ein Haufen Bibliotheken, um wirklich funktionieren zu können. Welche sagt einem das Programm ldd:
ldd /bin/bash
Achtung: ldd erwartet einen vollständigen Pfad! Ergebnis der Nachfrage:
libncurses.so.5 => /lib/libncurses.so.5 (0xb7f9f000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7f9c000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e6f000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7feb000)
Diese Bibliotheken müssen ebenfalls in die neue Umgebung kopiert werden:
cp /lib/libncurses.so.5 /home/chroot/testuser/lib/ mkdir -p /home/chroot/testuser/lib/tls/i686/cmov cp /lib/tls/i686/cmov/libdl.so.2 /home/chroot/testuser/lib/tls/i686/cmov/ cp /lib/tls/i686/cmov/libc.so.6 /home/chroot/testuser/lib/tls/i686/cmov/ cp /lib/ld-linux.so.2 /home/chroot/testuser/lib/
Bibliotheken¶
cp /lib/libacl.so.1 /home/chroot/testuser/lib/ cp /lib/libattr.so.1 /home/chroot/testuser/lib/ cp /lib/libcom_err.so.2 /home/chroot/testuser/lib/ cp /lib/libext2fs.so.2 /home/chroot/testuser/lib/ cp /lib/libnsl.so.1 /home/chroot/testuser/lib/ cp /lib/libnss_compat.so.2 /home/chroot/testuser/lib/ cp /lib/libutil.so.1 /home/chroot/testuser/lib/ cp /lib/tls/libcrypt.so.1 /home/chroot/testuser/lib/tls/ cp /lib/tls/libnsl.so.1 /home/chroot/testuser/lib/tls/ cp /lib/tls/libpthread.so.0 /home/chroot/testuser/lib/tls/ cp /lib/tls/libresolv.so.2 /home/chroot/testuser/lib/tls/ cp /lib/tls/librt.so.1 /home/chroot/testuser/lib/tls/ cp /lib/tls/libutil.so.1 /home/chroot/testuser/lib/tls/ cp /usr/lib/libcrypto.so.0.9.7 /home/chroot/testuser/usr/lib/ cp /usr/lib/libglib-2.0.so.0 /home/chroot/testuser/usr/lib/ cp /usr/lib/libgmodule-2.0.so.0 /home/chroot/testuser/usr/lib/ cp /usr/lib/libgpm.so.1 /home/chroot/testuser/usr/lib/ cp /usr/lib/libz.so.1 /home/chroot/testuser/usr/lib/ cp /usr/lib/i686/cmov/libcrypto.so.0.9.7 /home/chroot/testuser/usr/lib/i386/cmov/
Binaries¶
cp /bin/cat /home/chroot/testuser/bin/ cp /bin/chmod /home/chroot/testuser/bin/ cp /bin/chown /home/chroot/testuser/bin/ cp /bin/cp /home/chroot/testuser/bin/ cp /bin/ln /home/chroot/testuser/bin/ cp /bin/ls /home/chroot/testuser/bin/ cp /bin/mkdir /home/chroot/testuser/bin/ cp /bin/more /home/chroot/testuser/bin/ cp /bin/mv /home/chroot/testuser/bin/ cp /bin/rm /home/chroot/testuser/bin/ cp /bin/rmdir /home/chroot/testuser/bin/ cp /bin/sh /home/chroot/testuser/bin/ cp /bin/touch /home/chroot/testuser/bin/ cp /usr/bin/dircolors /home/chroot/testuser/usr/bin/ cp /usr/bin/groups /home/chroot/testuser/usr/bin/ cp /usr/bin/id /home/chroot/testuser/usr/bin/ cp /usr/bin/less /home/chroot/testuser/usr/bin/ cp /usr/bin/mc /home/chroot/testuser/usr/bin/ cp /usr/bin/mcedit /home/chroot/testuser/usr/bin/ cp /usr/bin/vi /home/chroot/testuser/usr/bin/ cp /usr/bin/vim /home/chroot/testuser/usr/bin/
User und Gruppe¶
Der neue User wird angelegt:
groupadd testuser useradd -g testuser -d /home/chroot/testuser/home/testuser -m -s /usr/local/bin/chrlogin -p testpasswort testuser
Guter Befehl... Und das tut er: Der neue User ist Mitglied der Gruppe testuser. Sein homedir ist /home/chroot/testuser/home/testuser, es wird automatisch angelegt. Als Shell bekommt er /usr/local/bin/chrlogin, diese Einstellung sorgt dafür, dass er beim Login sofort eingesperrt wird. Passwort ist "testpasswort", Loginname "testuser".
Desweiteren muss nun die Berechtigung des tmp-Verzeichnisses geändert werden, Programme wie z.B. vi erfordern hier Schreibrechte:
chown testuser:testuser /home/chroot/testuser/tmp chown testuser:testuser /home/chroot/testuser/var/tmp
Außerdem weiß unser chroot() jail noch nichts vom neuen User, dieser muss in der Datei /etc/passwd eingetragen sein:
grep testuser /etc/passwd >> /home/chroot/testuser/etc/passwd
Achtung: der Eintrag stimmt so nicht! Alle Pfadangaben beziehen sich auf die Umgebung ÜBER dem chroot() jail. Der Vergleich macht es sofort klar. Falsch:
testuser:x:1003:1005::/home/chroot/testuser/home/testuser:/usr/local/bin/chrlogin
Richtig:
testuser:x:1003:1005::/home/testuser:/bin/bash
Die Gruppe muss auch da sein:
grep testuser /etc/group >> /home/chroot/testuser/etc/group
Devices und Fertigstellung¶
Nun fehlen noch null und zero device:
mknod /home/chroot/testuser/dev/null c 1 3 chmod 666 /home/chroot/testuser/dev/null mknod /home/chroot/testuser/dev/zero c 1 5 chmod 666 /home/chroot/testuser/dev/zero
Nun endlich kann man die neue Umgebung betreten:
su testuser
Dem User stehen alle Befehle zur Verfügung, die in das jail kopiert wurden. Er kann seine Umgebung nicht verlassen.
Automatische Skripte¶
Mittlerweile gibt es Shell-Skripte, mit denen man einfach und schnell eine komplette Chroot-Umgebung aufbauen kann. Wenn man die Sitzung dann mit exit verlässt werden automatisch alle Aufräumarbeiten vom Skript erledigt. Somit bleibt auf beiden Systemen alles in einem davon unberührten Zustand.
Autochroot¶
Ein sehr gutes Beispiel hierfür ist das autochroot-Skript von Manuel Reithuber (siehe http://fakeroot.at/de/projects/autochroot). Dabei sucht das Skript selbständig nach Linux Partitionen und bietet diese für ein chroot an. Zum herunterladen und installieren tippt man die folgenden Befehle im Terminal aus (sudo erforderlich):
entweder
wget http://projects.fakeroot.at/autochroot/autochroot -O /usr/sbin/autochroot chmod +x /usr/sbin/autochroot autochroot
oder in einer Zeile:
wget http://projects.fakeroot.at/autochroot/autochroot -O /usr/sbin/autochroot && chmod +x /usr/sbin/autochroot && autochroot