WordPress : liste de 25 points de sécurisation.

CMS parmi d’autres, WordPress permet comme les autres de créer et gérer facilement un site web, de le personnaliser à l’extrême, d’y ajouter des tonnes de fonctionnalités.

Bien que ce CMS soit l’un des plus infectés en 2018 sur internet (source Sucuri.net ), c’est aussi l’un des plus répandus, et qui bénéficie de nombreux articles pour le sécuriser.

L’objet de l’article n’est pas de faire la retape de WordPress mais de se concentrer sur les meilleurs moyens pour rendre son installation la plus securisée possible.

Les recommandations ci-dessous ne concernent pas les couches inférieures qui supportent WordPress (environnement virtuel ou physique, OS , moteur PHP,…). Tous ces éléments se doivent d’être à jour, bénéficier des derniers correctifs de sécurité, ne pas être obsolètes (EOL).

Très utile pour vérifier l’efficacité des mesures ci-dessous, quelques sites « d ‘audit » automatiques de votre propre CMS à la seule condition que vous en soyez le gestionnaire, propriétaire ou que vous ayez toutes les autorisations nécessaires (opérateur, hébergeur,…) avant de lancer ces tests.

Effectuer un scan de vos entêtes HTTP et obtenir une note (de A+ à R). L’outil sous licence CC-BY-SA 4 sponsorisé par Sophos.

https://securityheaders.com/

Effectuer un scan gratuit dédié à WP.

https://wpscan.com/

Effectuer un scan gratuit de WP avec un faible impact sur la stabilité de votre site

https://hackertarget.com/wordpress-security-scan/

plus https://firstsiteguide.com/tools/free-fsg/wordpress-security-online-scanner/

….

Toutes les mesures proposées ci-dessous visent à renforcer le niveau de sécurité de WordPress mais peuvent aussi provoquer un crash de votre CMS pour plein de raisons : ne les appliquez que UNE  par UNE , en vous assurant de bien avoir sauvegardé au préalable votre CMS (fichiers + base) avant chaque opération.

Si vous ne savez pas restaurer votre CMS, si votre CMS est en production/critique, abandonnez la lecture de cet article.

1 – règles de bon sens

Avant d’aller plus loin dans les aspects techniques, quelques règles essentielles lors de l’installation du CMS

1.1 Mises à jour AUTO WP

Vérifier que son WordPress soit mis à jour automatiquement : depuis la version 3.7, c’est automatique pour les versions mineures mais vous devrez rester vigilant pour appliquer les mises à jour majeures.

Si les mises à jour sont configurées en manuel, vous recevrez un email prévenant de la mise à disposition de nouvelles versions.

Le paramétrage précis des mises à jour WP se fait dans le fichier wp-config.php, en modifiant sur la valeur de la constante  suivante : 

define( 'WP_AUTO_UPDATE_CORE', true);

Si true, alors toutes les mises à jour sont appliquées automatiquement

Si minor, alors seules les mises à jour mineures sont appliquées

Si false, aucune mise à jour… donc fortement déconseillé (sauf incompatibilité avec un dev spécifique ou un plugin).

1.2 Plugins et Thèmes

Limitez au maximum l’utilisation des Plugins ou des Thèmes sans en justifiant réellement le besoin ou en maitriser la source ou sa conception. Les Plugin notamment sont régulièrement des sources d’introduction de backdoor, de fuite de données, de contournement d’authentification, de collecte d’information personnelle des visiteurs,…

Quelques soient le nombre de plugin ou thèmes installés (le moins possible de préférence), pensez à en faire la mise à jour régulièrement et supprimez ceux qui ne sont pas utilisés (ne pas se limiter à les désactiver).

Les site https://wpvulndb.com/ recense les vulnérabilités connues autour de l’écosystème de WordPress.

1.3 HTTPS

Là aussi, c’est sans doute redondant de dire pourquoi :

  • votre site sera mieux indexé dans les moteurs de recherche
  • tout le trafic réseau et les données entre votre site et le navigateur web seront chiffrées, y compris les authentifications (notamment lorsque vous vous connectez à l’interface d’administration).

La mise en œuvre d’un certificat TLS/SSL ne relève pas de cet article, mais le meilleur conseil serait à minima d’utiliser Let’s Encrypt  gratuit !

Une fois le certificat ajouté, pensez à préciser la nouvelle URL dans WordPress :

Menu Réglages / Général :

1.4 Inscription automatique des visiteurs

Si cette fonction ne présente pas d’intérêt pour votre site web (l’auto inscription des visiteurs), désactivez-là !

Menu Réglages / Général


