20 astuces pour sécuriser votre site WordPress

bg5

Il ne faut pas prendre à la légère la sécurité de votre site WordPress. Cet article vous permettra de mettre en place tout une checklist de mesures de sécurité à prendre en compte pour limiter les dégâts potentiels. Car se faire hacker peut arriver à n’importe qui et comme on dit "il vaut mieux prévenir que guérir".

Sachez avant toute chose que rien n'est in-piratable. Le hacker arrivera toujours à ses fins s'il est motivé et qu'il en a les moyens. Le but est donc de le ralentir au maximum afin de le décourager rapidement.

Donc pour débuter, voici 20 recommandations à apporter à votre site WordPress pour éviter au maximum de se faire hacker.

 1. Désactivez la remise à zéro du mot de passe de WordPress

Pour sécuriser votre site WordPress des attaques des hackeurs, une bonne technique consiste à empêcher le changement de mot de passe ou génération de mot de passe depuis un compte utilisateur ainsi que par mail.
En utilisant ce hack, seuls les administrateurs connectés pourront effectuer cette manipulation :

<?php
/*
* Plugin Name: Password Reset Removed
* Description: Removes the ability for non admin users to change/reset their passwords.
* Version: 1.0
* Author: Derek Herman
* Author URI: http://valendesigns.com
*/
class Password_Reset_Removed
{

function __construct()
{
add_filter( 'show_password_fields', array( $this, 'disable' ) );
add_filter( 'allow_password_reset', array( $this, 'disable' ) );
add_filter( 'gettext', array( $this, 'remove' ) );
}

function disable()
{
if ( is_admin() ) {
$userdata = wp_get_current_user();
$user = new WP_User($userdata->ID);
if ( !empty( $user->roles ) && is_array( $user->roles ) && $user->roles[0] == 'administrator' )
return true;
}
return false;
}

function remove($text)
{
return str_replace( array('Lost your password?', 'Lost your password'), '', trim($text, '?') );
}
}

$pass_reset_removed = new Password_Reset_Removed();
?>
Password Reset Removed

Pour l’installer sur votre site WordPress, créez un nouveau dossier que vous nommerez mu-plugins dans le répertoire /wp-content/. Ce dossier présente une particularité propre à WordPress : tous les plugins présents à l’intérieur seront activés d’office, d’où le nom de must-use dans mu-plugins. Le mieux est donc d'utiliser ce dossier pour activer toutes les mesures de sécurité citées dans cet article. Copiez le script PHP dans un nouveau fichier nommé par exemple remove-password-reset.php.

 

2. Tenez le core de WordPress à jour ainsi que les plugins qu'utilise votre site

Le BestPractice de WordPress ne conseille pas que vous touchiez ou modifiez le core de WordPress (dossiers wp-admin et wp-includes) ainsi que la majorité des plugins tierces. Pour surcharger le fonctionnement de WordPress, on a recours à des moyens plus adaptés en utilisant les hook de WordPress, et il en existe des milliers.  La raison est toute simple, lors de la mise à jour du core de WordPress, tous ces fichiers seront écrasés. Or vous serez toujours amené à certains moments à mettre à jour votre version de WordPress car 85% des sites WordPress qui se font hackés sont des sites non à jour depuis des mois voire des années. Chaque mise à jour du core de WordPress apporte des correctifs de sécurité pour palier aux failles de la version précédente. C'est aussi valable pour les plugins. Il faut savoir que WordPress bénéficie d’un système de mise à jour et de réinstallation automatisée.

Liens :

   

3. Utiliser des mots de passe et identifiant forts et sécurisés

Un compte administrateur disposant de privilèges élevés doit avoir un mot de passe d’au moins 8 caractères incluant :

  • Des symboles spéciaux
  •  Des chiffres 

