Cet article explique comment sécuriser / nettoyer votre site WordPress.
Lisez le entièrement avant de débuter vos modifications s’il vous plaît.

Créer un environnement local

Récupérez tous les fichiers ainsi que la base de données de votre site en ligne.
Pour la base de données vous pouvez utiliser PhPMyAdmin ou encore MySql en ligne de commande :

mysqldump -u user -p base_de_données > dump.sql

Utilisez ensuite un utilitaire tel que Filezilla ou rsync en ligne de commande pour récupérer vos fichiers :

rsync -azv user@111.111.111.111:/home/public_html/ ~/my-project-root/

Une fois les données récupérées, mettez en place un environnement local pour que votre site puisse être accessible localement (via WAMP pour Windows par exemple). Ainsi nous pouvons commencer à travailler sans affecter la version en ligne. Ceci est très important, vous ne devez en aucun cas effectuer ces modifications sur un site en production au risque de perdre des données.

Modifier les mots de passes

Modifier les mots de passes est une étape cruciale si votre site vient de se faire hacker.
Créez autant de nouveaux mots de passes nécessaires avec un gérateur de mot de passe, par exemple avec Norton générator :
https://identitysafe.norton.com/fr/password-generator

Les mots de passes à modifier sont les accès WordPress bien évidement mais aussi l’accès à la base de données qui sont enregistrés dans le fichier wp-config.php ainsi que les accès ftp / sftp, on est jamais trop prudent. N’oubliez surtout pas de mettre à jour votre fichier wp-config.php une fois le mot de passe de l’accès à la base de données modifié.

Mise à jour du Core WordPress

Vous l’avez surement entendu un bon nombre de fois déjà mais cet aspect est tellement crucial que je me dois de vous le répéter : Mettez à jour le Core de WordPress !
Un nombre important de site internet se font piratés à cause de l’ancienneté de la version du Core de WordPress ou de ses plugins, les mises à jour sont la meilleure assurance contre le piratage !

Par mesure de sécurité, si votre site est infecté ne tentez pas de le mettre à jour en local via le Dashboard car si celui ci est infecté, la mise à jour automatique à de forte chance de ne pas supprimer les fichiers infectés c’est pourquoi je vous conseille la mise à jour manuelle.

Téléchargez la dernière version de WordPress sur le site officiel :
https://wordpress.org/download/

Rendez vous ensuite dans le backup local de votre site internet et supprimez les dossiers suivants :

cd ~/my-project-root/
rm -rf wp-admin
rm -rf wp-includes

Décompressez la dernière version de WordPress puis copiez ces 2 dossiers :

  • wp-includes
  • wp-admin

Collez les dans votre dossier de backup local.

Il est très important de supprimer dans un premier temps ces dossiers dans votre backup local avant de faire le copier – coller sinon vous allez simplement écraser les fichiers. Hors si un fichier maliceux à été ajouté dans wp-includes (wp-includes/malwares.php), celui ci ne sera pas supprimé et sera toujours présent après la mise à jour.

Maintenant copiez tous les fichiers à la racine du dossier de la dernière version de WordPress et collez les dans votre backup local excepté ceux-ci :

  • wp-content
  • license.txt
  • readme.html

Les deux derniers fichiers peuvent être utilisé par les pirates pour déterminer la version de votre WordPress.

Mise à jour des plugins

Nous devons faire de même pour les plugins. Pour la même raison cité pour la mise à jour du Core de WordPress, je conseille la mise à jour manuelle. Rendez vous sur ce lien :
htts://wordpress.org/plugins/

Téléchargez chaque plugin manuellement, n’utilisez pas l’interface utilisateur du backend WordPress si votre WordPress a été piraté ! Une fois que c’est fait et que vous avez toutes les dernières versions de vos plugins, supprimez tous les plugins dans votre backup local :

cd ~my-project-root/wp-content/plugins
find . -type f -exec rm -rf "{}" \;

Maintenant, copiez – collez tous vos plugins téléchargés à partir du site officiel WordPress dans votre dossier plugins.

Mettez à jour la base de données

Cette étape peut être nécessaire suivant votre ancienne version de WordPress. Accédez à l’URL suivante dans votre navigateur :
http://www.yoursite.com/wp-admin/upgrade.php

Ensuite, suivez les étapes et actualisez votre base de données.

Vérifiez les droits / permissions

Maintenant, vous devez vous assurer que les fichiers possèdent les bons droits. Trop de droits ouvrent la porte à votre installation WordPress pour les pirates. Réglez vos droits de la façon suivante :

  • /.htaccess 404
  • /wp-config.php 404
  • /index.php 404
  • /wp-blog-header.php 404
  • /wp-admin/ 705
  • /wp-includes/ 705
  • /wp-content/ 705
  • /wp-content/uploads 755

