ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

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 

Diese Revision wurde am 12. August 2018 00:29 von Beforge erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Shell, Sicherheit