Cela vous évitera de subir des attaques de hackers consistant à tester les mots du dictionnaire. Il en est de même pour le login des utilisateurs du site, surtout les administrateurs. Lors de l'installation de votre site WordPress, évitez d'utiliser des identifiants comme «admin», «administrator», «administrateur», «superadmin» et des mots de passe comme «password», «123456» . Si lors de la phase de développement, vous êtes tentés d'utiliser des login faciles à retenir afin d'aller vite,  lors du déploiement en production, il faut modifier ses identifiants. WordPress bloque nativement le champ identifiant dans le profil de l'utilisateur, pour l'activer pour le profil Administrateur, copiez le code ci-dessous dans le fichier functions.php de votre thème, ou créez un petit mu-plugin avec le script ci-dessous: 

add_action("profile_update", "my_profile_update",5555,2);
function my_profile_update( $user_id, $old_user_data){
      global $wpdb, $current_user;
      if(in_array($current_user->roles[0],array('administrator'))){
	      //test if not exist
	      $user = get_user_by('login',$_POST["user_login"]);
	      if(!$user){
		$sql = $wpdb->prepare("UPDATE {$wpdb->prefix}users SET user_login=%s WHERE ID = %d",$_POST["user_login"], $user_id);
		$wpdb->query($sql);
	      }elseif( $old_user_data->user_login!= $_POST["user_login"]){
		wp_die("L'identifiant ".$_POST["user_login"]." est déjà utilisé.");
	      }
	}
}
add_action('admin_head','my_admin_head');
function my_admin_head(){
	global $current_user;
	if(in_array($current_user->roles[0],array('administrator'))){
		echo "
			jQuery(document).ready(function(){
			    if(jQuery('body').hasClass('profile-php') || jQuery('body').hasClass('user-edit-php')){
				jQuery('#user_login').removeAttr('disabled');
			    }
			})
		";
	}
}
Liens :

 

4. Supprimez le compte ‘admin’ par défaut

Par défaut, WordPress vous propose de créer un compte intitulé admin lors de l’installation. Si vous ne pensez pas à changer cet identifiant commun, un hacker n’aura plus qu’à trouver votre mot de passe.

 

5. Bloquez les requêtes pour obtenir l'identifiant dans l'URL

Par défaut sur WordPress, il est très facile de connaitre le login de l’administrateur ou de n’importe quel utilisateur. Ce n’est pas une faille de sécurité, mais une fonctionnalité de base de WordPress, car nativement on dispose d'une page d'information par auteur.

Le problème est que ça facilite la tâche de l'hacker, il peut facilement connaître l'identifiant des utilisateurs en faisant ?author=1 ( 1 est généralement l'ID du super-administrateur) puis il sera redirigé vers la page de profil de cet auteur (ou la page d'archives par auteur) et provoquer la réécriture d’URL qui donnera votresite.fr/author/admin/ où admin est le login (qui sert d’identifiant unique dans l’url).

Donc il ne lui reste plus qu'à chercher le mot de passe.

Et comme 90% des cas, on n'a pas besoin de page de profil d'utilisateur, je vous conseillerai de l'enlever et de compliquer la tâche aux hackers : Il n’aura à sa disposition ni le login, ni le mot de passe. Si vous avez des inscrits, ou si vous avez fait des comptes à vos clients, il se peut que leur mot de passe ne soit pas très sécurisé et donc facile à craquer.

2 solutions s'offrent donc à vous :

  • Créez dans votre thème un fichier nommé author.php . C’est cette page de template qui est appelée pour l'affichage des informations d’un auteur (voir Template hierarchy)

Dans ce template, écrivez simplement :

<?php
    header('Location: '.home_url('/'));
?>
author.php

