Web Application Firewall (WAF) Apache mod_security
Apache mod_security est un "web application firewall" (WAF), un filtre qui applique une série de règles à une conversation HTTP. Généralement, ces règles ont pour but d'éviter les attaques du type Cross-site Scripting (XSS) ou d'injection de code (injection SQL par exemple). Il ne s'agit pas d'une protection infaillible contre les attaques, mais permettent dans certains cas de détecter ou d'éviter une attaque, si l'application web n'a pas été conçue correctement...
Installation de Apache mod_security
Pour l'installer sur Ubuntu 12.04 :
sudo apt-get install libapache-mod-security
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
OWASP Core Rules Set
Le Core Rules Set (CRS) est une liste de filtres pour Apache mod_security fournis par le projet OWASP. Sur Ubuntu 12.04, ces règles sont installées en même temps que mod_security, mais ne sont pas utilisées...
Pour les activer, il faut copier les fichiers de configuration :
sudo cp /usr/share/modsecurity-crs/base_rules/* /etc/modsecurity/
sudo cp /usr/share/modsecurity-crs/modsecurity_crs_10_config.conf /etc/modsecurity/
Il ne reste plus qu'à redémarrer Apache :
sudo service apache2 restart
Tester Apache mod_security
Pour tester mod_security, il suffit de créer un simple formulaire, non protégé:
<form action="" method="post">
<textarea name="text"></textarea>
<input type="submit" value="Sauver">
</ form>
<?php
echo htmlspecialchars($_POST['text']);
?>
Un attaquant qui veut réaliser un XSS entrera du code Javascript dans la textarea. Si vous essayez le code ci-dessous:
<script>attaquer()</script>
Mod_security produira des alertes dans /var/log/apache2/modsec_audit.log:
Message: Pattern match "(fromcharcode|alert|eval)\\s*\\(" at ARGS:text. [file "/usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "646"] [id "973307"] [rev "2.2.0"] [msg "XSS Attack Detected"] [data "alert("]
Activer le filtre
Pour le moment mod_security fonctionne en détection uniquement. Pour bloquer ce qui ressemble à une attaque, il faut modifier /etc/modsecurity/modsecurity.conf :
SecRuleEngine On
SecDefaultAction "phase:2,deny,log"
Si vous essayez à nouveau d'introduire du code javascript dans la textarea, cette fois-ci une page "Forbidden" sera affichée!