Comment installer et configurer ModSecurity avec NGINX
Guide complet pour déployer ModSecurity 3.x avec NGINX afin d'obtenir une protection WAF gratuite et open source, basée sur l'OWASP Core Rule Set.
ModSecurity est un moteur WAF open source largement déployé, qui a protégé des millions de sites web. Combiné à NGINX, il offre une protection personnalisable contre les vulnérabilités de l'OWASP Top 10, l'injection SQL, le cross-site scripting et de nombreuses autres attaques web, le tout sans aucun coût de licence.
Ce guide vous accompagne dans l'installation de ModSecurity 3.x (libmodsecurity) avec le connecteur NGINX, la configuration de l'OWASP Core Rule Set et le réglage de l'ensemble pour un usage en production. À la fin, vous disposerez d'un WAF pleinement opérationnel sur votre serveur NGINX.
Avant de commencer, prenez connaissance du statut du projet : le sponsoring commercial de Trustwave pour ModSecurity a pris fin le 1er juillet 2024, et le moteur est désormais un projet maintenu par l'OWASP, en mode maintenance (correctifs de sécurité et de bugs, rythme de nouvelles fonctionnalités ralenti). ModSecurity 3.x reste pleinement fonctionnel et continue d'être packagé pour les principales distributions ; ce guide reste donc valide. Si vous choisissez aujourd'hui un moteur WAF, évaluez aussi Coraza, le successeur activement développé, écrit en Go, compatible SecLang/CRS ; consultez notre comparatif Coraza vs ModSecurity.
Prérequis
- NGINX installé et fonctionnel (open source ou Plus)
- Accès root ou sudo à votre serveur
- Ubuntu 20.04+, Debian 11+ ou RHEL/CentOS 8+ (les autres distributions peuvent varier)
- Connaissances de base de la configuration NGINX
- Git installé pour cloner les dépôts
Guide étape par étape
Installer les dépendances de ModSecurity 3.x
ModSecurity 3.x (libmodsecurity) nécessite plusieurs dépendances. Installez-les selon votre distribution :
Ubuntu/Debian :
sudo apt update
sudo apt install -y apt-utils autoconf automake build-essential \
git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre2-dev \
libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
RHEL/CentOS/Rocky :
sudo dnf install -y gcc-c++ flex bison yajl curl-devel zlib-devel \
pcre2-devel autoconf automake git curl make libxml2-devel \
pkgconfig libtool httpd-devel lmdb-devel GeoIP-devel
Cloner et compiler ModSecurity 3.x
Clonez le dépôt ModSecurity et compilez la bibliothèque :
cd /opt
sudo git clone --depth 1 -b v3/master --single-branch https://github.com/owasp-modsecurity/ModSecurity
cd ModSecurity
# Initialiser et mettre à jour les sous-modules
sudo git submodule init
sudo git submodule update
# Compiler et installer
sudo ./build.sh
sudo ./configure
sudo make
sudo make install
Cloner et compiler le connecteur NGINX
Le connecteur ModSecurity pour NGINX intègre libmodsecurity à NGINX en tant que module dynamique :
# Cloner le connecteur
cd /opt
sudo git clone --depth 1 https://github.com/owasp-modsecurity/ModSecurity-nginx.git
# Récupérer votre version de NGINX
nginx -v
# Téléchargez les sources NGINX qui correspondent EXACTEMENT à votre version installée.
# Remplacez 1.30.4 ci-dessous par la version indiquée par 'nginx -v'
# (1.30.4 est la version stable actuelle au moment de la rédaction).
wget http://nginx.org/download/nginx-1.30.4.tar.gz
tar -xzf nginx-1.30.4.tar.gz
cd nginx-1.30.4
# Compiler le module dynamique
./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
make modules
# Copier le module dans le répertoire des modules de NGINX
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
Activer le module ModSecurity dans NGINX
Chargez le module ModSecurity dans votre configuration NGINX :
Ajoutez cette ligne tout en haut de /etc/nginx/nginx.conf (avant le bloc events) :
load_module modules/ngx_http_modsecurity_module.so;
Testez la configuration :
sudo nginx -t
Vous devriez voir : syntax is ok et test is successful.
Créer la configuration ModSecurity
Mettez en place le répertoire de configuration de ModSecurity et la configuration de base :
# Créer l'arborescence de répertoires
sudo mkdir -p /etc/nginx/modsec
# Copier la configuration recommandée
sudo cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
# Copier le fichier de correspondance Unicode
sudo cp /opt/ModSecurity/unicode.mapping /etc/nginx/modsec/
Le fichier recommandé est livré avec SecRuleEngine DetectionOnly. Modifiez /etc/nginx/modsec/modsecurity.conf et ne faites passer le moteur en mode blocage qu'une fois les faux positifs éliminés :
# Modifiez cette ligne :
SecRuleEngine DetectionOnly
# En (une fois prêt pour la production) :
SecRuleEngine On
Installer l'OWASP Core Rule Set (CRS)
L'OWASP Core Rule Set offre une protection complète contre les attaques courantes. Le projet CRS recommande d'installer une version taguée et prise en charge plutôt que de suivre la branche de développement principale :
cd /etc/nginx/modsec
# Clonez un tag de version prise en charge spécifique. Consultez la page
# des releases pour connaître la dernière version :
# https://github.com/coreruleset/coreruleset/releases
sudo git clone --branch v4.28.0 --depth 1 https://github.com/coreruleset/coreruleset.git
cd coreruleset
# Créer le fichier de configuration CRS à partir de l'exemple
sudo cp crs-setup.conf.example crs-setup.conf
# Activer les modèles d'exclusion. Le glob rules/*.conf ne prend PAS en
# compte les deux fichiers d'exclusion, qui ne sont livrés qu'au format
# .example ; copiez-les en .conf, sinon vos exclusions personnalisées
# before/after-CRS ne seront jamais chargées.
sudo cp rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example \
rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
sudo cp rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example \
rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
Créez un fichier de règles principal dans /etc/nginx/modsec/main.conf :
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf
Activer ModSecurity dans les blocs server de NGINX
Activez ModSecurity pour vos sites en ajoutant des directives à vos blocs server :
server {
listen 80;
server_name example.com;
# Activer ModSecurity
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass http://backend;
# ... autres directives
}
}
Rechargez NGINX pour appliquer les changements :
sudo nginx -t && sudo systemctl reload nginx
Tester le WAF
Vérifiez que ModSecurity fonctionne en envoyant une attaque de test :
# Ceci devrait être bloqué (tentative d'injection SQL)
curl -I 'http://your-server.com/?id=1%20OR%201=1'
# Ceci devrait être bloqué (tentative de XSS)
curl -I 'http://your-server.com/?q=<script>alert(1)</script>'
Consultez le journal d'audit de ModSecurity :
sudo tail -f /var/log/modsec_audit.log
Vous devriez voir des entrées indiquant les requêtes bloquées, avec les identifiants de règles et les détails de l'attaque.
Configurer la journalisation
Configurez la journalisation de ModSecurity dans /etc/nginx/modsec/modsecurity.conf :
# Paramètres du journal d'audit
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
SecAuditLog /var/log/modsec_audit.log
# Journal de débogage (à désactiver en production)
SecDebugLog /var/log/modsec_debug.log
SecDebugLogLevel 0
Créez les fichiers de journaux avec les bonnes permissions :
sudo touch /var/log/modsec_audit.log
sudo chown www-data:www-data /var/log/modsec_audit.log
Ajuster les faux positifs
Après avoir fonctionné en mode DetectionOnly, examinez les journaux à la recherche de faux positifs. Approches d'ajustement courantes :
Exclure des règles spécifiques :
# Dans /etc/nginx/modsec/coreruleset/crs-setup.conf ou un fichier personnalisé :
SecRuleRemoveById 942100 # Désactiver une règle spécifique par son ID
SecRuleRemoveByTag "attack-sqli" # Désactiver toutes les règles SQLi par tag (CRS 4)
Dans CRS 3 et 4, le tag des injections SQL est attack-sqli (ou OWASP_CRS/ATTACK-SQLI). L'ancien tag CRS 2.x OWASP_CRS/WEB_ATTACK/SQL_INJECTION n'existe plus et ne correspond à aucune règle ; vérifiez donc toujours les noms de tags dans les fichiers de règles avant de vous appuyer sur une exclusion.
Exclure des règles pour des URL spécifiques :
SecRule REQUEST_URI "@beginsWith /api/upload" \
"id:1000,phase:1,pass,nolog,\
ctl:ruleRemoveById=200002"
Ajuster le niveau de paranoïa :
Dans crs-setup.conf, définissez le niveau de paranoïa (1 = faible taux de faux positifs, 4 = sécurité maximale) :
SecAction "id:900000,phase:1,pass,t:none,\
setvar:tx.blocking_paranoia_level=1"
Conclusion et étapes suivantes
Votre serveur NGINX est désormais protégé par ModSecurity et l'OWASP Core Rule Set, sans aucun coût de licence.
Prochaines étapes :
- Surveillez régulièrement
/var/log/modsec_audit.logpour repérer les attaques bloquées et les faux positifs - Après 1 à 2 semaines en mode DetectionOnly, passez SecRuleEngine à On
- Mettez en place la rotation du journal d'audit
- Envisagez d'intégrer les journaux à votre SIEM (ELK, Splunk, etc.)
- Mettez à jour le CRS en récupérant les nouveaux tags de version pris en charge (une revue mensuelle est recommandée)
- Documentez toute exclusion de règle personnalisée pour votre équipe
- ModSecurity étant désormais un projet OWASP en mode maintenance, envisagez Coraza pour les nouveaux déploiements ; il est compatible CRS et activement développé
Dépannage
Le module ne se charge pas : undefined symbol
Cela signifie que le connecteur NGINX a été compilé avec une version différente de NGINX. Recompilez le module en utilisant exactement la version des sources NGINX correspondant à votre NGINX installé (vérifiez avec nginx -v).
Des requêtes légitimes sont bloquées
Consultez /var/log/modsec_audit.log pour identifier l'identifiant de la règle à l'origine du blocage. Créez soit une règle d'exclusion, soit ajustez le niveau de paranoïa. Coupables fréquents : téléversements de fichiers, éditeurs de texte enrichi, API JSON.
Aucune entrée n'apparaît dans le journal d'audit
Vérifiez que le fichier de journal existe et dispose des permissions d'écriture pour l'utilisateur NGINX (www-data ou nginx). Assurez-vous que SecAuditEngine n'est pas réglé sur Off.
Dégradation des performances
ModSecurity ajoute une certaine latence (généralement de 1 à 5 ms). En cas de ralentissement significatif : réduisez le nombre de règles actives, abaissez la limite de taille du corps de requête (SecRequestBodyLimit) ou mettez en cache plus agressivement dans NGINX.
make échoue pendant la compilation de ModSecurity
Il s'agit généralement d'une dépendance manquante. Examinez attentivement les messages d'erreur. Sous Ubuntu, assurez-vous d'avoir les versions -dev des paquets (par exemple, libcurl4-openssl-dev, et non simplement libcurl4).
Questions fréquentes
Dois-je utiliser ModSecurity 2.x ou 3.x avec NGINX ?
Utilisez ModSecurity 3.x (libmodsecurity). La version 2.x a été conçue pour Apache et ne fonctionne avec NGINX qu'au prix de contournements laborieux. La version 3.x a été reconstruite comme une bibliothèque autonome dotée d'un connecteur NGINX natif, offrant de meilleures performances et une meilleure compatibilité.
Quel est l'impact de ModSecurity sur les performances de NGINX ?
ModSecurity ajoute généralement de 1 à 5 ms de latence par requête, selon la complexité des règles et la taille de la requête. Pour la plupart des applications, cela reste négligeable. Les sites à fort trafic devraient réaliser des tests de performance et envisager d'ajuster SecRequestBodyLimit et les niveaux de paranoïa pour optimiser les performances.
Puis-je utiliser ModSecurity avec NGINX Plus ?
Oui, le même connecteur ModSecurity fonctionne avec NGINX Plus. Toutefois, les utilisateurs de NGINX Plus peuvent aussi envisager NGINX App Protect, le WAF commercial de F5 spécifiquement optimisé pour NGINX Plus, avec des fonctionnalités et un support supplémentaires. Notez que l'ancien NGINX ModSecurity WAF de F5 a atteint sa fin de vie le 31 mars 2024 ; App Protect est donc désormais la voie commerciale actuelle.
Comment mettre à jour l'OWASP Core Rule Set ?
Placez-vous dans le répertoire coreruleset et récupérez un tag de version plus récent pris en charge, puis rechargez NGINX : cd /etc/nginx/modsec/coreruleset && sudo git fetch --tags && sudo git checkout v4.28.0 (remplacez par le dernier tag disponible sur la page des releases). Évitez de suivre la branche principale avec git pull, car elle contient des modifications de règles en cours de développement susceptibles de provoquer des blocages inattendus. Testez toujours les mises à jour dans un environnement de préproduction au préalable.
Quelle est la différence entre DetectionOnly et On ?
Le mode DetectionOnly journalise les attaques potentielles mais ne les bloque pas : les requêtes atteignent malgré tout votre application. Le mode On bloque activement les requêtes malveillantes. Commencez toujours par DetectionOnly pour identifier les faux positifs avant de passer à On en production.
Puis-je utiliser ModSecurity pour protéger plusieurs sites sur un même serveur NGINX ?
Oui. Vous pouvez activer ModSecurity globalement dans le bloc http pour tous les sites, ou de façon sélective par bloc server. Vous pouvez également utiliser des configurations de règles différentes par site en spécifiant des chemins modsecurity_rules_file distincts dans chaque bloc server.
ModSecurity est-il toujours maintenu, et dois-je envisager une alternative ?
ModSecurity est toujours maintenu, mais son statut a changé. Le sponsoring commercial de Trustwave a pris fin le 1er juillet 2024, et le moteur est passé sous la responsabilité de l'OWASP en tant que projet en mode maintenance (correctifs de sécurité et de bugs, rythme de nouvelles fonctionnalités ralenti). Il reste pleinement fonctionnel et packagé pour les principales distributions. Pour les nouveaux déploiements, évaluez Coraza, un moteur OWASP écrit en Go qui parle SecLang et exécute le même OWASP Core Rule Set ; il est positionné comme le successeur activement développé.
Guides associés
Comment configurer Cloudflare WAF pour WordPress
Guide étape par étape pour configurer le pare-feu applicatif web (WAF) Cloudflare afin de protéger votre site WordPress contre les attaques.
Guide des bonnes pratiques de sécurité WAF
Bonnes pratiques essentielles pour configurer et maintenir votre pare-feu applicatif web pour une sécurité optimale.