WordPress
Fermer XML-RPC et protéger wp-login.php au niveau de nginx
Dans les journaux d’un site WordPress, deux adresses reçoivent à elles seules une bonne part des attaques : xmlrpc.php et wp-login.php. Les extensions de sécurité savent les protéger, mais elles le font en PHP, donc après que chaque tentative a déjà coûté une exécution. Traiter le problème dans nginx, c’est l’arrêter avant.
# Contexte http : 6 requêtes par minute et par adresse IP
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=6r/m;
Le piège classique : un bloc location = /wp-login.php prend la main sur le bloc générique \.php$, il doit donc contenir lui aussi le passage à PHP-FPM, sinon la page de connexion est téléchargée au lieu d’être exécutée. Avant de fermer XML-RPC, vérifiez qu’aucun service ne s’en sert : application mobile, publication à distance, certaines extensions. Couplé à fail2ban sur les réponses 429, ce réglage fait disparaître l’essentiel du bruit.
# Bloc server du site
# XML-RPC : inutile sans application mobile WordPress ni Jetpack
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
# Connexion : au-delà du rythme autorisé, réponse 429
location = /wp-login.php {
limit_req zone=wplogin burst=3 nodelay;
limit_req_status 429;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
Sources
- nginx, module ngx_http_limit_req_module nginx.org
- WordPress, renforcer la sécurité developer.wordpress.org