[[Vorlage(Archiviert)]] ## [[Vorlage(Getestet)]] [[Inhaltsverzeichnis(2)]] = 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 [:VIM: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 [:Archiv/chroot/script: Skript] und sowie auch [#Automatische-Skripte 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 {{{#!vorlage Befehl 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 = {{{#!vorlage Hinweis Die Shellbefehle sind als [:sudo: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 [:Archiv/chroot/chrlogin:chrlogin] von [http://www.weidner.ch/download.html Harald Weidner] {en} . 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: {{{#!vorlage Befehl #define CHROOT_LEVEL 3 }}} Das Warum ist im Fileheader gut verständlich beschrieben. Kompiliert wird das ganze dann mit dem Befehl {{{#!vorlage 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: {{{#!vorlage Befehl cp chrlogin /usr/local/bin/ }}} Dateiberechtigungen werden ebenfalls noch angepasst: {{{#!vorlage Befehl chown root:root /usr/local/bin/chrlogin chmod 4755 /usr/local/bin/chrlogin }}} == Grundstruktur == Nun geht es an den weiteren Bau der Umgebung: {{{#!vorlage Befehl 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ß: {{{#!vorlage Befehl 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''': {{{#!vorlage Befehl ldd /bin/bash }}} __'''Achtung'''__: ldd erwartet einen vollständigen Pfad! Ergebnis der Nachfrage: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 == {{{#!vorlage Befehl 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 == {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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__: {{{#!vorlage Befehl testuser:x:1003:1005::/home/chroot/testuser/home/testuser:/usr/local/bin/chrlogin }}} Richtig: {{{#!vorlage Befehl testuser:x:1003:1005::/home/testuser:/bin/bash }}} Die Gruppe muss auch da sein: {{{#!vorlage Befehl grep testuser /etc/group >> /home/chroot/testuser/etc/group }}} == Devices und Fertigstellung == Nun fehlen noch null und zero device: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl wget http://projects.fakeroot.at/autochroot/autochroot -O /usr/sbin/autochroot chmod +x /usr/sbin/autochroot autochroot }}} oder in einer Zeile: {{{#!vorlage Befehl wget http://projects.fakeroot.at/autochroot/autochroot -O /usr/sbin/autochroot && chmod +x /usr/sbin/autochroot && autochroot }}} ---- # tag: Shell, Sicherheit