1.5 Mise à jour des articles par email

Si cette fonctionnalité n’est pas utilisée (et évitez), assurez-vous qu’elle ne soit pas exploitable.

Menu Réglages / Ecriture

1.6 Mots  de passe de BDD et mot de passe du compte d’administration

Là aussi c’est élémentaire, mais prévoyez des mots de passe longs et complexes (12 caractères minimum, avec un mélange de chiffres/lettres/majuscules/minuscules/caractères exotiques,…).

Références :

https://www.cnil.fr/fr/authentification-par-mot-de-passe-les-mesures-de-securite-elementaires
https://www.ssi.gouv.fr/administration/precautions-elementaires/calculer-la-force-dun-mot-de-passe/

1.7 Renommer le compte admin

Par défaut, vous utiliserez le compte ADMIN créé avec l’installation de WP ; autant le changer par un compte qui vous soit propre et inconnu (avant de commencer à publier des articles)

Il faut :

  1. créer un nouvel utilisateur (menu utilisateurs/Ajouter)
  2. ajouter à cet utilisateur avec un rôle Administrateur (en renseignant @mail, mot  de passe complexe,…)
  3. connectez-vous avec ce nouveau compte et cela fonctionne passez à l’étape 4
  4. supprimer le compte nommé ADMIN

En complément : vous pouvez envisager de créer un second compte WordPress qui vous servira à la publication des articles, ainsi le nom de votre compte d’administration ne sera jamais affiché ou associé à vos articles.

1.8 Activer l’authentification double facteur sur votre compte admin.

Complémentaire au 1.7, le mieux pour éviter les attaques par brute force par exemple (ou la connexion à votre WordPress par une personne ayant vos identifiants), c’est de mettre en place une solution d’authentification à double facteur (2FA).

Quelques plugins confortables et fonctionnels:

Une fois installé/configuré ce plugin nécessitera une validation complémentaire de votre mobile (android ou iphone).

Cet article décrit très bien toutes les étapes de configuration :

https://www.cestcalenet.net/index.php/activer-lauthentification-a-deux-facteurs-sur-wordpress/

1.9 Changer le préfixe des tables WordPress

