Sécurisez WordPress

Article écrit par tuxonaute et repris ici avec son aimable autorisation 😉

Etat actuel : En cours de construction

1 – Bien installer WordPress

Ne pas suivre toutes les étapes de l’installation standard pour perturber les attaques automatiques.
– changer le préfixe des tables dans la BDD. Ne pas utiliser wp_
– ne pas créer d’utilisateur admin
– choisir des mots de passe différents pour chaque utilisateur et respectant la règle : 8 caractères, au moins une majuscule, une minuscule, un chiffre et un caractère spécial
– créer un second utilisateur avec les droits d’administrateur et passer le premier utilisateur en « aucun droit ». La majorité des attaques se font sur l’id 1.

2 – Cacher la version de WordPress

Connaître la version permet de chercher quelles failles existent et quels exploits on peut utiliser, en consultant les sites qui recensent ce genre de défaut.
En cas d’oubli de mise à jour, cela peut ralentir une attaque.

Pour cela, on peut bloquer l’accès au fichier readme.html (voire le supprimer).
*** procédure à indiquer pour Apache et Nginx

On peut également installer l’extension Hide WordPress Version qui supprimera notamment les balises meta trop bavardes.

3 – Bloquer l’énumération des utilisateurs

Lorsque vous accédez à l’url suivante : http://votresite.com/?author=1 et que cela vous redirige vers http://votresite.com/author/admin :-), alors vous êtes vulnérables à l’énumération d’utilisateurs. L’inconvénient de cette fonctionnalité, c’est qu’il est possible d’énumérer la totalité des utilisateurs et de cibler une attaque par force brute sur un utilisateur en particulier (par exemple).
Il est possible que certains thèmes ne possèdent pas ou plus cette fonctionnalité. C’est une bonne chose, mais on n’est pas à l’abri d’une mise à jour ou tout simplement que vous changiez de thème un jour ! Il y a donc une solution qui marche très bien, ça se passe du côté de votre .htaccess :

# Redirection contre l'énumération d'utilisateurs
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ /? [L,R=301]

4 – Bloquons l’édition/l’installation des thèmes et extensions dans le panneau d’administration

Dans wp-config.php :

define('DISALLOW_FILE_EDIT', true); // on bloque l'édition des thèmes/extensions
define('DISALLOW_FILE_MODS', true); // on bloque l'installation des thèmes/extensions

Notez que la dernière ligne empêche également d’accéder au menu « Mise à jour » du Tableau de bord. Elle empêche également toute mise à jour automatique de WordPress !

5 – Protégeons les cookies

Si vous vous trouvez sur le même réseau qu’un attaquant (WiFi, LAN filaire…), celui-ci peut intercepter vos données grâce à l’attaque – malheureusement très populaire – dite Man In The Middle.
Lorsque vous vous connectez à votre WordPress, vous générez un cookie. Ce cookie permettra entre autres à ce que vous puissiez naviguer sur toutes vos pages sans vous reconnecter. Il sera donc envoyé au site WordPress à chaque fois que vous chargerez une page.
Si une personne malveillante se trouve sur le même réseau que vous, il pourra intercepter ce cookie qu’il installera sur sa machine et aura donc les mêmes accès que vous (votre compte !).
Il est possible de « chiffrer » certaines informations de ces cookies – depuis la version 2.6 – grâce à des clés secrètes configurées dans le fichier wp-config.php et ainsi rendre ces fameux cookies difficilement exploitables – voire inutilisables – par l’attaquant ! Plus d’informations sur ces cookies ici.
Ajoutons donc ces fameuses clés !
Tout d’abord, il faut cliquer sur http://api.wordpress.org/secret-key/1.1/salt.
Une fois cliqué, vos clés seront générées aléatoirement. Copiez-les et collez-les dans wp-config.php. Si elles existent déjà, remplacez-les (vous serez déconnectés) :
// NE COPIEZ PAS CE CODE ! GÉNÉREZ LE VÔTRE EN CLIQUANT SUR LE LIEN !

define('AUTH_KEY','AvU9-s|1m+a9Pq8gdEet6BB-@.{^^>L[HTE#H>6~3m5#&^h[{y1J}nr(a`Vh^m},');
define('SECURE_AUTH_KEY','vpZIh~j1T6)G3N ouj*50oJ0d*-@IcA7m,vM6&FXEE7r0LY=p%,[{%C8-xu=3i*-');
define('LOGGED_IN_KEY','_fX(3J>$@E*t^MR`<k.FC6n0nr6Kuj30J<u#@!la/;:!@>4qTE93FR/y7W3}W-z$');
define('NONCE_KEY','DMX{v1:eQ-i7Q-.oU>ef|]{`2QBc)=_=cA@JIjz_]E[;UQD+<MILEd!vnOT/6C_h');
define('AUTH_SALT','G0aUwd3Qg{+m<WfKWD*DkVq]OJXqX(s~Y`(/!%Z+b+(|p+Ysz2*%M>g+*SL8AW+i');
define('SECURE_AUTH_SALT','Ky1GSY<[.-gI&2x|<j90jZ-MuIsOc9)|-}#}AjM3;&=Y&k0u0');
define('NONCE_SALT','!Ur:JKQ]uA7CL; BJA(vfpwI:#x9Vy&@AU%f-ayUzbv#O^9H/9*hd>[tvT{pA)!4');

