Chroot
-Umgebung für Apache
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).
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
)
Diese Vorgehensweise wurde auf Debian GNU/Linux 3.0 (Woody) mit
makejail
0.0.4-1 (in Debian/testing) getestet.
Root
an und erstellen Sie ein neues
Verzeichnis für das Gefängnis:
$ mkdir -p /var/chroot/apache
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 Gruppe chrapach
.
$ adduser --home /var/chroot/apache --shell /bin/false \ --no-create-home --system --group chrapach
FIXME: is a new user needed? (Apache already runs as the apache user)
/etc/apache/httpd.conf
den 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.
makejail
(ist fürs Erste in Debian/testing
vorhanden). Sie sollten auch wget
und lynx
installieren, da sie benutzt von makejail
werden, um den Server in
der chroot
-Umgebung zu testen: apt-get install makejail wget
lynx.
/etc/makejail
:
# cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
/etc/makejail/apache.py
. Sie müssen die Optionen
chroot, users und groups verändern. Um diese
Version von makejail
laufen zu lassen, können Sie auch die Option
packages
hinzufügen. Vergleichen Sie die Makejail-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/shadow
and /etc/gshadow
are not copied, whereas
/etc/password
and /etc/group
are fully copied instead
of being filtered.
/etc/password
und /etc/group
vollstä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
makejail
an).
# cp -Rp /var/www /var/chroot/apache/var # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
/var/chroot/apache/dev/log
beobachtet. Ersetzen
Sie in /etc/init.d/sysklogd
SYSLOGD="" mit
SYSLOGD=" -a /var/chroot/apache/dev/log" und starten Sie
den Daemon neu (/etc/init.d/sysklogd restart).
/etc/init.d/apache
).
Sie müssen vielleicht ein paar Änderung am Standardstartskript vornehmen, damit
des richtig in einem Verzeichnisbaum in einer chroot
-Umgebung
läuft. Da wäre:
/proc
-Dateisystem innerhalb des
Gefängnisses zu mounten und unmounten.
#! /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 fi
FIXME: 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.
/etc/logrotate.d/apache
/var/log/apache/*.log durch
/var/chroot/apache/var/log/apache/*.log.
/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 von makejail
kopiert 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.py
aufführen.
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
chroot
-Umgebung laufen. Betrachten Sie dazu das
/proc
-Dateisystem: ls -la
/proc/process_number/root/., wobei process 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 var
Um 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
Wenn Sie nach weiteren Informationen suchen, sehen Sie sich die Quellen an, auf denen diese Anleitung beruht:
Makejail-Homepage
.
Diese Programm wurde von Alain Tesio geschrieben.
Chrooting
daemons and system processes HOWTO
von Jonathan, Network Dweebs,
21.10.2002.
Anleitung zum Absichern von Debian
Version: 3.0, Mon, 16 May 2005 21:27:58 +0200jfs@debian.org