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.96 20 septiembre 2003Sabato, 30 Agosto 2003 18:27:45 +0200jfs@computer.org