Apache 2 chroot + modsecurity CentOS 6

modsecurity

 

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

 

1) 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:

  1. wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  2. rpm -Uhv epel-release-6-8.noarch.rpm
  3. yum install mod_security
  4.  yum install httpd php (solo se necessario)

 

Creazione ambiente chroot

Per prima cosa creare le directory di sistema che ospiteranno apache:

  1. mkdir /web/
  2. mkdir -p /web/var/run/httpd/
  3. mkdir -p /web/var/www/html/
  4. mkdir -p /web/etc/httpd
  5. mkdir /web/tmp
  6. mkdir -p /web/var/lib/php/session/
  7. mkdir -p /web/usr/share/zoneinfo/
  8. mkdir /web/lib64/
  9. mkdir -p /web/var/lock/subsys/
  10. cp -p /etc/localtime /web/etc/
  11. cp -p /etc/resolv.conf /web/etc/
  12. cp -p /etc/hosts /web/etc/
  13. cp -prf /usr/share/zoneinfo/* /web/usr/share/zoneinfo/
  14. cp -p /lib64/libnss_dns.so.2 /web/lib64/
  15. cd /web/etc/httpd/
  16. 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):

  1. chmod 0555 /web
  2. chmod 0755 /web/etc
  3. chmod 0755 /web/etc/httpd
  4. chmod 0555 /web/lib64
  5. chmod 0777 /web/tmp
  6. chmod 0755 /web/var/lib
  7. chmod 0755 /web/var/lib/php
  8. chown apache.apache /web/var/lib/php/session
  9. chmod 0770 /web/var/lib/php/session
  10. chmod 0755 /web/var/run
  11. chown root.apache /web/var/run/httpd/
  12. chmod 0710 /web/var/run/httpd/
  13. chmod 0755 /web/var/www/
  14. chown apache.apache /web/var/www/html/
  15. 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.

modsecurity

 

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.