Rendiamo sicuro apache con mod_security

mod_security è un modulo di apache che ci aiuta a rendere il sistema più sicuro attraverso un Web Application Firewall.
Il Web Application Firewall (per gli amici WAF) è un filtro che controlla il traffico da e verso il webserver identificando possibili atticchi di alto livello come SQL Injection, Cross-Site scripting e simili.
L’utilizzo di mod_security deve essere però ponderato attentamente in quanto influisce negativamente sulle prestazioni globali del sistema e aumenta i consumi di risorse.
Quasi tutte le maggiori distribuzioni hanno un pacchetto precompilato per mod_security; in qualsiasi caso, trattandosi di un sistema che viene aggiornato con elevata frequenza, è preferibile non usare il pacchetto precompilato ma procedere con la compilazione. Questo perchè può capitare che le ultime regole non siano compatibili con versioni più anziane del modulo.

Installazione del modulo e delle regole
Il sistema si compone di due pacchetti: un pacchetto da compilare con il modulo di apache e un secondo pacchetto con le regole, simile alle definizioni di un antivirus.
Iniziamo con l’installazione dei prerequisiti: in questo caso propongo la sintassi di Debian/Ubuntu.
libapr e libapr-util

apt-get install libapr1 libapr1-dev libaprutil1 libaprutil1-dev

libpcre

apt-get install libpcre3 libpcre3-dev

libxml2

apt-get install libxml2 libxml2-dev

liblua

apt-get install liblua5.1-0 liblua5.1-0-dev

libcurl

apt-get install libcurl4-openssl-dev libcurl3-dbg

le librerie di sviluppo di apache:

apt-get install apache2-dev

i tools per lo sviluppo

apt-get install build-essential

i prerequisiti di Perl

apt-get install liblwp-useragent-determined-perl libgnupg-perl libcrypt-ssleay-perl

Infine è necessario abilitare il module mod_uniqueid

a2enmod unique_id

Dal sito http://www.modsecurity.org/ procediamo al download del modulo (al momento l’ultima versione disponibile è la 2.6.3) e scompattiamo il sorgente:

cd /usr/local/src
wget http://www.modsecurity.org/download/modsecurity-apache_2.6.3.tar.gz
tar zxvf modsecurity-apache_2.6.3.tar.gz
cd modsecurity-apache_2.6.3

Quindi passiamo alla compilazione e all’installazione del modulo:

./configure && make && make mlogc && make install

A questo punto avrete il modulo compilato e già installato nella directory corretta (/usr/lib/apache2/modules/mod_security2.so)

Ora è il turno delle regole CRS base (in questo caso l’ultima versione è la 2.2.3); il sito ufficiale rimanda a SourceForge: scaricate il pacchetto in /usr/local/src, scompattatelo e spostatelo nella direcory corretta con:

tar zxvf modsecurity-crs_2.2.3.tar.gz
mv modsecurity-crs_2.2.3 /etc/apache2/modsecurity-crs

Configurazione
La prima cosa da fare è configurare Apache perchè carichi il modulo. Lavorando su un sistema Debian/Ubuntu, seguo il loro modo di operare creando il file /etc/apache2/mods-available/mod-security.load

<strong>/etc/apache2/mods-available/mod-security.load</strong>
LoadFile /usr/lib/libxml2.so.2
LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so

Ora attiviamo il modulo con:

a2enmod mod-security

Il file di configurazione base sarà /etc/apache2/conf.d/modsecurity.conf. Partiamo da una solida base, utilizzando la configurazione raccomandata del sorgente scaricato.

cp /usr/local/src/modsecurity-apache_2.6.3/modsecurity.conf-recommended /etc/apache2/conf.d/modsecurity.conf
mv /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf.example /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf

Con questa configurazione, in realtà, il nostro sistema fa ben poco in quanto si tratta solo di un setup di base del modulo che non blocca nulla e non include alcuna regola specifica. Editiamo il file operando le modifiche qui sotto:

<strong>/etc/apache2/conf.d/modsecurity.conf</strong>
#### Riga da aggiungere all'inizio
<IfModule mod_security2.c>                                       
...
#### Riga da modificare
SecRuleEngine On                                                 
...




#### Righe da aggiungere alla fine
Include /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf 
Include /etc/apache2/modsecurity-crs/base_rules/*.conf
Include /etc/apache2/modsecurity-crs/activated_rules/*.conf
</IfModule>

A questo punto riavviamo Apache e verifichiamo in /var/log/apache2/error_log che il modulo venga caricato correttamente.

Per verificare l’effettiva funzionalità del sito potete creare un file test.php nella home directory del sito con il comando phpinfo. Ad es.

<strong>/var/www/test.php</strong>
<?php
phpinfo();
?>

e usare un tool di verifica come nikto per fare la scansione di quel sito. Questo è l’output del tools su una installazione standard di Apache senza mod_security:

+ Server: Apache/2.2.16 (Debian)
+ ETag header found on server, inode: 273242, size: 177, mtime: 0x4b5b1f0a49780
+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.19). Apache 1.3.42 (final release) and 2.0.64 are also current.
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS 
+ Retrieved x-powered-by header: PHP/5.3.3-7+squeeze3
+ OSVDB-3092: /phpmyadmin/changelog.php: phpMyAdmin is for managing MySQL databases, and should be protected or limited to authorized hosts.
+ OSVDB-3092: /test/: This might be interesting...
+ OSVDB-3233: /test.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3233: /test/info.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3233: /test/phpinfo.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ OSVDB-3092: /test.php: This might be interesting...
+ /phpmyadmin/: phpMyAdmin directory found
+ 6456 items checked: 0 error(s) and 13 item(s) reported on remote host
+ End Time:           2012-01-05 15:31:00 (425 seconds)
---------------------------------------------------------------------------

Questo è l’output del tool dopo l’abilitazione di mod_security:

---------------------------------------------------------------------------
+ Server: Apache/2.2.16 (Debian)
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.19). Apache 1.3.42 (final release) and 2.0.64 are also current.
+ 6456 items checked: 0 error(s) and 1 item(s) reported on remote host
+ End Time:           2012-01-05 15:06:42 (414 seconds)
---------------------------------------------------------------------------

Andare oltre
Già con le sole regole base attive abbiamo visto che il nostro server è molto più sicuro.
Il pacchetto crs comprende però altre regole in grado di aumentare ulterioremente il grado di protezione del nostro server e si trovano in /etc/apache2/mod_security/optional_rules, /etc/apache2/mod_security/experimental_rules e /etc/apache2/mod_security/slr_rules. La nostra configurazione è già pronta per regole aggiuntive e per attivarle è sufficiente creare un link simbolico dei file nella directory /etc/apache2/mod_security/activated_rules e ricaricare la configurazione di Apache.