Chroot per Apache
L'utilità chroot è usata spesso per imprigionare un demone in un
settore sottoposto a limitazioni, per isolare reciprocamente dei servizi, in
modo che problemi di sicurezza in un pacchetto software non mettano in pericolo
l'intero server. Usando lo script makejail, impostare ed
aggiornare la zona sottoposta a chroot è più facile.
Questo documento è sottoposto a diritto d'autore di Alexandre Ratti, è stato
rilasciato sotto la GNU-FDL 1.2 (GNU Free Documentation Licence - Licenza sulla
libera documentazione GNU) ed è incluso in questo manuale per espresso
consenso. (per il il documento
originale)
Questa procedura è stata provata su Debian GNU/Linux 3.0 (Woody) con
makejail 0.0.4-1 (in Debian/testing).
root e creare una nuova cartella-gabbia:
$ mkdir -p /var/chroot/apache
chrapach.
$ adduser --home /var/chroot/apache --shell /bin/false \
--no-create-home --system --group chrapach
FIXME: Occorre un nuovo utente? (Apache è già attivo come utente Apache).
/etc/apache/httpd.conf, impostare Group e
User come chrapach. Riavviate Apache ed assicuratevi che
funzioni correttamente. A questo punto, fermate il demone Apache.
makejail (disponibile, per ora, in Debian/testing) e
anche wget e lynx, giacché sono usati da
makejail per provare il server sottoposto a "chroot":
apt-get install makejail wget lynx.
/etc/makejail:
# cp/usr/share/doc/makejail/examples/apache.py /etc/makejail/
/etc/makejail/apache.py, cambiando le opzioni di
chroot, users e groups. Per eseguire questa
versione di makejail, potete aggiungere anche l'opzione
packages. Vedete in makejail
documentation. Ecco un esempio:
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: pare che alcune opzioni non funzionino correttamente. Per
esempio, /etc/shadow e /etc/gshadow non sono copiate,
mentre /etc/password e /etc/group sono state copiate
completamente, invece di essere filtrate.
/etc/password ed /etc/group siano stati
copiati completamente, per sostituirli con copie filtrate, digitate:
$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
$ grep chrapach /etc/group > /var/chroot/apache/etc/group
Copiate le pagine del sito web e i file di log nella "gabbia"; quei
file non vengono copiati completamente (vedete l'opzione preserve nel
file di configurazione di makejail).
# 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. In /etc/init.d/sysklogd,
sostituite SYSLOGD="" con SYSLOGD=" -a
/var/chroot/apache/dev/log" e riavviate il demone con il comando
/etc/init.d/sysklogd restart.
/etc/init.d/apache), per
il cui corretto funzionamento potrebbero occorrere alcuni cambiamenti, come:
/proc
all'interno della "gabbia".
#! /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} $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: Il primo processo di Apache dovrebbe essere lanciato da un utente diverso da root( ossia add --chuid chrapach:chrapach)? Cons: chrapach non avrà bisogno di accesso in scrittura ai log.
/etc/logrotate.d/apache sostituite
/var/log/apache/*.log con
/var/chroot/apache/var/log/apache/*.log
/etc/init.d/apache start) e controllare cosa
viene riportato nel jail log
(/var/chroot/apache/var/log/apache/error.log). Se il vostro setup
fosse più complesso, (ossia usate anche PHP e MySQL), probabilmente mancheranno
dei file. Se alcuni file non vengono copiati automaticamente da
makejail, potete elencarli nell'opzione forceCopy (per
copiarli direttamente) o packages (per copiare interi pacchetti con le
loro dipendenze) nel file di configurazione
/etc/makejail/apache.py.
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
/proc: ls -la
/proc/process_number/root/. dove process è uno dei PID
elencati sopra (seconda colonna; 189 per esempio). Dovrebbero esserci elencate
le direcory di un tree ristretto:
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
Per automatizzare questo test, potete scrivere: ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/..
FIXME: Aggiungere altri test da far girare per assicurarsi che la gabbia sia chiusa?
Il motivo per cui mi piace è perché impostare la gabbia non è poi così difficile ed il server può essere aggiornato con due sole righe:
apt-get update && apt-get install apache
makejail /etc/makejail/apache.py
Se cercate maggiori informazioni potete provare anche queste fonti:
makejail homepage,
questo programma è stato scritto da Alan Tesio)
Chrooting daemons and
system processes di Jonathan, Network Dweebs, 21/10/2002
Apache
in una gabbia chroot in Securing and Optimizing Linux (Rendere
sicuro ed ottimizzare Linux scritto da Gerhard Mourani, 2000
Securing Debian Manual
Version: 2.97, Mon, 16 May 2005 21:28:06 +0200jfs@debian.org