Les bases pour sécuriser WordPress

1. Fermer la REST API WordPress

La première étape consiste à fermer l’accès à l’API pour les utilisateurs non identifiés. Cette API expose la liste des articles, des pages, des utilisateurs et des médias.

Par défaut avec les permaliens configurés sur « Titre de la publication » comme ce blog, l’API est accessible avec l’URL /wp-json/

Sur ce site, pour lister les comptes utilisateurs avec l’API, il faut se rendre sur https://www.dev-wp.fr/wp-json/wp/v2/users. Si vous essayez d’y aller vous aurez un message vous indiquant que c’est réservé aux utilisateurs connectés.

Attention, si vous fermez toute l’API, certains plugin pourront ne plus fonctionner. Par exemple le plugin Contact Form 7 déclare des routes API pour gérer l’enregistrement des messages. Le plugin Soumettre.fr va lui aussi déclarer des routes pour publier des articles.

Voici par exemple le code utilisé sur ce blog pour bloquer l’API sauf pour le plugin Contact Form 7 :

add_filter( 'rest_pre_dispatch', function ( $result, $rest_server, $rest_request ) {
	if ( ! is_user_logged_in() && ! str_starts_with( $rest_request->get_route(), '/contact-form-7/v1/contact-forms/' ) ) {
		return new WP_Error( 'not-logged-in', 'API Requests are only supported for authenticated requests', array( 'status' => 401 ) );
	}
}, 10, 3 );

Ce code fonctionne à partir de PHP 8 car j’utilise la fonction php str_starts_with qui a été implémenté à partir de PHP 8.

Pour des versions php antérieure on peut remplacer cette portion :
! str_starts_with( $rest_request->get_route(), '/contact-form-7/v1/contact-forms/' )
par celle-ci :
( strpos( $rest_request->get_route(), '/contact-form-7/v1/contact-forms/' ) === false )

2. Empêcher l’accès aux dossiers

Si vous n’interdisez pas l’accès aux dossiers, un utilisateur peut accéder sans difficulté au dossier /wp-content/uploads/ qui contient tous les médias de WordPress et parfois les backups.

Pour interdire de lister les fichiers il faut configurer Apache ou NGINX en fonction de ce que vous utilisez.

Voici par exemple le code à ajouter dans votre fichier .htaccess si vous utilisez Apache :

<IfModule mod_autoindex.c>
    Options -Indexes
</IfModule>

3. Empêcher l’accès à la page de connexion

Par défaut avec WordPress, si je rajoute /wp-admin/ ou /login ou /wp-login.php j’arrive sur le formulaire de connexion à l’administration du site.

Pour changer ce comportement, je passe par le plugin WPS Hide Login développé et maintenu par WPServeur

4. Modifier le message d’erreur de connexion

Si l’url de connexion est modifiée, il peut ne pas y avoir d’intérêt à cette manipulation. On peut toutefois l’ajouter s’il y a un accès publique au site.

Par défaut lorsqu’on essaye de se connecter à WordPress, il nous affiche un message d’erreur différent si le compte n’existe pas (login/email) ou si le mot de passe n’est pas bon. Si on a le second message, cela veut dire que l’utilisateur existe.

Modifier ce message n’est pas bien compliqué, voici le code PHP à ajouter :

add_filter('login_errors', function() {
	return "Le couple login / mot de passe n'existe pas.";
});

C’est suffisant, maintenant chaque erreur de connexion renverra ce message, peu importe la raison.

5. Ne pas utiliser le compte admin par défaut

Chaque information, page, utilisateur, est enregistrée en base de données. Et elles ont chacune un identifiant différent. Il est possible de connaître les identifiant des comptes en rajoutant ?author=1 à la fin de l’URL de l’accueil. Ici je veux l’auteur qui a l’identifiant 1. WordPress étant gentil, il redirige automatiquement vers la page auteur de l’utilisateur 1. L’utilisateur qui a l’identifiant 1 est le premier utilisateur créé lors de l’installation du site. Il est donc administrateur.

Imaginons que j’installe WordPress, je créé le premier compte avec le login « administrateur ». Si je tape ?author=1 je suis redirigé vers la page auteur de administrateur dont l’URL sera /author/administrateur/. Super, j’ai maintenant le login du compte.

Cette astuce fonctionne aussi avec author=2, 3, etc. Mais les scripts qui fouillent les sites se concentrent principalement sur l’utilisateur 1, on sait qu’il est administrateur par défaut.

Pour contrer ça facilement ce que j’aime bien faire c’est créer le premier compte avec un login simple comme « admin ». Dès ma première connexion, je créé un second compte plus compliqué et personnel, je lui donne les droits administrateur.

Je me déconnecte, me reconnecte avec ce deuxième compte puis je passe le premier compte qui se nomme « admin » en abonné simple.

Ainsi le compte author=1 existe toujours, il a le login « admin », les scripts ne chercheront pas plus loin. Ils essayerons de ce connecter à celui ci. Et s’ils y arrivent, ne pourront rien faire.

6. Empêcher la redirection author

Pour aller plus loin par rapport à l’astuce précédente, on va empêcher WordPress de rediriger automatiquement vers les pages auteurs. Je n’ai jamais fouillé plus loin, je l’ai toujours désactivé via un plugin SEO : Yoast ou SEOPress

Si on veut fouiller plus loin, WordPress gère maintenant la génération de sitemap.xml pour les moteurs de recherche. Il faudra s’assurer que ce sitemap ne liste pas les URL des pages auteur.

7. Faire les mises à jour

Un conseil évident mais il faut toujours faire les mises à jour des plugins, des thèmes et du cœur de WordPress. Idéalement il faut suivre ces mises à jour. Certaines mises à jour d’extensions apportent des correction de bugs mineurs, ou bien de nouvelles fonctionnalités. La mise à jour est importante lorsqu’il y a la correction d’une faille de sécurité.

8. Faire des sauvegardes

Les sauvegardes ne protègent pas votre site. Seulement, s’il arrivait un problème à votre site, elles peuvent vous permettre de remettre en état tout votre site WordPress. Il y a beaucoup d’extensions WordPress pour faire des sauvegardes. Personnellement j’utilise UpdraftPlus et j’envoie les sauvegardes sur un Google Drive.


Publié

dans

par

Commentaires

Laisser un commentaire

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