ModSecurity sur Nginx : mettre en place un WAF sur Ubuntu pas à pas

Dans ce tutoriel, nous allons voir comment mettre en place ModSecurity, un Web Application Firewall (WAF), afin de renforcer la sécurité d’un serveur Nginx sous Ubuntu.
ModSecurity permet de protéger vos applications web contre de nombreuses attaques courantes telles que les injections SQL, le cross-site scripting (XSS) ou encore les tentatives d’exploitation automatisées.

Nous verrons pas à pas comment installer ModSecurity, l’intégrer à Nginx, activer le moteur de protection et déployer les règles OWASP Core Rule Set (CRS). Enfin, nous effectuerons des tests de validation et aborderons quelques bonnes pratiques pour adapter le WAF à un environnement de production.

Compiler le module Nginx ModSecurity

Avant de se lancer dans la configuration de ModSecurity pour Nginx, nous allons devoir compilter le module ngx_http_modsecurity_module qui va permettre de faire le lien entre ModSecurity et Nginx.

Afin de garder mon serveur « Reverse proxy » propre, il est préférable de faire cette compilation sur un autre serveur.

Installer les paquets nécessaires à la compilation du module ModSecurity pour Nginx :

apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libgeoip-dev libyajl-dev doxygen libpcre2-16-0 libpcre2-dev libpcre2-posix3 zlib1g zlib1g-dev -y

Pour commencer, récupérer la version de Nginx sur votre serveur :

nginx -v

Comment on peut le voir, j’utilise Nginx vers 1.28.0

Commencer par télécharger les sources de la version de Nginx sur le site nginx.org.

wget https://nginx.org/download/nginx-1.28.0.tar.gz

Décompresser l’archive :

tar -xzvf nginx-1.28.0.tar.gz

Maintenant, créer un dossier où l’on va cloner le dépôt du module Nginx ModSecurity

mkdir nginx-modsecurity

Aller dans le dossier et cloner le dépôt suivant : https://github.com/owasp-modsecurity/ModSecurity-nginx

git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git .

Avant de se lancer dans la compilation du module, nous allons installer ModSecurity est qui requis pour la compilation du module Nginx.

apt install libmodsecurity3t64 -y

Aller ensuite dans le dossier source de Nginx pour compiler le module :

./configure --with-compat --add-dynamic-module=../nginx-modsecurity
make modules

Le module ModSecurity pour Nginx est compilé, le fichier (ngx_http_modsecurity_module.so) est disponible se trouve dans le dossier obj.

Maintenant que le module est compilé, on va pouvoir l’installer et le configurer sur le serveur Nginx.

Installer le module ModSecurity sur Nginx

Dans mon cas, je vais installer le module ModSecurity sur un serveur Nginx qui est utilisé comme Reverse proxy, cela va me permettre d’ajouter une couche de sécurité sur les sites publiés.

Sur le serveur Nginx, commencer par installer ModSecurity :

apt install libmodsecurity3t64 -y

Ensuite dans le dossier /etc/nginx créer un dossier modules dans lequel on va mettre le fichier ngx_http_modsecurity_module.so.

mkdir -p /etc/nginx/modules

Dans le dossier /etc/nginx/modules-available/, créer un fichier de conf qui va permettre le changement du module.

nano /etc/nginx/modules-available/mod-security-nginx.conf

Voici le contenu du fichier :

# Chargement du module ModSecurity
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;

Vérifier la configuration de Nginx et recharger la configuration s’il n’y a pas d’erreur :

nginx -t
systemctl reload nginx

A ce stade, nous avons le module qui est installé sur Nginx.

Ajouter les regles OWASP pour la detection

Sur Ubuntu, les règles OWASP peuvent être directement installés depuis apt.

apt install modsecurity-crs -y

Une fois installé, les fichiers des règles se trouvent à l’emplacement suivant : /usr/share/modsecurity-crs/rules.

Dans le dossier /etc/nginx/, créer un dossier modsec dans lequel, nous allons mettre les fichiers de configuration.

Le fichier /etc/nginx/modsec/modsecurity.conf : https://git.rdr-it.com/root/modsecurity-nginx/-/blob/main/modsecurity.conf?ref_type=heads

Ce fichier de configuration active ModSecurity en mode detection only, pas de blocage et charge les regles owasp.

Le fichier /etc/nginx/modsec/unicode.mapping : https://git.rdr-it.com/root/modsecurity-nginx/-/blob/main/unicode.mapping?ref_type=heads

Editer le fichier : /usr/share/modsecurity-cr/owasp-crs.load en remplacement IncludeOptional par Include

