Mod security

mod_security est filtre (pare-feu) applicatif se présentant sous le forme d(un module que l'on peut ajouter à son serveur web Apache. Son rôle est de filtrer les requêtes bizarroïdes. Certaines distributions récentes (comme Fedora) l'intègrent et ce module peut donc être installé très facilement.

L'installation automatique convient parfaitement, mais si vous voulez avoir la toute dernière version ou si votre distribution ne la contient pas, j'ai aussi décrit la procédure manuelle.

Installation automatique

Sous Fedora 8, il suffit de taper, en mode root :

yum install mod_security

Et le toujours est joué... une fois que le serveur web aura redémarré (cf ci-dessous) :

apachectl restart

En général, les règles par défaut sont assez fines et évoluées, il n'y a pas à y toucher, sauf si cela bloque des fonctionnalités de votre site.

Si une règle vous bloque

C'est pas de chance, car il faudra alors désactiver une règle, ce qui potentiellement vous expose à une faille de sécurité. Bon, mais en pratique, il est rare qu'une règle soit cruciale à elle seule, et les autres vous permettront de conserver un niveau de sécurité acceptable. Si toutefois vous devez en désactiver plusieurs, il faudra alors se poser de sérieuses questions sur votre site, qui doit employer des techniques intrusives ou qui est conceptuellement mal sécurisé.

Comment le savoir ?

Faites un tour dans le répertoire /var/log/httpd et regardez le contenu des fichiers de logs de mod_security.

[root@host httpd]# tail -20 modsec_audit.log
GET / HTTP/1.1
Host: xx.xxx.xxx.xxx

--54705f53-F--
HTTP/1.1 400 Bad Request
Content-Length: 305
Connection: close
Content-Type: text/html; charset=iso-8859-1

--54705f53-H--
Message: Warning. Match of "rx ^OPTIONS$" against "REQUEST_METHOD" required. [id "960015"] [msg "Request Missing  an Accept Header"] [severity "CRITICAL"]
Message: Warning. Operator EQ match: 0. [id "960009"] [msg "Request Missing a User Agent Header"]    [severity "WARNING"]
Message: Access denied with code 400 (phase 2). Pattern match "^[\d\.]+$" at REQUEST_HEADERS:Host.   [id "960017"] [msg "Host header is a numeric IP address"] [severity "CRITICAL"]
Action: Intercepted (phase 2)
Stopwatch: 1211041326569321 1012 (293 703 -)
Producer: ModSecurity v2.1.7 (Apache 2.x)
Server: Apache/2.2.8 (Fedora)

--54705f53-Z--

On peut aussi avoir des infos dans /var/log/httpd/modsec_debug.log :

[root@ikobox httpd]# tail -6 modsec_debug.log
[17/May/2008:18:22:06 +0200] [91.121.138.106/sid#802cace0][rid#8064f0f8][/][2] Warning. Match of "rx ^OPTIONS$" against "REQUEST_METHOD" required. [id "960015"] [msg "Request Missing an Accept Header"] [severity "CRITICAL"]
[17/May/2008:18:22:06 +0200] [91.121.138.106/sid#802cace0][rid#8064f0f8][/][2] Warning. Operator EQ match: 0. [id "960009"] [msg "Request Missing a User Agent Header"] [severity "WARNING"]
[17/May/2008:18:22:06 +0200] [91.121.138.106/sid#802cace0][rid#8064f0f8][/][1] Access denied with code 400 (phase 2). Pattern match "^[\d\.]+$" at REQUEST_HEADERS:Host. [id "960017"] [msg "Host header is a numeric IP address"] [severity "CRITICAL"]
[17/May/2008:18:27:08 +0200] [91.121.138.106/sid#802cace0][rid#806440d0][/][2] Warning. Match of "rx ^OPTIONS$" against "REQUEST_METHOD" required. [id "960015"] [msg "Request Missing an Accept Header"] [severity "CRITICAL"]
[17/May/2008:18:27:08 +0200] [91.121.138.106/sid#802cace0][rid#806440d0][/][2] Warning. Operator EQ match: 0. [id "960009"] [msg "Request Missing a User Agent Header"] [severity "WARNING"]
[17/May/2008:18:27:08 +0200] [91.121.138.106/sid#802cace0][rid#806440d0][/][1] Access denied with code 400 (phase 2). Pattern match "^[\d\.]+$" at REQUEST_HEADERS:Host. [id "960017"] [msg "Host header is a numeric IP address"] [severity "CRITICAL"]

On voit que la règle 960017 est remplie, ce qui correspond à une type d'attaque. Après, à vous de voir s'il faut la désactiver.

Comment le corriger ?

Les règles sont dans /etc/httpd/modsecurity.d dans l'installation sous Fedora 8.

[root@ikobox conf.d]# cd /etc/httpd/modsecurity.d
[root@ikobox modsecurity.d]# grep '960017' *
modsecurity_crs_21_protocol_anomalies.conf:SecRule REQUEST_HEADERS:Host "^[d.]+$" "deny,log,auditlog,status:400,msg:'Host header is a numeric IP address', severity:'2',id:'960017'"

Liens externes

Site officiel de mod-security