Cela vous permet de rediriger vers la page d’accueil de votre site WordPress. 

  • Copiez le code suivant dans le fichier .htaccess à la racine de votre site, avant la section de rewrite de WordPress (avant # BEGIN WordPress)
RewriteEngine On
RewriteRule ^author/(.*)$ http://%{HTTP_HOST} [R,L]

RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule . http://%{HTTP_HOST} [R,L]

 

Seulement il ne faut pas s’arrêter là car votre login admin peut encore être retrouvé en analysant … vos commentaires !
En effet WordPress va rajouter automatiquement une classe comment-author-votrelogin à chacun de vos commentaires.

Pour éviter cela il suffit d’intégrer le petit hack suivant dans le fichier functions.php de votre thème ou dans les mu-plugins:

function remove_comment_author_class( $classes ) {
	foreach( $classes as $key => $class ) {
		if(strstr($class, "comment-author-")) {
			unset( $classes[$key]
 );
		}
	}
	return $classes;
}
add_filter( ‘comment_class’ , ‘remove_comment_author_class’ );

 

Ce n’est pas encore fini ! Car votre login apparaît aussi dans la balise <dc:creator> qui se trouve dans votre flux RSS.

Il n’existe pas de hack pour l’enlever proprement…
Donc vous allez devoir procéder en 3 étapes :

  • Copiez le fichier /wp-includes/feed-rss2.php dans le répertoire de votre thème
  • Editez-le et remplacez la balise <dc:creator><?php the_author() ?></dc:creator> par ce que vous voulez y mettre
    Exemple : <dc:creator><?php echo site_url();  ?></dc:creator>
  • Rajoutez le code suivant dans votre fichier functions.php :
function create_my_custom_feed() {
    load_template( TEMPLATEPATH . ‘/feed-rss2.php’);
}
add_feed(‘rss2′, ‘create_my_custom_feed’);

Et voilà !
Bonne chance pour trouver votre login de connexion maintenant.

 

6. Changer le préfixe de votre base de données

Lorsque vous procédez à l’installation de WordPress, le préfixe attribué à votre base MySQL est wp_ Les hackeurs connaissent ce préfixe et pourront facilement connaitre le nom de vos tables pour tenter des injections SQL, à moins que vous ne changiez ce préfixe. Il est donc recommandé d'utiliser un autre préfixe selon votre site. Si vous n’avez pas prêté attention à ce paramètre, il n’est pas trop tard. Pour ce faire, utilisez le plugin WP Security Scan.

 

7. Bloquez la navigation de vos dossiers WordPress

Par défaut, n’importe qui peut accéder au contenu de vos dossiers comme/wp-content, via un simple navigateur. WordPress stocke vos données multimédias dans un dossier /wp-content/uploads/ qui est accessible en saisissant l’URL dans un navigateur Internet. N’importe quelle personne mal avisée peut donc afficher le contenu de ces répertoires susceptibles de contenir des données personnelles. Pour régler ce problème de sécurité ajoutez le code suivant dans votre fichier .htaccess à la racine de votre site :

Options All -Indexes

 

8. Ajoutez des clés de sécurité secrètes dans le fichier wp-config.php

Lorsque vous déployez votre site en production, il est recommandé de régénérer les clés secrètes dans votre fichier de configuration wp-config.php, un fichier stratégique situé à la racine de votre installation WordPress, contenant vos données de connexion à la base de données MySQL.

Pour régénérer les clés secrètes, allez sur https://api.wordpress.org/secret-key/1.1/salt/ et remplacez vos clés secrètes par les valeurs générées.

Ces clés secrètes auront pour effet de crypter les cookies utilisateur et de renforcer ainsi le niveau de sécurité de votre mot de passe

 

9. Masquez le numéro de version de votre site WordPress et supprimer le fichier readme.html

La version de WordPress est nativement affichée dans le méta generator dans le code source du HTML de votre site :

<meta name="generator" content="WordPress 3.8.5" />

En effet, un éventuel hacker pourrait, grâce à ce numéro connaitre les failles de sécurité du site.

Ajoutez cette ligne dans le fichier functions.php de votre thème :

remove_action('wp_head', 'wp_generator');

Si la présence du meta persiste, vérifiez le fichier header.php de votre thème.

Supprimez la ligne de code suivante :

<meta name=”generator” content=”WordPress <?php bloginfo('version'); ?>” />

 

Il est aussi important de supprimer le fichier readme.html situé à la racine de votre WordPress car il affiche le numéro de version de WordPress.

 

10. Protégez l’accès à wp-config.php via .htaccess

Ouvrez le fichier .htaccess situé à la racine de votre site puis rajoutez la ligne suivante.
Elle empêchera un hacker de récupérer votre identifiant et mot de passe en cas de problèmes avec PHP sur le serveur.

<FilesMatch ^wp-config.php$>
 deny from all
</FilesMatch>

Protégez aussi par la même occasion, votre fichier .htaccess (ce code peut être contenu dans le même .htaccess) :

<Files .htaccess>  
   order allow,deny  
   deny from all  
</Files>

 

Une autre méthode consiste à déplacer votre fichier wp-config.php sur votre serveur à l'endroit de votre choix  (vraiment n'importe où, par exemple dans le répertoire /var/www/config/).  Puis de créer un nouveau fichier wp-config.php vierge à la racine de WordPress (ou au niveau supérieur) et d'y ajouter un appel au fichier wp-config d'origine comme ceci :

