Credit : Illustration backtotheweb.fr
Configurer un pare-feu applicatif (WAF) avec Nginx
Pourquoi un WAF est indispensable
Cet article, c'est le genre de truc que j'aurais aimé trouver quand j'ai débuté.
Un pare-feu applicatif (Web Application Firewall) analyse le trafic HTTP entrant et bloque les requetes malveillantes avant qu'elles n'atteignent votre application. Contrairement a un pare-feu reseau classique (iptables), le WAF comprend le protocole HTTP et peut detecter les injections SQL, les attaques XSS ou les tentatives de brute-force.
Sur un serveur IONOS, Nginx est souvent deja en place comme reverse proxy. Voyons comment le transformer en veritable bouclier.
Rate Limiting : limiter les requetes
Le rate limiting empeche un client d'envoyer trop de requetes en peu de temps :
# Dans le bloc http {}
http {
limit_req_zone $binary_remote_addr zone=global:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
}
# Dans le bloc server {}
server {
# Limite globale
limit_req zone=global burst=20 nodelay;
# Limite stricte sur la page de login
location /wp-login.php {
limit_req zone=login burst=3 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
}
Le parametre burst autorise un petit depassement temporaire, et nodelay traite ces requetes immediatement au lieu de les mettre en file d'attente.
Geo Blocking : bloquer par pays
Si votre site cible uniquement la France, vous pouvez bloquer le trafic provenant de certains pays. Installez le module GeoIP2 :
sudo apt install libnginx-mod-http-geoip2
sudo wget -O /usr/share/GeoIP/GeoLite2-Country.mmdb https://download.db-ip.com/free/dbip-country-lite-2026-03.mmdb.gz
Configuration Nginx :
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
auto_reload 24h;
$geoip2_country_code country iso_code;
}
map $geoip2_country_code $blocked_country {
default 0;
CN 1;
RU 1;
KP 1;
}
server {
if ($blocked_country) {
return 403;
}
}
Filtrage de requetes malveillantes
Bloquez les patterns d'attaque courants directement dans Nginx :
server {
# Bloquer les tentatives de traversee de repertoire
location ~* \.\./ {
return 403;
}
# Bloquer les extensions sensibles
location ~* \.(env|git|bak|sql|log)$ {
return 403;
}
# Bloquer les user-agents suspects
if ($http_user_agent ~* (sqlmap|nikto|nmap|masscan)) {
return 403;
}
> **Note perso** : sur nos serveurs IONOS, cette config tourne nickel depuis des mois.
# Limiter la taille du body
client_max_body_size 10M;
client_body_buffer_size 128k;
}
ModSecurity : le WAF complet
Pour une protection avancee, installez ModSecurity avec les regles OWASP CRS :
sudo apt install libmodsecurity3 libnginx-mod-http-modsecurity
sudo mkdir /etc/nginx/modsecurity
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/nginx/modsecurity/modsecurity.conf
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsecurity/modsecurity.conf
Telechargez les regles OWASP Core Rule Set :
cd /etc/nginx/modsecurity
sudo git clone https://github.com/coreruleset/coreruleset.git
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
Activez dans Nginx :
server {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
location / {
proxy_pass http://backend;
}
}
Tester et surveiller
Apres configuration, testez avec curl :
# Test rate limiting
for i in $(seq 1 50); do curl -s -o /dev/null -w "%{http_code}\n" https://monsite.fr/; done
# Test injection SQL
curl "https://monsite.fr/?id=1' OR 1=1--"
# Doit retourner 403
Consultez les logs ModSecurity :
sudo tail -f /var/log/modsec_audit.log
Un WAF bien configure sur votre serveur IONOS constitue une premiere ligne de defense efficace. Combinez-le avec des mises a jour regulieres et un monitoring actif pour une securite optimale.