Mittwoch, 4. Oktober 2006
Chroot-Umgebung für Apache
Eine Anleitung zum Absichern von Apache in einer Chroot-Umgebung für die Linux Distribution Debian.
Hinweis
Diese Anleitung ist aus dem Debianhandbuch übernommen worden. Das Orginaldokument wurde Alexandre Ratti erstellt.
Anleitung zum Absichern von Debian
Anhang H - Chroot-Umgebung für Apache
H.1 Einleitung
Das Programm chroot wird häufig dazu benutzt, einen Daemon in
einen beschränkten Verzeichnisbaum einzusperren. Sie können es dazu verwenden,
um Dienste von anderen abzuschirmen, so dass Sicherheitsprobleme mit einem
Softwarepaket den ganzen Server gefährden können. Durch die Verwendung des
Skripts makejail wird es viel leichter, einen Verzeichnisbaum in
einer chroot-Umgebung einzurichten und zu aktualisieren.
FIXME: Apache can also be chrooted using http://www.modsecurity.org which
is available in libapache-mod-security (for Apache 1.x) and
libapache2-mod-security (for Apache 2.x).
H.1.1 Lizenz
Dieses Dokument ist urheberrechtlich von Alexandre Ratti (2002) geschützt. Es
steht unter einer doppelten Lizenz, nämlich der GPL Version 2 (GNU General
Public License) und der GNU-FDL 1.2 (GNU Free Documentation Licence). Es wurde
in dieses Handbuch mit seiner ausdrücklichen Genehmigung aufgenommen. (Siehe
auch das Originaldokument)
H.2 Installation des Servers
Diese Vorgehensweise wurde auf Debian GNU/Linux 3.0 (Woody) mit
makejail 0.0.4-1 (in Debian/testing) getestet.
-
Melden Sie sich als
Rootan und erstellen Sie ein neues Verzeichnis für das Gefängnis:$ mkdir -p /var/chroot/apache
-
Erstellen Sie einen neuen Nutzer und eine neue Gruppe. Der Apache in der
chroot-Umgebung wird als dieser Nutzer und Gruppe laufen, die für nichts anderes auf dem System verwendet wird. In dem Beispiel heißen sowohl Nutzer als auch Gruppechrapach.$ adduser --home /var/chroot/apache --shell /bin/false \ --no-create-home --system --group chrapachFIXME: is a new user needed? (Apache already runs as the apache user)
-
Installieren Sie ganz normal Apache auf Debian: apt-get install apache
-
Richten Sie Apache ein (z.B. definieren Sie Ihrer Subdomains usw.). Weisen Sie in der Konfigurationsdatei
/etc/apache/httpd.confden Optionen Group und User chrapach zu. Starten Sie Apache neu und stellen Sie sicher, dass der Server korrekt funktioniert. Danach halten Sie den Server wieder an.
-
Installieren Sie
makejail(ist fürs Erste in Debian/testing vorhanden). Sie sollten auchwgetundlynxinstallieren, da sie benutzt vonmakejailwerden, um den Server in derchroot-Umgebung zu testen: apt-get install makejail wget lynx.
-
Kopieren Sie die Beispielkonfigurationsdatei für Apache ins Verzeichnis
/etc/makejail:# cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
-
Bearbeiten Sie
/etc/makejail/apache.py. Sie müssen die Optionen chroot, users und groups verändern. Um diese Version vonmakejaillaufen zu lassen, können Sie auch die Optionpackageshinzufügen. Vergleichen Sie dieMakejail-DoKumentation. Die Konfigurationsdatei könnte beispielsweise so aussehen:chroot="/var/chroot/apache" testCommandsInsideJail=["/usr/sbin/apachectl start"] processNames=["apache"] testCommandsOutsideJail=["wget -r --spider http://localhost/", "lynx --source https://localhost/"] preserve=["/var/www", "/var/log/apache", "/dev/log"] users=["chrapach"] groups=["chrapach"] packages=["apache", "apache-common"] userFiles=["/etc/password", "/etc/shadow"] groupFiles=["/etc/group", "/etc/gshadow"] forceCopy=["/etc/hosts", "/etc/mime.types"]FIXME: some options do not seem to work properly. For instance,
/etc/shadowand/etc/gshadoware not copied, whereas/etc/passwordand/etc/groupare fully copied instead of being filtered.
-
Erstellen Sie den Verzeichnisbaum für chroot: makejail /etc/makejail/apache.py.
-
Falls
/etc/passwordund/etc/groupvollständig kopiert wurden, geben Sie Folgendes ein, um sie mit gefilterten Fassungen zu ersetzen:$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd $ grep chrapach /etc/group > /var/chroot/apache/etc/group
-
Kopieren Sie die Webseiten und die Logs ins Gefängnis. Diese Dateien werden nicht automatisch mitkopiert (sehen Sie sich dazu die Option preserve in der Konfigurationsdatei von
makejailan).# cp -Rp /var/www /var/chroot/apache/var # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
-
Editieren Sie das Startskript für den Logging-Daemon des Systems so, dass er auch den Socket
/var/chroot/apache/dev/logbeobachtet. Ersetzen Sie in/etc/init.d/sysklogdSYSLOGD="" mit SYSLOGD=" -a /var/chroot/apache/dev/log" und starten Sie den Daemon neu (/etc/init.d/sysklogd restart).
-
Editieren Sie das Startskript von Apache (
/etc/init.d/apache). Sie müssen vielleicht ein paar Änderung am Standardstartskript vornehmen, damit des richtig in einem Verzeichnisbaum in einerchroot-Umgebung läuft. Da wäre:-
Legen Sie die Variable CHRDIR am Anfang der Datei neu fest.
-
Bearbeiten Sie die Abschnitte start, stop, reload etc.
-
Fügen Sie eine Zeile hinzu, um das
/proc-Dateisystem innerhalb des Gefängnisses zu mounten und abzumounten.
#! /bin/bash # # apache Start the apache HTTP server. # CHRDIR=/var/chroot/apache NAME=apache PATH=/bin:/usr/bin:/sbin:/usr/sbin DAEMON=/usr/sbin/apache SUEXEC=/usr/lib/apache/suexec PIDFILE=/var/run/$NAME.pid CONF=/etc/apache/httpd.conf APACHECTL=/usr/sbin/apachectl trap "" 1 export LANG=C export PATH test -f $DAEMON || exit 0 test -f $APACHECTL || exit 0 # ensure we don't leak environment vars into apachectl APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL" if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF then exit 0 fi case "$1" in start) echo -n "Starting web server: $NAME" mount -t proc proc /var/chroot/apache/proc start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \ --chroot $CHRDIR ;; stop) echo -n "Stopping web server: $NAME" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo umount /var/chroot/apache/proc ;; reload) echo -n "Reloading $NAME configuration" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \ --signal USR1 --startas $DAEMON --chroot $CHRDIR ;; reload-modules) echo -n "Reloading $NAME modules" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \ --retry 30 start-stop-daemon --start --pidfile $PIDFILE \ --exec $DAEMON --chroot $CHRDIR ;; restart) $0 reload-modules exit $? ;; force-reload) $0 reload-modules exit $? ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}" exit 1 ;; esac if [ $? == 0 ]; then echo . exit 0 else echo failed exit 1 fiFIXME: should the first Apache process be run as another user than root (i.e. add --chuid chrapach:chrapach)? Cons: chrapach will need write access to the logs, which is awkward.
-
-
Ersetzen Sie in
/etc/logrotate.d/apache/var/log/apache/*.log durch /var/chroot/apache/var/log/apache/*.log.
-
Starten Sie Apache (
/etc/init.d/apache start) und überprüfen Sie, was im Protokoll des Gefängnisses gemeldet wird (/var/chroot/apache/var/log/apache/error.log). Wenn Ihre Einstellung komplexer sein sollte (z.B. wenn Sie auch PHP und MySQL einsetzen), werden wahrscheinlich Dateien fehlen. Wenn einige Dateien nicht automatisch vonmakejailkopiert werden, können Sie diese in den Optionen forceCopy (um Dateien direkt zu kopieren) oder packages (um ganze Pakete mit ihren Abhängigkeiten zu kopieren) in der Konfigurationsdatei/etc/makejail/apache.pyaufführen.
-
Geben Sie ps aux | grep apache ein, um sicherzustellen, dass Apache läuft. Sie sollten etwas in dieser Art sehen:
root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
-
Stellen Sie sicher, dass die Apache-Prozesse in einer
chroot-Umgebung laufen. Betrachten Sie dazu das/proc-Dateisystem: ls -la /proc/process_number/root/., wobei process_number einer der PID-Nummern ist, die oben aufgeführt wurden (z.B. 189 in der zweiten Reihe). Die Einträge des eingeschränkten Verzeichnisbaums sollten Sie sich auflisten lassen:drwxr-sr-x 10 root staff 240 Dec 2 16:06 . drwxrwsr-x 4 root staff 72 Dec 2 08:07 .. drwxr-xr-x 2 root root 144 Dec 2 16:05 bin drwxr-xr-x 2 root root 120 Dec 3 04:03 dev drwxr-xr-x 5 root root 408 Dec 3 04:03 etc drwxr-xr-x 2 root root 800 Dec 2 16:06 lib dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin drwxr-xr-x 6 root root 144 Dec 2 16:04 usr drwxr-xr-x 7 root root 168 Dec 2 16:06 varUm diesen Test zu automatisieren, geben Sie ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/. ein.
FIXME: Add other tests that can be run to make sure the jail is closed?
Ich mag das, da es so nicht sehr schwierig ist, das Gefängnis einzurichten, und der Server mit nur zwei Zeilen aktualisiert werden kann:
apt-get update && apt-get install apache
makejail /etc/makejail/apache.py
H.3 Weiterführende Informationen
Wenn Sie nach weiteren Informationen suchen, sehen Sie sich die Quellen an, auf denen diese Anleitung beruht:
-
Die
Makejail-Homepage. Diese Programm wurde von Alain Tesio geschrieben.
-
Das
Chrooting daemons and system processes HOWTOvon Jonathan, Network Dweebs, 21.10.2002.
Noch keine Kommentare
