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
2.97 5 marzo 2004Ven, 3 Ott 2003 22:23:28 +0200jfs@computer.org