Sécurité WP : sécuriser wp-admin | changer l'URL de connexion · limiter les connexions · XML-RPC

La sécurité de wp-admin regroupe les réglages qui bloquent les attaques par force brute visant l'administration et l'écran de connexion de WordPress. En vérifiant les journaux d'accès d'un serveur Nginx + Apache qui fait tourner plusieurs sites WordPress, j'ai vu que des requêtes automatiques continuaient d'arriver sur xmlrpc.php même après le changement de l'adresse de connexion : j'ai donc ajouté une limitation de débit côté serveur.
1️⃣ Pourquoi wp-admin et wp-login.php sont attaqués
Le fait que l'adresse d'administration de WordPress soit connue est une faiblesse, mais on peut la compenser en renforçant la sécurité. Tous les sites WordPress utilisent les mêmes /wp-admin/ et [wp-login.php], et ouvrir /wp-admin/ sans être connecté redirige vers l'écran de connexion [wp-login.php].
Les attaques arrivent par force brute : on essaie sans cesse des noms d'utilisateur et des mots de passe sur cet écran de connexion. La sécurité de wp-admin consiste donc d'abord à bloquer les tentatives de connexion, avant même de masquer l'adresse.
2️⃣ Ce que change le changement d'adresse de connexion, et ses limites
Quand une extension de sécurité change l'adresse de connexion, le [wp-login.php] par défaut renvoie une erreur 404 : les attaques automatiques qui frappent l'adresse par défaut n'atteignent plus l'écran de connexion. Il faut communiquer la nouvelle adresse aux personnes qui ont un compte administrateur.
Cette méthode demande peu d'efforts, mais si vous oubliez la nouvelle adresse, vous ne pouvez plus entrer dans l'administration : il faut alors désactiver l'extension en renommant son dossier par FTP ou dans le gestionnaire de fichiers. Pour un site géré par plusieurs personnes, mieux vaut noter l'adresse à un seul endroit.
3️⃣ Limiter les tentatives de connexion et l'authentification à deux facteurs
Même avec une nouvelle adresse de connexion, les tentatives pour deviner le mot de passe continuent dès que la nouvelle adresse est connue. Le cœur de WordPress ne limite pas le nombre d'échecs de connexion : on peut saisir un mauvais mot de passe autant de fois qu'on veut, le même écran de connexion se rouvre.
Une extension de limitation des tentatives de connexion bloque pendant un certain temps une IP qui dépasse le nombre autorisé, et l'authentification à deux facteurs demande en plus le code de l'application d'authentification du téléphone, même si le mot de passe est correct. En activant l'authentification à deux facteurs, conservez aussi les codes de secours à utiliser en cas de perte du téléphone.
4️⃣ Fermer xmlrpc.php
[xmlrpc.php] est une deuxième entrée qui accepte nom d'utilisateur et mot de passe sans passer par l'écran de connexion, et la méthode [system.multicall] permet d'essayer plusieurs mots de passe en une seule requête.
D'après les journaux d'accès d'un serveur Nginx + Apache qui fait tourner plusieurs sites WordPress, 2 250 requêtes POST sont arrivées sur [xmlrpc.php] le 13 octobre entre minuit et 9 h 50. Elles venaient de 22 IP, avec des User-Agent qui se faisaient passer pour Jetpack et WordPress.com.
Si vous n'utilisez ni l'application mobile WordPress ni Jetpack, bloquez les requêtes à [xmlrpc.php] dans la configuration de Nginx, ou utilisez le réglage de désactivation de XML-RPC d'une extension de sécurité.
# Dans le bloc server — refuser les requêtes vers xmlrpc.php
location = /xmlrpc.php {
deny all;
}Avec ce réglage, toutes les requêtes GET et POST vers [xmlrpc.php] se terminent en 403 sans atteindre PHP. La désactivation de XML-RPC d'une extension de sécurité ne refuse que les requêtes qui demandent une connexion et le fichier continue de répondre : pour réduire aussi l'exécution de PHP, mieux vaut bloquer dans Nginx.
5️⃣ Bloquer sur le serveur : limiter l'accès admin par IP et limitation de débit
Si vous administrez uniquement depuis une IP fixe, le plus sûr est de n'autoriser que cette IP pour [wp-login.php] et /wp-admin/ dans Nginx. Cela ne convient pas si l'IP de votre domicile ou de votre bureau change souvent.
On pourrait croire qu'il suffit de bloquer tout /wp-admin/, mais des fonctions côté visiteurs comme la recherche ou le panier envoient souvent des requêtes à [admin-ajax.php] : ce fichier doit rester ouvert.
# Dans le bloc server — au-dessus du location PHP
location = /wp-login.php {
allow 203.0.113.10; # Votre IP fixe d'administration
deny all;
# Recopiez ci-dessous la configuration de votre location PHP
}Depuis une IP non autorisée, [wp-login.php] renvoie un 403, et depuis l'IP autorisée, l'écran de connexion s'ouvre. Dans la location, il faut reprendre tels quels les réglages de traitement PHP du site (fastcgi_pass, etc.) pour que l'écran de connexion fonctionne normalement.
Si vous ne pouvez pas fixer l'IP, il reste la limitation de débit des requêtes PHP des visiteurs non connectés ; pour la façon de limiter à 30 par minute afin que les requêtes automatiques n'accaparent pas les ressources du serveur, voir l'article avertissement php-fpm max_children qui y est consacré.
# Bloc http — compter par IP uniquement les requêtes sans cookie de connexion
map $http_cookie $php_anon_key {
default $binary_remote_addr;
"~*wordpress_logged_in" "";
}
limit_req_zone $php_anon_key zone=php_anon:10m rate=30r/m;
# Dans le location PHP
limit_req zone=php_anon burst=60 nodelay;
limit_req_status 429;Quand une IP non connectée envoie des requêtes PHP à la suite, elles sont traitées jusqu'à la 61e, puis une 429 est renvoyée ; les requêtes avec un cookie de connexion ne sont pas comptées. Si le cache de pages répond sans passer par PHP, la consultation des pages par les visiteurs ordinaires n'est pas touchée par cette limite.
Extension de sécurité
Les 5 meilleures extensions de sécurité WordPress
Un tableau comparatif des cinq principales extensions de sécurité.
Connexion
Réinitialiser un mot de passe d'administration oublié
Comment changer votre mot de passe dans le profil et le réinitialiser si vous l'avez oublié.
Outils
Générateur de mots de passe aléatoires
Un outil qui génère des mots de passe de 6 à 30 caractères en combinant majuscules, minuscules, chiffres et caractères spéciaux.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.