<?php
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once('/var/www/conf/wp-config.php');
?>

Ça peut paraître inutile car ce genre de fichier n'est pas lisible et accessible uniquement par PHP, mais si jamais, PHP est désactivé, n'importe qui pourra accéder aux fichiers PHP comme si c'était de vulgaires fichiers texte. Votre wp-config.php dévoilerait alors les mots de passe à la base de données et les clés pour les cookies.

11. Mettez un fichier .htaccess dans le répertoire wp-admin

Pour plus de sécurité, vous pouvez faire une restriction par htaccess sur le dossier wp-admin, ainsi seuls ceux qui sont autorisés auront accès au backoffice de votre site. L'idée est de restreindre l'administration par l'IP de l'utilisateur.

Créez un fichier .htaccess dans le dossier wp-admin et collez le code ci-dessous dans le fichier :

Order deny,allow
deny from all
SetEnvIF X-Forwarded-For "1.2.3.4" AllowIP
SetEnvIF X-Forwarded-For "1.2.3.5" AllowIP
Allow from env=AllowIP
Allow from 1.2.3.4
Allow from 1.2.3.5

Il ne vous reste plus qu'à obtenir la liste des IP de vos clients backoffice.

 

12. Bloquez les nombreuses tentatives de connexion infructueuses

Par défaut, il est possible de tester autant de couples identifiant / mot de passe que vous le souhaitez pour se connecter à votre administration WordPress.

Installez donc le plugin Login LockDown pour restreindre le nombre de tentatives infructueuses pour un certain laps de temps et bloquer l'IP de l'utilisateur au formulaire d'authentification.

Et comme écrit plus haut, le mieux est que vous mettiez ces scripts dans le dossier wp-content/mu-plugins pour qu'ils soient toujours actifs, au cas où quelqu'un les désactiverait dans le backoffice.

2015_02_20_10_02_05_A_PLUS_FINANCE_johary.ranarimanana_netapsys.fr_Mozilla_Thunderbird

13. Masquez les erreurs de connexion

