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

Mention d'affiliation v3.1
Mention d'affiliation v3.2 (mobile)

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.

Les deux entrées de la connexion WordPress
Accès par le navigateur
/wp-admin/
Sans connexion, redirection vers l'écran de connexion (302)
wp-login.php
Écran de connexion · saisie du nom d'utilisateur et du mot de passe
Applications · requêtes automatiques
xmlrpc.php
Envoie le nom d'utilisateur et le mot de passe par une requête POST, sans écran de connexion
Ne passe pas par l'écran de connexion
system.multicall essaie plusieurs mots de passe en une requête · l'adresse reste la même même si l'on change l'adresse de connexion
Même vérification du nom d'utilisateur et du mot de passe
Les deux entrées vérifient le compte avec la même fonction d'authentification de WordPress
Les attaques par force brute passent par l'entrée qui est ouverte. Le changement d'adresse de connexion ne s'applique qu'à l'entrée du haut : xmlrpc.php se ferme donc à part, ou on limite le nombre de requêtes.

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.

🧭 Les entrées de la connexion WordPress
Schéma explicatif
⬜ Sans extension
🛡️ Hide My WP
🚪 Entrée de connexion
/wp-login.php · /wp-admin/La même adresse pour tous les WordPress
Écran de connexion404
/newloginAdresse modifiée · connue des seuls administrateurs
Écran de connexion
POST /xmlrpc.phpVérifie le mot de passe sans écran de connexion
Répond à la vérification du mot de passeDésactivé 405
Mesuré sur un site de test · requêtes sans connexion
→
🤖 Attaques automatiques
Entrées où l'on peut essayer des mots de passe par une adresse connue
2
1
Aucune
Sans extension, on peut essayer des mots de passe à deux endroits : le [wp-login.php] identique à tous les sites WordPress, et [xmlrpc.php], qui vérifie le mot de passe sans écran de connexion.
Après le changement d'adresse de connexion, [wp-login.php] et /wp-admin/ renvoient une 404, mais [xmlrpc.php] répond toujours si le nom d'utilisateur et le mot de passe sont corrects.
En désactivant aussi XML-RPC, les requêtes de connexion à [xmlrpc.php] se terminent par une réponse indiquant que le service XML-RPC est désactivé : on ne peut plus essayer de mots de passe par une adresse connue.

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.

🧭 Limiter les tentatives de connexion et authentification à deux facteurs
Schéma explicatif
⬜ Sans extension
🛡️ Extension de sécurité
🔑 Connexions depuis la même IP
1reMauvais mot de passe
Écran de connexion à nouveauEncore 3
2eMauvais mot de passe
Écran de connexion à nouveauEncore 2
3eMauvais mot de passe
Écran de connexion à nouveauEncore 1
4eMauvais mot de passe
Écran de connexion à nouveauBloqué 20 min
5eBloquéMauvais mot de passeRequêtes de connexion · XML-RPC
Écran de connexion à nouveauxmlrpc.php aussi en 403
Saisie du mot de passeBon mot de passe
Écran de saisie du code
Authentication Code6 chiffres de l'application d'authentification · change toutes les 30 s
Administration
Attaquant qui ne connaît que le mot de passeNe connaît pas le code
Bloqué à l'écran du code
Mesuré sur un site de test · requêtes successives depuis la même IP
→
🤖 Attaques automatiques
Peut-on continuer à essayer des mots de passe ?
Aucune limite
Bloqué à la 4e
Arrêté au code
Sans extension, même après six mauvais mots de passe depuis la même IP, le même écran de connexion se rouvre à chaque fois.
Avec la limitation des tentatives, le nombre d'essais restants s'affiche à chaque échec, et au 4e échec, cette IP ne peut plus se connecter pendant 20 minutes. Pendant le blocage, les requêtes à xmlrpc.php se terminent aussi en 403.
Avec l'authentification à deux facteurs, même avec le bon mot de passe, l'administration ne s'ouvre qu'après la saisie du [Authentication Code] à 6 chiffres que l'application d'authentification génère toutes les 30 secondes.

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.

ℹ️ 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 1   +   10   =