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