Obbiettivo
Configurare il server web Apache 2.x isolato in ambiente chroot tramite il web firewall applicativo MODSECURITY .
Scenario
- Server Linux: CentOS 6.5
- Server Apache: httpd-2.2.15-29
- modsecurity: mod_security-2.7.3-2
- Php Version: php-5.3.3-27
- Directory root Chroot: (/web)
- Selinux: NO
- Installazione dei pacchetti necessari per modsecurity ========================================================
Da utente root scaricare l’ultima versione del repository EPEL , dopo di che installare i programmi necessari tramite YUM:
- wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- rpm -Uhv epel-release-6-8.noarch.rpm
- yum install mod_security
- yum install httpd php (solo se necessario)
Creazione ambiente chroot
Per prima cosa creare le directory di sistema che ospiteranno apache:
- mkdir /web/
- mkdir -p /web/var/run/httpd/
- mkdir -p /web/var/www/html/
- mkdir -p /web/etc/httpd
- mkdir /web/tmp
- mkdir -p /web/var/lib/php/session/
- mkdir -p /web/usr/share/zoneinfo/
- **mkdir /web/lib64/
** - mkdir -p /web/var/lock/subsys/
- cp -p /etc/localtime /web/etc/
- cp -p /etc/resolv.conf /web/etc/
- cp -p /etc/hosts /web/etc/
- cp -prf /usr/share/zoneinfo/* /web/usr/share/zoneinfo/
- **cp -p /lib64/libnss_dns.so.2 /web/lib64/
** - cd /web/etc/httpd/
- ln -s ../../var/run/httpd run
ATTENZIONE – In caso di sistemi a 32bit sostituire “lib64” con “lib“, solo nei punti 8 e 14 sopra citati.
Conclusa la creazione delle directory, settare i permessi di sistema in maniera appropriata (in accordo con i settaggi di default):
- chmod 0555 /web
- chmod 0755 /web/etc
- chmod 0755 /web/etc/httpd
- chmod 0555 /web/lib64
- chmod 0777 /web/tmp
- chmod 0755 /web/var/lib
- chmod 0755 /web/var/lib/php
- chown apache.apache /web/var/lib/php/session
- chmod 0770 /web/var/lib/php/session
- chmod 0755 /web/var/run
- chown root.apache /web/var/run/httpd/
- chmod 0710 /web/var/run/httpd/
- chmod 0755 /web/var/www/
- chown apache.apache /web/var/www/html/
- chmod 0770 /web/var/www/html/
Configurazione modsecurity
Da root editare il file /etc/httpd/conf.d/mod_security.conf .
Modificare le ultime righe da così:
SecCookieFormat 0
SecUploadDir /var/lib/mod_security
SecDataDir /var/lib/mod_security
</IfModule>
a così:
SecChrootDir /web
SecTmpDir /tmp
SecUploadDir /tmp
SecDataDir /var/lib/mod_security
</IfModule>
Configurazione init file di Apache
Modificare il file init di apache in modo da poter gestire il file pid del processo all’interno dell’ambiente chroot.
Sostiruire le righe file /etc/init.d/httpd da così:
pidfile=${PIDFILE-/web/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/web/var/lock/subsys/httpd}
a così:
# Cambio destinazione dei file verso ambiente chroot
#pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
#lockfile=${LOCKFILE-/var/lock/subsys/httpd}
pidfile=${PIDFILE-/web/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/web/var/lock/subsys/httpd}
Avvio di apache e test funzionamento ambiente chroot
Far paritire il servizio apache:
[[email protected] ~]# /etc/init.d/httpd start
Avvio di httpd: [ OK ]
[[email protected] ~]#
Adesso che il demone è attivo, creare la pagina php “/web/var/www/html/index.php” tramite l’editor preferito:
<?php
$file = "/tmp/file.txt";
$f = fopen($file, "r");
while ( $line = fgets($f, 1000) ) {
print $line;
}
Creare due file temporanei di test e settare i permessi appropriati:
# Cambio propetario della pagina php
chown apache.apache /web/var/www/html/index.php
# Creo due file di testo all interno delle directory temp
echo “Filesystem ROOT” > /tmp/file.txt
echo “Filesystem CHROOT” > /web/tmp/file.txt
# Cambio permessi dei file temporanei
chmod 777 /tmp/file.txt
chmod 777 /web/tmp/file.txt
Lo scopo di questo test è accertarsi che apache non esca dall’ambiente isolato chroot.
La pagina php precedentemente creata andrà ad aprire il file “/tmp/file.txt” e se modsecurity è stato configurato in maniera corretta, apache leggerà il file all’interno della directory temporanea stampando sul browser: Filesystem CHROOT.
Problema logrotate
Logrotate, dopo aver ruotato i vecchi log di apache, esegue il comando “/etc/init.d/httpd reload“.
Purtroppo a causa delle modifiche apportate alll’init script di apache per modsecurity, l’operazione di reload non va più a buon fine.
Il processo di apache viene stoppato correttamente, ma al momento dell’avvio si blocca (Oblligando un’inizializzazione del servizio manuale).
L’unico workaround che ho trovato è quello di modificare il file “/etc/logrotate.d/httpd” da così:
/var/log/httpd/*log {
missingok
compress
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
a così:
/var/log/httpd/*log {
missingok
compress
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd restart > /dev/null 2>/dev/null || true
endscript
}
Mi sento di sconsigliare questo workaround per ambienti di produzione.
Appena avrò novità aggiornerò il post.