Par défaut, les tables WordPress auront le préfixe wp_xxxx ce qui peut faciliter le travail d’accès aux données.  Renommez soit manuellement les tables (dans la base + fichier de conf, ou mieux en suivant le tuto http://www.responsive-mind.fr/changer-prefixe-tables-wordpress/  ou https://wpchannel.com/wordpress/tutoriels-wordpress/modifier-prefixe-base-donnees-wordpress-installation/ ) ou via un plugin .

 

2 – Configuration de WordPress

Toutes les recommandations ci-dessous s’appliqueront au fichier wp-config.php de votre site web.

2.1 Editeur de thème

Une fonction avancée de WP permet d’éditeur le code du thème installé, dans le principe cela peut être confortable pour le personnaliser, voire y ajouter des fonctions…. mais c’est aussi le meilleur moyen pour qu’une personne malveillante y copie/colle du code mailveillant (trojan, cryptominage,….).

Dans si ce n’est pas utile , désactivez cette fonction dans le fichier wp-config.php an ajoutant les 2 lignes

/* désactiver l'édition de fichiers PHP dans l'editeur WP */
define(‘DISALLOW_FILE_EDIT’,true);

2.2 Désactiver les messages d’erreur

Les rapports ou messages d’erreur WP qui peuvent s’afficher pourraient fournir des informations sur la configuration de votre site web (comme le chemin). Autant les désactiver en ajoutant les 3 lignes :

/* désactiver les messages d'erreurs */
error_reporting(0);
@ini_set(‘display_errors’, 0);

2.3 Ajouter des clefs de chiffrement des mots de passe

Par défaut, vous devriez avoir dans votre fichier wp-config.php les lignes suivantes :

define('AUTH_KEY', 'xxxxxxxxxxxxxx');
define('SECURE_AUTH_KEY', 'xxxxxxxxxxxxxx');
define('LOGGED_IN_KEY', 'xxxxxxxxxxxxxx);
define('NONCE_KEY', 'xxxxxxxxxxxxxx');
define('AUTH_SALT', 'xxxxxxxxxxxxxx');
define('SECURE_AUTH_SALT', 'xxxxxxxxxxxxxx');
define('LOGGED_IN_SALT', 'xxxxxxxxxxxxxx');
define('NONCE_SALT', 'xxxxxxxxxxxxxx');

il est recommandé de changer ces clés/phrases installées par défaut en utilisant le lien https://api.wordpress.org/secret-key/1.1/salt/

A chaque connexion sur cette url, vous aurez une génération auto de nouvelles clés à copier/coller dans votre fichier initial (ceci est un exemple !!!)  :

define('AUTH_KEY',         'S<~`9_x+A_gDnH+A`>AvUk^RB:8#^lHIfGajK`XaX5D_duRq3%IeZw%:]h%R9_D?');
define('SECURE_AUTH_KEY',  'y22z|tV{^&9;a$*4qIQ;Xma|JEotC9?PfIv#*GGPUo;sIiEXeB[ri.Q1Nf=lo[7j');
define('LOGGED_IN_KEY',    'Qg+,+.`rdfi-.EE[F{8w46fh+:u^g|Iu0)_,,RN?8@=1<=mZBoDa_+%1/W#B]^S_');
define('NONCE_KEY',        'F>;U$k4+{97TnP-?4+j[>q8N5%`p>wu-+r{hwxG!QiIj,fUfM-;naYSat|}|j+8_');
define('AUTH_SALT',        '(Z*+z~%h!U`{(ibDPoQfYL4qtZ!G9KaTkAq&+P+[8sZ]}H|Q?Y.T4>RLF`c&n4.L');
define('SECURE_AUTH_SALT', 'j$:&Q$?S2pA-wIY9YZ-BBG`l}LNdC5rt*[x_k[#uQb-4%vk*c!xF2.xRx+BR5&6|');
define('LOGGED_IN_SALT',   '$YQ2P?m.%qgfke]bi(GtW{(xC/rfMBn+zl?9$N@WF$S?Z5BT!n+-a/AK)$#!&bz;');
define('NONCE_SALT',       'kf|=2_g$/W#6nb1A`&]hK4@2[avh1a64YPCgtBK)|V[Y}B#c~|_.<4yd~||Dvmf|');

2.4 Changer l’URL de connexion au portail

La page de connexion ou d’authentification au WordPress est classiquement https:/www…..truc.fr/wp-admin

Le mieux est changer le /wp-admin par un nom improbable  afin d’éviter les tentatives de connexion (même en ayant le bon login et mot de passe).

Le plus simple est d’utiliser un plugin WordPress WPS Hide Login https://wordpress.org/plugins/wps-hide-login/

L’autre solution est d’intervenir dans la configuration du WordPress + le nom du répertoire.

3 – configuration du .htaccess (pour WP)

Toutes les recommandations ci-dessous s’appliqueront au fichier .htaccess de votre site web.

3.1 Blocage de l’accès au fichier wp-config.php

Ce fichier est central dans la configuration de WP, autant le protéger, notamment en ajoutant dans votre fichier .HTACCESS à la racine de votre site web, la directive suivante :

<Files wp-config.php> order allow,deny deny from all </Files>

3.2 Protection contre le XSS / ClickJacking

Le Click Jacking consiste pour un utilisateur malveillant de superposer par exemple un second bouton sur votre propre bouton de formulaire . Autrement dit, la protection consiste à interdire toute inclusion de page issue d’un autre domaine que le domaine courant (référence : https://www.lexsi.com/securityhub/en-tetes-et-vous-comment-ajouter-de-la-protection-dans-ses-echanges/).

Ajouter la ligne  ci-dessous pour s’en protéger :

Header set X-Frame-Options SAMEORIGIN

3.3 Protection contre le XSS / Drive by Download

Cette fois, il s’agit de forcer le type MIME envers le navigateur pour éviter toute mauvaise interprétation du type de données envoyée.

Il faut ajouter la directive :

Header always set X-Content-Type-Options "nosniff"

3.4 Mise en œuvre de HSTS

HSTS est l’acronyme de HTTP Strict Transport Security, spécification de HTTPS qui renforce la communication entre le serveur et le navigateur (sur la politique de sécurité) avant de commencer les échanges en HTTPS.

Une vaste campagne de mise à jour des navigateurs Web consiste à vérifier que HSTS soit activé sur le serveur Web avant d’en autoriser l’accès (ou sinon d’émettre un warning). Par ailleurs, les sites HSTS peuvent aussi bénéficier d’un meilleur référencement dans certains moteurs de recherche.

Il faut ajouter cette ligne :

Header set strict-transport-security "max-age=31536000; includeSubDomains"

 

3.5 Referer Policy

Cette section permet de contrôler la nature des données transmises depuis le navigateur vers le serveur lors d’un click sur un lien.

Header always set Referrer-Policy "same-origin"

3.6 Protection ClickJacking

Cette option est une prévention contre les attaques par clickjacking, lorsque votre site est intégré à une iframe ou une autre page web.

Header always append X-Frame-Options sameorigin

3.7 Stratégie d’accès aux périphériques du navigateur

Cette option précise au navigateur, quels périphériques sont utilisables par le site web (ici, aucun) :

Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"

 

3.8 Désactiver la version PHP

Afficher la version du moteur PHP de votre CMS peut déjà renseigner sur les vulnérabilités existantes liées à votre version PHP, autant la masquer.

Il faut ajouter cette ligne dans le php.ini ou dans l’interface d’admin de votre hébergeur :

/* masquer la version PHP */
expose_php = Off

3.9 Interdire la navigation dans les répertoires de votre site

Cette option essentielle impose de naviguer dans votre site web par les pages et non en explorant le contenu des répertoires (à l’image de l’explorateur Windows ou d’une liste type FTP), dans le .htaccess

/* Interdire la navigation */
Options All -Indexes

4 Supprimer les fichiers inutiles post-installation

4.1 Les fichiers suivants doivent supprimés après l’installation (ou même après une mise à jour du coeur de WordPress)

  • /wp-admin/install.php
  • /readme.html
  • changelog
  • /wp-config-sample.php

 

5 Compléments

5.1 Plugins utiles

Un plugin opensource peut être utile à la protection de l’authentification, il s’agit au choix de

Ces plugins vous permettront de :

  • limiter le nombre de tentatives de connexions avec un mauvais mot de passe,
  • verrouiller automatiquement un compte pendant quelques minutes,
  • masquer les erreurs si le bon login est renseigné avec le mauvais mot de passe.
  • scanner/évaluer la sécurité de votre site web, proposer des actions de sécurité.

4.2  Version WP

Il peut être utile de masquer le numéro de version WP mentionné dans les variables meta renvoyées au navigateur web. Il faut ajouter au fichier functions.php les 2 lignes suivantes :

/* supprimer la version WP*/

 remove_action('wp_head', 'wp_generator');

4.3 Sauvegarde WordPress

La sauvegarde automatique de WordPress passe inévitablement par un plugin (sauf si vous avez la main sur les tâches CRON…) : BackupWordPress est un plugin facile , intuitif qui vous créera un backup par jour, avec un mail de notification pour chaque backup.

Pensez-juste à sauvegarder le fichier de backup généré quotidiennement vers un autre emplacement (en local).

Ponctuellement, avant de grosses mises à jour ou modifications WP : réalisez aussi une sauvegarde via FTP ou SCP de vos fichiers ainsi qu’un DUMP MySQL.

D’autres plugins à évaluer selon votre architecture :

5 Si ca devait arriver.

Il faut prévoir le jour où un chercheur de vulnérabilités  détectera un problème majeur sur votre site, le mieux est alors de prévoir ce cas et de placer  un fichier security.txt placé dans le répertoire /.well-know/ de votre site.

Ce fichier contiendra les éléments qui permettront de vous contacter  rapidement si un incident est détecté sur votre site.

Ce principe est tellement simple qu’il a été soumis à l’examen de la RFC

Pour vous aider à le générer, vous pouvez utiliser ce site :

https://securitytxt.org/

6 Conclusion

Refaites les deux premiers test/scan/audit proposés en début d’article, et vous devriez obtenir des résultats corrects !

2 thoughts on “WordPress : liste de 25 points de sécurisation.”

  1. Bonjour et merci Olivier pour cette check list. Je ne parviens pas à sécuriser les headers HTTP avec le htaccess. Pas de probleme pour la redirection https mais ces lignes là ne sont pas prises en compte :
    # Protections diverses (XSS, clickjacking et MIME-Type sniffing)

    Header set X-XSS-Protection « 1; mode=block »
    Header always append X-Frame-Options SAMEORIGIN
    Header set X-Content-Type-Options: « nosniff”

    J’ai demandé à mon hebergeur, voici la réponse : « Après une investigation plus approfondie, il semble que le problème vienne de WP qui ne prend pas en compte les modifications des headers. Les indications que vous indiquez dans le .htaccess n’ont d’effet que sur le HTML et CSS. »

    Avez-vous une idée pourquoi ça n’est pas pris en compte ?

    Merci

    1. Bonjour,
      Je viens de regarder sur quelques fichiers .htaccess , cela fonctionne bien avec sur 1 hébergeur avec ces 2 lignes :
      Header always set X-Xss-Protection « 1; mode=block »
      Header always set X-Content-Type-Options « nosniff »

      Si vous voulez essayer et me tenir au courant ?
      Bonne journée.

Répondre à Olivier THEBAUD Annuler la réponse

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