Une page de connexion sans limite peut être essayée aussi vite que le réseau le permet. Une limite ne rend pas fort un mot de passe faible ; elle fait que deviner prend plus de temps que quiconque n'acceptera d'attendre, ce qui revient en pratique au même.

Au niveau du serveur web

limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

location = /wp-login.php {
    limit_req zone=login burst=3 nodelay;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Cinq par minute avec une rafale de trois : personne ne tape plus vite, et une machine est arrêtée net. Faites-le au serveur, pas dans l'application - une requête refusée ici n'atteint jamais PHP.

L'observer avant de l'imposer

grep -c "limiting requests" /var/log/nginx/error.log
Une limite réglée trop bas bloque de vraies personnes, et elles ne le signalent pas : elles partent. Observez le journal une semaine à un débit généreux avant de resserrer.

Bannir les récidivistes

# /etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 3600

Ce qu'une limite ne fait pas

  • Elle n'arrête pas une tentative répartie sur mille adresses, chacune essayant deux fois.
  • Elle ne sert à rien si le mot de passe a déjà fuité : l'attaquant n'a besoin que d'une tentative.
La double authentification rend la limitation presque inutile, et la limitation ne rend pas la double authentification inutile. Si vous n'en faites qu'une, faites la double authentification.