Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING

22.6 Absicherung von Servern mit chroot()

chroot() ist eine Funktion von UNIX, die im Falle eines erfolgreichen Buffer Overflows dafür sorgt, daß der Zugriff nur auf ein Unterverzeichnis der Festplatte erfolgen kann. Ein Angreifer, der also mit den Rechten des Dämons versucht, auf das Verzeichnis /etc/ zuzugreifen, der wird unweigerlich scheitern. Hierzu bietet der LINUX Firewallkernel verschiedene Sicherheitslevel (security level) an, die sich allerdings in der Version 2.0 noch stark von den mächtigen Security Leveln von Free/Net/OpenBSD/Trusted Solaris unterscheiden. Erst mit der LINUX Kernelversion 2.2 wurden diese Mechanismen nachgebildet, leider reichen diese aber nicht an die der BSD UNIXe heran, weil hierzu neue Flags bei den Dateirechten hinzugefügt werden müßten (Stichwort append-only flag).

Es ist z.B. somit einem gewöhnlichen User nicht mehr möglich, überhaupt Supervisor zu werden, oder einem Administrator nicht möglich, Logdateien einzusehen oder zu verändern. Man sieht, die sogenannten Trusted Kernel von Solaris oder den freien BSD-UNIXen haben durchaus ihren Sinn. Wer nun überlegt, ob er Trusted Solaris oder Open/Net/FreeBSD einsetzen soll, der ist mit FreeBSD 3.1 oder Open/NetBSD besser beraten. Inzwischen sind alle BSD und Solaris Systeme auf Intel-Basis auch zu LINUX binär kompatibel.

Zurück zu der chroot() Funktion. Einige Dämonen führen automatisch ein CHROOT() aus, indem sie chroot() ausführen, eine Kopie von sich selber in der chroot() Umgebung starten, und dann den Ursprungsprozeß beenden. Zu diesen gehört z.B. der CERN-HTTPD, der APACHE-Server und dessen Clone, der Netscape Enterprise Server, und der BSD FTP-Dämon.

Wer sich nicht sicher ist, ob sein Dienst oder Dämon automatisch chroot() ausführt, genügt ein Blick in den Quellcode oder die Dokumentation. Falls der Dämon nicht selber diese Funktion unterstützt, dann kann man aus der BASH - Shell heraus ein kleines Programm starten, welches ein chroot() ausführt und dann erst den Dämon startet (system()). Dieser läuft dann in der chroot() Umgebung, welche von dem kleinen Shellprogramm vorgegeben wurde. So ist es möglich, unter allen UNIX´en Programme sicher zu betreiben, von denen nicht bekannt ist, ob diese chroot() ausführen. Man kann auch chroot() in einer chroot() Umgebung ausführen, also von dieser Seite her keine Unwägbarkeiten.Warum unter Standard LINUX nicht generell alles in einer chroot() Umgebung läuft ? Das ist einfach zu beantworten: Viele Dämonen, wie z.B. POP3 oder IMAP4 benötigen Zugriff auf die Dateien /etc/passwd oder /etc/shadow, um das Paßwort zu überprüfen. Nach dem Wechsel in eine chroot() Umgebung, z.B. in /home/userxy/chroot/ verlangt dann der POP3 Dämon den Zugriff auf eine Paßwortdatei, die also dann im Verzeichnis /etc/userxy/chroot/etc/ liegen muß. Man muß also die Paßwortdatei aus /etc/ in dieses Verzeichnis kopieren, damit der Dämon korrekt arbeiten kann. Dasselbe betrifft auch die Logdateien des Dämons. Diese müßten dann in dem Verzeichnis /home/userxy/var/log/ zu finden sein. Falls der Dämon mit dynamischen Bibliotheken (shared libraries) kompiliert wurde (was viel RAM sparen kann), so muß er auch auf die entsprechenden Libraries in den Verzeichnissen /home/userxy/lib/ oder /home/userxy/chroot/usr/lib/ Zugriff haben. Das bedeutet, daß man den Dämon entweder mit der Option -static in der Datei Makefile neu kompiliert, und dann in der chroot() Umgebung startet, oder man alle Libraries in die chroot() Umgebung kopieren muß. Aber keine Panik, ein einfaches Kopieren mit dem Befehl cp -p -r reicht aus, damit die Dateirechte auch original mit übertragen werden.

Die Firma SUN hat seit einiger Zeit fast alle wichtigen Dämonen statisch kompiliert und mit einer chroot() Funktion ausgestattet. In sofern ist SUN allen anderen UNIXen, zumindest LINUX jedenfalls, weit voraus. Programme von Fremdherstellern jedenfalls sind noch nicht so weit. Das bedeutet, daß auch beim Einsatz von Trusted Solaris dieselben Probleme auftreten, wie mit LINUX. Man kommt um eine Überprüfung der UNIX Dämonen bei keinem UNIX herum. Mit dem Kernel 2.2 hat sich LINUX aber sehr an BSD-UNIX angepaßt. Es lassen sich alle BSD-UNIX Dämonen von Open/Net/FreeBSD ganz einfach auf LINUX portieren. Angesichts der hohen Qualitat der BSD Dämonen sollte man als Systemadministrator im Bedarfsfall auf diese Dämomen zurückgreifen. Das chroot() Skript findet sich überall im Internet oder auf dem Server des DFN-CERT, der wirklich eine viel unterschätzte Resource ist...

Windows NT 4.0 im Übrigen unterstützt im Prinzip aufgrund seiner POSIX - Kompatibilität auch chroot(). Wenn Windows NT in der Version 6.0 dann irgendwann einmal alle Funktionen von UNIX beherrscht, und ein echtes Multiuser/Multitasking Betriebssystem sein wird, dann wird das Thema dort sicher top aktuell werden.


Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING