ModSecurity : mettez un WAF dans votre Apache

ModSecurity : mettez un WAF dans votre ApacheUn 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.

Apache  / Apache Fedora Formateur Apache Formateur Fedora Formateur Linux Linux ModSecurity WAF Web Application Firewall 

Commentaires

A l’image d’un IPS ou même d’un antivirus une politique WAF doit être mise à jour régulièrement, est-ce possible avec mod_security ? De même ta mécanique de désactivation des règles me paraît un peu archaïque en cas de mise à jour des fichiers de « signatures » n’est il pas plutôt possible de gerer via des exceptions qui permettraient ou non d’indiquer qu’elle regle est désactivée (et avec un commentaire le pourquoi) ?

En l’état vu toutes les limitations que tu indiques j’ai du mal à voir la pertinence du truc…

@Jeremy

Oui, les règles ModSecurity font L’objet de mises à jour.

-> https://github.com/SpiderLabs/owasp-modsecurity-crs

la doc parait succinte et est erronnée pour debian …

le paquet se nomme : libapache2-mod-security2

en revanche pour l’inqstant je n’arrive pas à employer a2enmode

rmadison -a i386,amd64 libapache2-mod-security2
libapache2-mod-security2 | 2.8.0-2~bpo70+1 | wheezy-backports | amd64, i386
libapache2-mod-security2 | 2.8.0-3 | stable | amd64, i386
libapache2-mod-security2 | 2.8.0-4~bpo8+1 | jessie-backports | amd64, i386
libapache2-mod-security2 | 2.9.0-1 | testing | amd64, i386
libapache2-mod-security2 | 2.9.0-1 | unstable | amd64, i386

@Denis : Comment gères tu les maj des règles avec ta methode de gestion d’exceptions ? De même à quel mecanisme d’analyse de logs sécu as tu couplé le module ?

@Jérémy

J’ai ajouté, tout à la fin, un exemple au billet.

Intéressant du coup ;)

Laisser un commentaire

(requis)

(requis)