ModSecurity : mettez un WAF dans votre Apache
Un WAF, un Web Application Firewall, est un dispositif logiciel associé à votre serveur Web – avec, en option, un mécanisme de reverse proxy – dont l’objet est de vous protéger d’attaques en DDoS, d’injections SQL, de requêtes parasites et agressives ou encore d’attaques de type XSS. S’appuyant notamment sur les travaux du projet OWASP, ModSecurity est un module associé à Apache, Nginx ou IIS, qui fournit des règles faisant office de WAF.
Installer ModSecurity sur Apache
J’ai installé les paquets RPM mod_security, mod_security_crs, mod_security_crs-extras sur ma Fedora 24 à partir des dépôts de la distribution :
dnf install mod_security mod_security_crs mod_security_crs-extras
Vous devez ensuite recharger la configuration de votre serveur Apache :
systemctl reload httpd
Activer le mode Debug
Du fait de règles parfois un peu strictes, je vous conseille d’afficher l’origine des blocages provoquées par la mise en œuvre de ModSecurity. Éditez le fichier /etc/httpd/conf.d/mod_security.conf et modifier la directive SecDebugLogLevel en la passant à 1 :
SecDebugLog /var/log/httpd/modsec_debug.log SecDebugLogLevel 1
Vous devez recharger la configuration de votre serveur Apache en tapant à partir de la ligne de commande :
systemctl reload httpd
Pour consulter le fichier, afin de savoir quelles sont les règles bloquantes, prenez le temps d’analyser le fichier de log :
tail -f /var/log/httpd/modsec_debug.log
Exemple de log et action corrective
[20/Jul/2016:08:21:03 +0200] [www.dsfc.net/sid#5651ed228e08][rid#7f34e8015f40][/favicon.ico][1] Access denied with code 403 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_protocol_anomalies.conf"] [line "47"] [id "960015"] [rev "1"] [msg "Request Missing an Accept Header"] [severity "NOTICE"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"]
A l’observation du log ci-dessus, j’ai décidé de commenter en ligne 47 la règle 960015 du fichier /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_protocol_anomalies.conf. J’ai même dû désactiver certains fichiers de règles extrêmement bloquant en les renommant avec l’extension .old !
Le souci est qu’il faut redémarrer le serveur Apache pour que cette modification soit prise en compte :
systemctl restart httpd
Gérer les exceptions
Plutôt que de désactiver des règles issues de ModSecurity, il peut être intéressant de gérer des exceptions dans votre .htaccess ou dans la configuration de votre VirtualHost ainsi :
<LocationMatch "/wp-admin "> <IfModule security2_module> SecRuleRemoveById 973300 </IfModule> </LocationMatch>
NB Il existe une distribution BSD pré-packagée, du nom de Vulture, qui fait tout ça très bien.