Pour cela utilisez la commande suivante dans un terminal :

cd ~my-project-root
chmod 705 /wp-admin/

Vérification des fichiers index.php

A l’intérieur du dossier wp-content, vous avez plusieurs fichiers index.php, vous devez vérifier que ces fichiers sont vides, ouvrez les avec votre éditeur et vérifiez si l’un d’entre eux comporte du code, si oui, il suffit de le supprimer et d’enregistrer :

  • wp-content/index.php
  • wp-content/plugins/index.php
  • wp-content/themes/index.php

Ces fichiers sont présents afin d’éviter de lister et d’afficher le code de vos répertoires dans un navigateur web.

Modifiez le préfix des tables

Le préfixe des tables est utilisé comme une extension de chaque table dans la base de données générée par WordPress. Dans votre fichiers wp-config.php, changez le préfixe par défaut wp_ pour autre chose. Utilisez quelque chose comme web_wave_wp_ par exemple.

Attention
Si vous modifiez le préfix des tables d’une installation WordPress déjà existante, le site Web ne sera plus accessible ! Vous devez modifier le préfixe des tables dans votre base de données également, pour cela, utilisez ces commandes :

mysql -u user -p base_de_données
RENAME TABLE wp_commentmeta to web_wave_wp_commentmeta;
RENAME TABLE wp_comments to web_wave_wp_comments;
RENAME TABLE wp_links to web_wave_wp_links;
RENAME TABLE wp_options to web_wave_wp_options;
RENAME TABLE wp_postmeta to web_wave_wp_postmeta;
RENAME TABLE wp_posts to web_wave_wp_posts;
RENAME TABLE wp_terms to web_wave_wp_terms;
RENAME TABLE wp_term_relationships to web_wave_wp_term_relationships;
RENAME TABLE wp_term_taxonomy to web_wave_wp_term_taxonomy;
RENAME TABLE wp_usermeta to web_wave_wp_usermeta;
RENAME TABLE wp_users to web_wave_wp_users;
SELECT * FROM web_wave_wp_options WHERE option_name LIKE '%wp_%';
SELECT * FROM web_wave_wp_usermeta WHERE meta_key LIKE '%wp_%';

Utilisez les clés de sécurités

Les clés de sécurités dans WordPress est un élément important à configurer, même lorsque votre wp-config.php en possède déjà, cela ne fera pas de mal de les modifier. Lorsque ces clés sont modifiées, toutes les connexions des utilisateurs sont déconnectées. Il faudra simplement se reconnecter, en utilisant le nom d’utilisateur ainsi que le mot de passe. Visitez le générateur WordPress pour obtenir des clés de sécurités et copiez les :
https://api.wordpress.org/secret-key/1.1/salt/

Collez les nouvelles clés de sécurités dans votre fichier wp-config.php à la place de vos anciennes clés.

Installer un plugin de sécurité

Télécharger et installer un plugin de sécurité est optionnel mais c’est un plus pour pouvoir dormir plus sereinement. Au moment ou je rédige cet article, le plugin le plus populaire est Wordfence.
Vous êtes libre d’en utiliser un autre mais celui-ci est gratuit et vous génère des rapports lorsque quelque chose ne va pas sur votre site Web et vous pouvez également configurer un pare-feu. Voici le lien pour télécharger la dernière version :
https://fr.wordpress.org/plugins/wordfence/

Une fois le plugin installé, rendez vous dans la section firewall pour l’activer au click.
Exécutez ensuite une analyse dans la section scan et corrigez toutes les erreurs trouvées.
La fréquence des rapports générés sont configurables dans les options du plugin.

Vérifiez les fichiers dans votre thème

Si votre thème est unique et fait maison, vous devez vérifier manuellement tous les fichiers à l’intérieur de votre thème. Inspectez les fichiers et recherchez tout code malveillant, supprimez-le si vous trouvez quoi que ce soit.

Si vous avez acheté un thème et que vous ne l’avez jamais modifié, supprimez votre thème et téléchargez la dernière version avec votre licence. Ainsi vous aurez votre thème propre et à jour.

Le fichier .htaccess

Vérifiez les données du htaccess pour voir s’il ya des choses qui ne devraient pas être là. Si vous n’êtes pas sûr, supprimez simplement le contenu du fichier et utilisez le code par defaut de WordPress :

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Attention cependant à bien conserver vos redirections.

Forcer l’utilisation de HTTPS