Lors du processus de connexion, WordPress affichera des messages d’erreurs explicites suite à une saisie (le mot de passe/ou l'identifiant est incorrect). Le hacker peut donc facilement savoir ce qui n'est pas correct et refaire les tentatives de login.

Il convient donc de masquer ces erreurs en intervenant dans le fichier functions.php de votre thème WordPress ou de créer un script dans mu-plugins.

Il suffit ensuite de rajouter la ligne de code suivante :

add_filter('login_errors',create_function('$a', "return null;"));

 

14. Effectuez des sauvegardes régulièrement et surveillez les actions dans votre backoffice

S’il n’y avait qu’une seule chose à faire pour sécuriser votre site sous WordPress, c’est d’effectuer des sauvegardes régulières.
Il existe plusieurs plugins pour sauvegarder vos fichiers (répertoire de vos extensions et thèmes WordPress ainsi que les médias de votre site) et votre base de données.
L'extension recommandée est WP-DB-Backup.
Ce plugin sauvegardera votre base à intervalle de temps régulier en vous l’envoyant par mail ou en la stockant sur votre serveur.

Pour surveiller les vas-et viens et d'autres événements et activités de votre backoffice (suppression, modification, etc ... ), il existe des plugins d'audit de votre backoffice comme :

 

15. Evitez d’être victime des SPAM

Les spams ne pourront pas détruire votre système mais si vous ne faites rien vous allez devenir un site potentiellement « attaquable ».
Car quelqu’un de malveillant pourrait se dire que si vous ne vous protégez pas des spams qu’est-ce que cela doit être pour le reste…

Akismet qui est déjà installé par défaut (mais pas activé) sur votre site WordPress peut vous éviter les spams. Il y a d'autres plugin plus performants Spam-Stopper, qui obligent le commentateur à répondre de façon très précise à une question qui lui est posée.

Aussi, si vous n'utilisez pas les commentaires sur votre site, pensez à désactiver les commentaires dans les réglages du site (menu Discussion)

 

16. Vérifiez votre thème.

Certains thèmes contiennent du code inutile voire malveillant. Le plugin gratuit TAC permet de vérifier si votre thème est propre.

 

17. Désactivez l'autocompletion de mots de passe

Ajoutez le code suivant dans le fichier functions.php de votre thème ou créez un script php dans le dossier mu-plugins:

add_action('login_enqueue_scripts', 'kill_autocompletion');

function kill_autocompletion(){

echo '<script type="text/javascript">window.onload=function(){document.getElementById("user_pass").setAttribute("autocomplete","off")};</script>';

}

 

18. Ajoutez un captcha dans le formulaire d'authentification

Il est aussi recommandé de mettre un captcha sur le formulaire de login pour renforcer la protection contre les attaques de type "brute force" faites par des robots.

Liens :

 

19 . Utilisez un scanner de failles de sécurité et un scanner de vos fichiers et base de données

Le plugin WP Security Scan dispose d’outils très pratiques pour identifier vos failles de sécurité. Il vous indiquera notamment le CHMOD recommandé pour vos répertoires.

2015_02_19_18_41_00_WP_Info_La_Carambole_WordPress

Si tout est vert, vos données sont en sécurité. Un point rouge, il vous faut intervenir avec un client FTP.

Le plugin WP Security Scan est un outil gratuit et complet de sécurité qui vous permet de sécuriser votre installation de WordPress et propose des mesures correctives pour:

  • Fixer les permissions de fichiers,
  • La sécurité de la base de données,
  • Cacher les versions de votre site
  • La protection du backoffice WordPress
  • Supprimer les balises META du code de base

Ce plugin vous permet également de changer le préfixe de votre base de données WordPress comme évoqué plus haut et de générer des mots de passe forts.

Il existe aussi des outils de scan des fichiers sur le FTP afin de détecter les codes malware ou backdoor comme le plugin Exploit Scanner qui va scanner non seulement les fichiers mais aussi la base de données.

 

20 . Modifiez le nom de votre dossier wp-content

Si vous utilisez WordPress, vous devez savoir que tous vos thèmes, plugins, images et autres fichiers importants de votre site se trouvent dans le dossier wp-content. Les hackers le savent aussi et vont chercher directement le dossier wp-content. Il peut être utile donc de renommer ce dossier pour ajouter un brin de sécurité supplémentaire.

Ouvrez votre fichier wp-config.php à la racine de votre site. Retrouvez la séquence :

require_once ABSPATH . ‘wp-settings.php’

Puis immédiatement en dessous, ajouter le code suivant :

define ('WP_CONTENT_FOLDERNAME', 'nouveau-dossier');
define ('WP_CONTENT_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ;
define ('WP_CONTENT_URL', 'http://nom-de-domaine'. WP_CONTENT_FOLDERNAME);
define ('WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins');
define ('WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins');

Remplacez nouveau-dossier  selon votre choix, qui va remplacer  wp-content, et la mention votre-domaine avec l'URL de votre site. Une fois ces manipulations faites, vous pourrez changer le nom de votre dossier wp-content avec un nom équivalent (sans majuscule, ni accent, ni espace).
Assurez-vous que tout continue à fonctionner sur votre site, en particulier vos divers plugins. S’il s’avère que vous rencontrez un dysfonctionnement, il est probable qu’un de vos plugin fasse mention au dossier wp-content (un plugin mal développé par exemple), au lieu de faire appel à l'API de WordPress ou les constantes. Vous devrez alors corriger à la main dans les plugin défaillants ou vous vous passerez tout simplement de ces plugins.

Il est bien entendu capital d’ajouter dans ce nouveau dossier, les composants habituels de wp-content, soit /languages /plugin /themes /upgrade, avec leur contenu légitime.

 

Quelques précautions supplémentaires

  • Ne laissez aucune donnée sensible comme l’archive de base de données que certains plugins comme WP-backup stockent dans wp-content  ou des bases de données de développement qui seraient versionnées avec vos fichiers sources. Agir ainsi signifie laisser une réelle porte ouverte au piratage de votre site.
  • Supprimez tous les utilisateurs à fort pouvoir (administrateurs) qui seraient inactifs depuis longtemps sur votre site
  • Les plugins sont parfois truffés de failles de sécurité. Donc autant que possible, limitez le nombre de plug-ins installés et dès que vous en désactivez un SUPPRIMEZ LE ! Car même inactifs certains plugins mal codés peuvent fragiliser votre installation.

12 commentaires

  1. Merci pour ce superbe article complet et bien écrit …
    Pour les sites worpress hébérgé chez OVH il y a un petit de compatibilité avec l extension Acunix je vous recommande soit Itheme security soit Wordfence pour sécuriser facilement votre site web.

  2. Bonjour,
    Vous dite créer un Dossier nommer « mu-plugins » dans le répertoire /wp-content/. faut il créer un dossier must-use dans le dossier « mu-plugins »

  3. Bonjour,

    Non, juste le dossier mu-plugins. WordPress cherchera ce dossier et activera directement tous les fichiers qui sont dedans. Donc vous y mettez directement votre fichier script (ex : wp-content/mu-plugins/mon-script-de-securite.php) ou si c’est un plugin, vous mettez directement le dossier du plugin (ex : wp-content/mu-plugins/mon-plugin-de-securite)

  4. Merci beaucoup pour cet article complet et très utile !
    J’ai (presque) tout mis en place et ça fait plaisir de savoir que mon site est plus en sécrité.

    Juste un détail : en mettant en place l’astuce #5 et la fonction « function create_my_custom_feed », je me retrouve avec une erreur » in_array() expects parameter 2 to be array, null given » dans ma page rewrite.php, à la fonction « function add_feed($feedname, $function) ». Mais c’est peut-être un souci avec mon thème…

  5. Bonjour,
    Merci pour tout ces conseils, par contre chez moi le plugin pour bloquer le renouvellement de mot de passe ne fonctionne pas.
    Avez-vous une idée ?
    J’ai bien respecté : wp-content/mu-plugins/mon-script-de-securite.php
    Par avance, merci.

  6. Bonjour,
    L’astuce n°5 : fonction pour retirer la class sur le login-author dans les commentaires ne fonctionne pas ! Une idée pour y remédier ?

  7. Bonjour je suppose que la modification du fichier wp-content doit se faire dès les premiers jours de la création du site web sinon j’utilise item security ou wordforce security
    et j ai modifié l’adresse accès à la console d’administration

  8. Super article, il y a une extension sécurité gratuite qui en fait pas mal à ce niveaux.
    Stopper l’énumération, cache la version, modification message d’erreur login, protection des fichiers sensibles, géolocalisation etc…
    voici le lien, elle est sur wordpress :
    https://wordpress.org/plugins/carla/
    ça peut aider les gens qui veulent pas trop se mettre dans le code.

Laisser un commentaire

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

Captcha *