##
## This file loads OWASP CRS's rules when the package is installed
## It is Included by libapache2-mod-security2
##
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
Include /usr/share/modsecurity-crs/rules/*.conf
Include /etc/modsecurity/crs/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

Maintenant, modifier le fichier du virtualhost où vous souhaitez activer ModSecurity, ajouter les lignes ci-dessous dans le bloc server { ... }

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;

Tester et recharger la configuration Nginx :

nginx -t
systemctl reload nginx

Tester ModSecurity

Sur le site où vous avez activer ModSecurity, aller à l’URL suivante : http://domain.tld/ a-php-file-not-exist.php?param=../../etc

Vous devriez arriver sur une page d’erreur 404, regarder le fichier de logs /var/log/modsec_audit.log afin de vérifier que ModSecurity ait détecté l’attaque.

Pour activer le blocage dans le fichier /etc/nginx/modsecurity.conf passser SecRuleEngine à On, recharger la configuration Nginx et tester de nouveau l’URL, vous devriez avoir une erreur 403, qui montre bien que l’attaque a été bloqué.

Ajouter une exception

Si vous ne souhaitez pas bloquer un type d’attaque car c’est un « faux positif », dans le fichier de configuration ajouter ces lignes :

modsecurity_rules '
    SecRuleRemoveById 949110
 ';

Ici, on va ignorer la règle qui a ID 949110, vous trouverez l’ID de la règle dans les logs.

Utiliser les règles OWSAP officielles

Si vous souhaitez utiliser les règle OWSAP officiels disponibles sur le dépôt : https://github.com/coreruleset/coreruleset/tree/main qui sont à jour, voici comment faire.

Dans le dossier /etc/nginx, créer un dossier owsap puis se déplacer dedans.

Cloner le dépôt :

git clone https://github.com/coreruleset/coreruleset.git .

Dans le fichier /etc/nginx/modsec/modsecurity.conf à la fin commenter la ligne qui inclus les règles du paquet modsecurity-crs et ajouter les lignes suivantes :

#Include /usr/share/modsecurity-crs/owasp-crs.load
Include /etc/nginx/owasp/crs-setup.conf
Include /etc/nginx/owasp/rules/*.conf

Vérifier la configuration et recharger la.

Pourquoi commencer en mode Detection Only ?

Avant d’activer le blocage automatique, il est fortement recommandé de démarrer ModSecurity en mode détection uniquement (Detection Only).

Ce mode permet :

  • d’analyser le trafic réel sans impacter les utilisateurs,
  • d’identifier les règles OWASP qui génèrent des faux positifs,
  • d’adapter progressivement les exclusions et ajustements nécessaires,
  • de comprendre le comportement du WAF sur vos applications spécifiques.

Une fois les règles validées et les journaux analysés, vous pouvez basculer ModSecurity en mode blocage (On) en toute confiance, avec un risque minimal d’interruption de service.

Conclusion

La mise en place de ModSecurity sur Nginx sous Ubuntu permet d’ajouter une couche de sécurité essentielle devant vos applications web. En s’appuyant sur un Web Application Firewall (WAF) et sur les règles OWASP Core Rule Set, vous limitez efficacement les risques liés aux attaques les plus courantes sans modifier votre code applicatif.

Cependant, un WAF ne doit jamais être activé brutalement en production. Une phase d’observation et d’ajustement est indispensable afin d’éviter les faux positifs et les blocages involontaires. Correctement configuré et surveillé, ModSecurity devient un excellent complément aux bonnes pratiques de sécurisation Nginx (TLS, headers HTTP, rate limiting, etc.).

Ce tutoriel constitue une base solide que vous pourrez ensuite adapter à des environnements plus complexes, comme un reverse-proxy, une architecture Docker ou une exposition derrière un CDN.

FAQ – ModSecurity sur Nginx

ModSecurity est-il compatible avec Nginx ?

Oui, ModSecurity est compatible avec Nginx via le connecteur ModSecurity-nginx. Il fonctionne comme un module dynamique et s’intègre parfaitement à une configuration existante.

Les règles OWASP CRS sont-elles obligatoires ?

Non, mais elles sont fortement recommandées. Les OWASP Core Rule Set fournissent une base de protection éprouvée contre les attaques les plus courantes (SQLi, XSS, RCE, etc.).

ModSecurity a-t-il un impact sur les performances ?

Un léger impact peut exister, surtout avec un grand nombre de règles actives. Toutefois, avec une configuration adaptée et un matériel correct, l’impact reste généralement négligeable pour la majorité des sites.

Peut-on utiliser ModSecurity derrière un reverse-proxy ?

Oui, ModSecurity est parfaitement adapté à un usage en reverse-proxy (Nginx frontal). Il est même souvent utilisé dans ce contexte pour protéger plusieurs applications en amont.

ModSecurity remplace-t-il un pare-feu réseau ?

Non. ModSecurity est un pare-feu applicatif (WAF). Il complète un pare-feu réseau ou système (iptables, nftables, firewall cloud), mais ne le remplace pas.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.