Comment mettre en place une stratégie efficace de limitation de débit (Rate Limiting) avec Nginx pour contrer les attaques force brute et le scraping ?
Nginx intègre un moteur de limitation de débit très puissant basé sur l’algorithme du Leaky Bucket. Il permet de bloquer l’abus de requêtes sans perturber les utilisateurs légitimes.
Étape 1 : Définir la zone de stockage (limit_req_zone)
Ouvrez votre fichier de configuration principal /etc/nginx/nginx.conf ou le bloc http de votre site :
Nginx
http {
# Crée une zone de 10 Mo nommée "login_limit" pour stocker les adresses IP (1 Mo = ~16 000 IP)
# Limite le débit à 1 requête par seconde (1r/s) par adresse IP
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
# Zone globale pour le reste du site (ex: 10 requêtes par seconde max)
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=10r/s;
}
Étape 2 : Appliquer les limitations sur vos routes sensibles
Dans la configuration de votre serveur virtuel (server ou location), appliquez ces zones :
Nginx
server {
...
# Protection des formulaires sensibles (Authentification, inscription, recherche)
location /login {
# Applique la zone de limitation
limit_req_req zone=login_limit burst=5 nodelay;
# Définit le code d'erreur renvoyé au client (429 Too Many Requests au lieu de 503)
limit_req_status 429;
proxy_pass http://votre_backend;
}
# Limitation générale sur le reste du site
location / {
# burst=20 autorise temporairement jusqu'à 20 requêtes en rafale pour charger les assets (CSS, JS)
limit_req zone=global_limit burst=20 nodelay;
try_files $uri $uri/ /index.php?$query_string;
}
}
-
burst=X: Crée une file d’attente tampon. Si un utilisateur dépasse le débit de base, ses requêtes excédentaires (jusqu’à X) sont acceptées mais traitées au rythme configuré. -
nodelay: Indispensable pour éviter de ralentir artificiellement l’affichage de votre site pour les utilisateurs légitimes. Les requêtes dans la limite duburstsont exécutées immédiatement.