Cette parade a ses limites. Si vous venez de vous connecter à votre WordPress et que l’attaquant est déjà en train de « sniffer », il récupèrera vos identifiants à défaut de pouvoir récupérer votre cookie. Les parades possibles contre cela seront l’utilisation de SSL pour vos connexions HTTP (soit HTTPS) ou encore l’utilisation d’un VPN. Il existe néanmoins deux solutions moins lourdes à mettre en place, ci-après.
Pour protéger la procédure d’authentification (quand on entre les identifiants et mots de passe), il existe deux extensions très intéressantes sans passer par HTTPS – que l’on ait un dédié (Semisecure Login Reimagined) ou un mutualisé (Semisecure Login). Ce dernier est moins fiable, car utilisant le MD5. Je vous renvoie à l’article de Mr Xhark en commentaire en bas de page ou directement sur http://blogmotion.fr/internet/securite/securite-formulaire-connexion-3911 en milieu d’article.

6 – Mises à jour

WordPress se met à jour automatiquement depuis la version 3.7. Toutefois, par défaut, ces mises à jour ne sont que mineures (i.e bugs, traductions et sécurité). Une alerte vous sera par contre envoyée par e-mail en cas de nouvelle version disponible (par exemple passage de la 3.9 à la 4.0).
Si vous souhaitez que tout soit automatique (mises à jour mineures, majeures, thèmes, extensions…), alors je vous renvoie à la documentation officielle et très détaillée ICI, en voici un extrait (fichier wp-config.php) :

// Mises à jour automatiques de WordPress (développements, mineures, majeures)
define('WP_AUTO_UPDATE_CORE', true);

// Rajouter aux mises à jour par défaut (mineures), les mises à jour majeures
add_filter('allow_major_auto_core_updates', '__return_true');

// Mises à jour automatiques des extensions
add_filter('auto_update_plugin', '__return_true');

// Mises à jour automatiques des thèmes
add_filter('auto_update_theme', '__return_true');

Tout n’est pas à mettre, à vous de faire votre choix. Attention à coller les lignes choisies tout à la fin de votre fichier wp-config.php (voir documentation).
Pour les thèmes et les extensions, si vous ne souhaitez pas mettre à jour automatiquement mais que vous souhaitez toutefois être alertés, alors vous pouvez vous servir d’une extension comme Update Notifier qui vous alertera par e-mail des nouvelles mises à jour disponibles.

7 – Extensions en vrac

Block Bad Queries Contre les URLs suspectes. Un peu trop sensible. À tester !
Hide WordPress Version Pour cacher le numéro de version de WordPress (cité plus haut)
Exif-Remove Pour supprimer les données Exif de vos photos/images automatiquement à l’upload
Login LockDown Pour bloquer les tentatives d’identification par force brute dans /wp-login
gotlms Pour scanner vos répertoires WordPress à la recherche d’éventuelles backdoors
Update Notifier Pour recevoir une notification lors de nouvelles mises à jour disponibles (cité plus haut)
Google Authenticator Pour l’authentification forte (Plus d’infos ici)
iThemes Security Pour sécuriser votre WordPress. Il est par exemple possible de recevoir des alertes e-mail lorsque des fichiers sont modifiés à votre insu.

8 – Quelques règles d’hygiène élémentaires

Si votre site tourne sous Apache, je vous conseille vivement d’interdire le listing des répertoires en éditant votre fichier .htaccess :

# On interdit le listing des répertoires !
Options -Indexes

Concernant les thèmes et les extensions, il est fortement recommandé de les télécharger sur les sites officiels ICI ou encore LÀ. Vous pouvez les télécharger sur les sites des auteurs s’ils sont recensés sur les sites officiels bien entendu. Désactivez également les thèmes ou extensions que vous n’utilisez pas, c’est toujours bien !
N’utilisez pas le même identifiant et/ou mot de passe pour votre WordPress, vos e-mails, vos comptes bancaires…
Restreindre les permissions de certains fichiers (notamment .htaccess)
Cachez certains dossiers à la vue des moteurs de recherche dans le fichier robots.txt
FAITES DES SAUVEGARDES !!!
Ne stockez pas les sauvegardes de bases de données ou des fichiers contenant des mots de passe dans un sous-dossier de WordPress (faites-le localement sur votre machine ou sur un serveur dédié aux sauvegardes sécurisées)

9 – Limitons les attaques automatiques à l’aide d’un CDN

Même si certains hébergeurs intègrent par défaut des solutions anti-ddos ou anti-scanneurs, vous pouvez rajouter une couche de sécurité grâce à des CDN tels que CloudFlare.
Les CDN ne servent pas à ça principalement, mais c’est un avantage qu’offre cette solution.

10 – Pirate-toi toi-même (bonus)

Si vous êtes curieux et/ou sceptiques, vous pouvez mettre en exergue une partie des failles ou faiblesses potentielles qui touchent votre installation WordPress. Je vous propose ici un script en particulier qui scanne de façon automatique votre installation WordPress. Ce script est massivement utilisé par la communauté des hackers – qu’ils soient bien intentionnés, mal intentionnés ou les deux. Il s’agit de WPScan. C’est un scanneur de vulnérabilité dit de boîte noire. Vous le trouverez en suivant ce lien.
Bien entendu, il sera plus intéressant de lancer ce script AVANT d’appliquer les conseils de ce billet !

Conclusion

Les conseils prodigués ici ne sont ni exhaustifs, ni tous absolument nécessaires. À vous de vous faire une opinion sur la nécessité ou non de telle ou telle mesure.
Il existe bien entendu beaucoup d’autres mesures de restriction d’accès (notamment via .htaccess) ou encore de détection d’attaques – si vous possédez par exemple un serveur dédié (suricata, fail2ban…). Je me suis volontairement limité ici à l’utilisateur néophyte/intermédiaire possédant un hébergement mutualisé et souhaitant malgré tout naviguer sur son WordPress sans trop de contraintes. Peut-être que cela fera l’objet d’un prochain billet plus technique et parano.
Gardez toutefois en mémoire qu’en sécurité informatique, le zèle n’est jamais un excès.