Pour ajouter cette fonctionnalité, vous devez acheter un certificat ou en créer un avec certbot : https://certbot.eff.org/ (voir l’article sur le sujet). Lorsque vous avez votre certificat SSL en place, modifiez cette valeur à l’intérieur de votre fichier wp-config.php:

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

Et pensez à modifier vos liens en base de données :

mysql -u user -p base_de_données
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://yoursite.com', 'https://yoursite.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.yoursite.com', 'https://www.yoursite.com');
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://yoursite.com', 'https://yoursite.com');
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://www.yoursite.com', 'https://www.yoursite.com');
UPDATE wp_options SET option_value = replace(option_value, 'http://www.yoursite.com', 'https://www.yoursite.com') WHERE option_name = 'home' OR option_name = 'siteurl';

Ajouter la redirection http vers https dans votre fichier htaccess :

RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^yoursite.com [NC]
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]

Pour Nginx:

server {
   listen 80;
   server_name yoursite.com www.yoursite.com;
   return 301 https://yoursite.com$request_uri;
}

Configuration du WordPress

Dans chaque installation de WordPress, il est possible de modifier les fichiers du thème ainsi les fichiers des plugins avec l’éditeur dans l’administration. Cet éditeur est très dangereux s’il se trouve entre de mauvaises mains. Les données peuvent être détruites, du code malicieux peut être ajouté également. Insérez la ligne suivant dans votre fichier wp-config.php pour le désactiver :

define('DISALLOW_FILE_EDIT', true);

La plupart des hébergeurs proposent seulement une connexion FTP à la place du SFTP, mais il arrive que celui-ci puisse vous proposer le protocole FTPS, vous pouvez forcer l’utilisation de FTPS pour le transfert de fichiers, cela chiffrera votre connexion FTP. Si votre serveur le supporte, insérez la ligne suivant dans votre fichier wp-config.php pour l’activer :

define('FTP_SSL', true);

Si vous avez activé le mode de débogage WordPress à des fins de développement, il est essentiel de le désactiver en production. Dans certaines circonstances, un mode de débogage activé peut transmettre des données sensibles qui pourraient aider les pirates à découvrir des failles. C’est pourquoi un mode de débogage activé est extrêmement dangereux. Pour le désactiver, ajoutez dans le fichier wp-config.php :

define('WP_DEBUG', false);

Si, pour une raison quelconque, vous devez activer le mode de débogage, je recommande de désactiver l’affichage public des messages d’erreur. Les messages d’erreur seront affiché seulement aux administrateur du site, c’est l’option la plus sûre :

define('WP_DEBUG_DISPLAY', false);

Déplacer le fichier wp-config.php

Le fichier wp-config.php est le coeur de votre site Wordress. Toutes les données pertinentes, y compris les mots de passe de la base de données, y sont saisies. C’est pourquoi il est impératif de garder ce fichier aussi sûr que possible. Dupliquez votre fichier wp-config.php dans un autre répertoire et modifiez votre fichier wp-config.php :

 define'ABSPATH', dirname__FILE__ ;
 require_once ABSPATH '../path/to/wp-config.php';

Vérifier le dossier uploads

Le dossier uploads est crucial pour le succès d’un nettoyage sous WordPress car il contient toutes les images uploadées ainsi que toutes vos fichiers provenant des formulaires. Ouvrez le dossier et recherchez dans ses sous-dossiers tous les fichiers ayant l’extension .php. Si vous en trouvez, supprimez-les car ils n’ont rien à faire ici. Si un plugin génère un fichier php dans le dossier uploads : il le recréera automatiquement.

Une dernière analyse

Nous ne sommes jamais trop prudent, malgré avoir effectué un scan avec Wordfence, je vous conseille de vous rendre sur le site Sucuri pour analyser et tester votre site :
https://sitecheck.sucuri.net

Une fois l’analyse effectuée, un rapport vous sera affiché, vous indiquant si votre site contient encore du code malicieux. Si oui, recherchez dans les fichiers que le rapport vous indiquera. Si vous ne parvenez pas à éradiquer le code malicieux, le site vous proposer contre un petit montant de le nettoyer pour vous.

Test, test, test, …

Ouvrez votre site Web en mode navigation privée et vérifiez si votre site est correctement affiché. Testez si tous les articles et les pages peuvent être consultés sans aucun problème. Testés vos différentes fonctionnalités ainsi que vos formulaires !

Si vous ne trouvez rien de suspect et que tout fonctionne : toutes mes félicitations, vous avez maintenant un site Web sécurisé et nettoyer sous WordPress !