Après la petite frayeur liée à la faille de WordPress 2.8.3, je me suis décidé à travailler sur la sécurité de mon blog.
J’ai effectué quelques recherches sur Internet, pour connaître les règles de sécurisation de base. Je vous en livre ici les principales
- This post is available in english: 15 rules to secure WordPress
Première étape: la sauvegarde
Dans l’absolu, l’accès frauduleux à un blog n’est pas une catastrophe en soit. En cas de problème, il suffit en effet de tout effacer, de changer tous les mots de passe, et de repartir de la dernière sauvegarde, … à condition d’en avoir fait une.
La sauvegarde est un point essentiel de la sécurisation d’un blog. Si vous perdez des informations, à cause d’une attaque, ou simplement d’une erreur de manipulation, la sauvegarde est le dernier recours.
Deux catégories de données à sauvegarder:
- la base de données,
- les fichiers: les images, et pièces jointes accompagnant les articles, ainsi que le thème, les plugins, et le moteur WP lui-même.
Je vous renvoie à l’article que j’avais consacré à ce sujet en octobre 2008.
Sécuriser WordPress
Au niveau de WordPress
Il existe quelques règles assez répandues, mais plus ou moins faciles à utiliser, selon que l’on souhaite les appliquer sur un blog en cours d’installation, ou un blog déjà fonctionnel.
- Garder WordPress à jour: Les failles des anciennes versions sont connues, et peuvent donc être facilement exploitées. Etre à jour vous permet déjà de ne pas subir d’attaques pour des failles connues,
- Garder vos plugins à jour. Ce point est plus discutable, parce que rien ne garanti que la nouvelle version d’un plugin soit plus sûre que la version précédente. Néanmoins, si un plugin annonce une mise à jour de sécurité, il est important de l’appliquer.
- Utiliser les clés de sécurité: Le fichier
wp-config.php
contient quatre clés de sécurité, qui sont proposées vides par défaut. Vous pouvez les compléter très facilement grâce à un service de WordPress. Il suffit en effet de copier/coller les clés données par ce service, dans le fichierwp-config.php
. Par exemple:define('AUTH_KEY', '&E4_G @;`rOToF~%cLUlOrcUzp>MIXX-Opg~-#),p,Z=q!%Jx%Yn[lvUD:t`1H~s'); define('SECURE_AUTH_KEY', 'Vh*|99*eBYtd7$2(QFMm3{[c@KXfVpV.Nz_V)9{YMnyRi=M)5Zva/|z/iqs|v7|-'); define('LOGGED_IN_KEY', 'p#TGC@adpPQ{ ~$-;EO1v~#}c(%Rjq(8xsUFecS]tm4ptH2H4pSrT|0NiW$i.=|i'); define('NONCE_KEY', '`lMlz,i#-T}31eG9&&yR;56uk(N(]t~@m-~L-y+viIQG% fS~Da3hRMDAhv@w|O@');
- Changer le préfixe des tables: Dans sa configuration standard, WordPress ajoute le préfixe
wp_
devant le nom de chaque table. Pour brouiller les pistes, modifiez-le. Il suffit pour cela de modifier, pendant l’installation, le fichierwp-config.php
, à la ligne suivante:$table_prefix = 'wp_5a8f4B_'; // 'wp_';
Attention: Si votre blog est déjà installé, il faut également renommer toutes les tables du blog.
- Cacher la version de WordPress: La version de WordPress peut être une bonne indication pour une personne malveillante. Par défaut, WordPress crée une méta balise dans l’entête de vos pages, du type
<meta name="generator" content="WordPress 2.8.4" />
Un moyen simple de la supprimer, est d’insérer la ligne suivante dans le fichier
function.php
de votre thème:add_filter( 'the_generator', create_function('$a', "return null;") );
- Effacer ou renommer le compte wp-admin: ce compte est la première cible des attaques. La méthode est simple: créer un compte avec les droits administrateur, puis effacer le compte wp-admin. Si vous souhaitez simplement le renommer, il suffit de passer cette requête à la base MySQL:
UPDATE wp_users SET user_login='', user_nicename='', display_name='' WHERE user_login='wp_admin';
- Déplacer le fichier
wp-config.php
: si vous disposez d’une version 2.7 ou ultérieure, vous pouvez déplacer le fichierwp-config.php
, qui contient tous les paramètres vitaux de votre installation. Cette opération rend la recherche du fichier, beaucoup plus difficile. - Renommer le répertoire
wp-content
: Là encore, les versions 2.7.x et ultérieures permettent de changer le nom du répertoirewp-content
. Il suffit pour cela de renommer le répertoire, et d’inclure la ligne suivante, dans le fichierwp-config.php
:define('WP_CONTENT_DIR', dirname(__FILE__) . '< Le nouveau nom du répertoire >');
- Etablir précisement le droit de vos auteurs/utilisateurs: Cette règle semble évidente, mais elle n’est pas forcement appliquée. Lorsque vous créez un utilisateur, pensez à lui donner le bon rôle, pour éviter qu’il ne dispose de trop de droits. Cette précaution protège principalement contre les erreurs de manipulation.
- Limiter le nombre possible de tentatives de connexions grâce à des plugins comme Limit login attemps, ou Login lockdown.
- Limiter le nombre d’utilisateurs: Si cela est possible, limitez le nombre de personnes ayant le droit de se connecter à l’interface d’administration du blog. Fixez également des règles pour les mots de passe, pour qu’ils ne soient pas trop évidents.
Au niveau de la plateforme Web
WordPress n’est rien d’autre qu’une série de scripts PHP. Il est donc impossible de le sécuriser intégralement, sans certaines actions au niveau du serveur Web. Les actions listées ci-dessous concernent Apache, et consistent à créer/modifier un fichier .htaccess
à la racine du site.
- Interdire la visualisation des fichiers: Par défaut, il est très facile de lister les fichiers d’un blog, pour en connaître les plugins par exemple. Pour éviter que n’importe qui puisse « voir » vos fichiers, il suffit d’ajouter la ligne suivante au fichier
.htaccess
situé à la racine du site:# disable plugin directory browsing Options -Indexes
- Sécuriser le répertoire
wp-admin
: Les auteurs et administrateurs sont les seules personnes ayant besoin d’accéder à l’interface d’administration. Elles sont donc les seules a devoir accéder au répertoirewp-admin
. Vous pouvez donc restreindre l’accès à ce répertoire:order deny,allow deny from all allow from XXX.XXX.XXX.XXX # 1iere IP autorisée allow from XXX.XXX.XXX.XXX # 2nde IP autorisée
Cela suppose que vous disposiez d’IP fixe. Dans le cas contraire, vous pouvez mettre en place un accès par mot de passe.
- Limiter l’accès au fichier
wp-config.php
: Ce fichier est stratégique car il contient de nombreux paramètres du blog, notamment les coordonnées de la base de données (mot de passe inclu). Interdire tout accès direct à ce fichier est donc très important:order allow,deny deny from all
- Sécuriser les fichiers: Les règles précédentes limitent l’accès aux fichiers pour des requêtes http. Un cran en dessous, nous pouvons également protéger les fichiers au niveau du système d’exploitation. Avec votre client FTP, changez les droits d’accès aux fichiers:
Type Code Propriétaire Groupe Autres Fichiers 604 Lecture/Ecriture – Lecture Répertoires 705 Lecture/Ecriture/Exécution – Exécution Si vous n’avez pas besoin des accès en écriture, vous pouvez même restreindre les droits à 404 pour les fichiers, et 505 pour les répertoires. Attention cependant, certains plugins nécessitent les droits d’écriture (les plugins de cache par exemple). Vous aurez également besoin de droits en écriture si vous utilisez les pièces jointes ou les images.
Conclusion
Les règles énoncées dans cet article sont celles qui reviennent le plus souvent sur Internet. Je vous laisse consulter les références ci-dessous, pour plus de détails.
Les appliquer nécessite un minimum de préparation, et de vérification car, sans précaution, elles peuvent bloquer le blog.
La sécurité, surtout en informatique, est un travail sans fin: le jeu de mesure/contre mesure, faille/patch est permanent. Nous ne sommes pas à l’abri d’une faille cachée, ou d’une attaque plus subtile que les autres. Mais il ne faut pas que la cette sécurisation devienne un travail à plein temps. Il faut donc savoir fixer les limites, en partant de deux critères principaux: la fréquence des incidents, et le coût de chacun d’eux.
Appliquer les règles décrites précédemment vous permet de diminuer efficacement la fréquence des incidents, parce qu’elles couvrent 99% des attaques. Si quelqu’un arrive a passer à travers, l’objectif est de diminuer le coût de l’attaque, c’est-à-dire, réduire le temps d’indisponibilité, et l’effort nécessaire pour redémarrer le blog. J’insiste donc de nouveau sur les sauvegardes, qui constituent un moyen simple efficace pour redémarrer un blog, rapidement et sans stress.
Références
- (fr) 10 manières de protéger votre WordPress, Partie 1, et Partie 2,
- (en) WordPress Security Tips,
- (en) 11 Ways To Secure Your WordPress Blog,
- (en) Secure Your WordPress Blog,
- (en) La section WordPress de Blog Security fournit documentations, des plugins très intéressants.
Bonsoir Emmanuel,
Merci beaucoup pour votre réponse ! J’ai réussi à protéger mes fichiers sensibles mais pas l’accès aux dossiers, ayant une IP qui n’est pas fixe. Il faudra que je me plonge plus tard dans la mise au point d’un mot de passe mais je suis déjà satisfait des avancées. Merci encore pour votre aide !
La syntaxe des fichiers htaccess est en effet assez complexe, et personnellement j’ai egalement du mal a la maitriser.
Les lignes allow et deny doivent etre contenues dans des directives du type comme Directory, Files ou FilesMatch
La syntaxe peut etre
ou encore (pour proteger le fichier htaccess)
Deux commentaires:
– Le mieux est d’essayer ce genre de choses sur un site de test. Le faire directement sur le site en production est assez risque
– Si vous ne pouvez pas faire autrement, avant d’intervenir sur le fichier htaccess du site de production, faites-en une sauvegarde. En cas de probleme, il suffira de recopier l’original
– L’utilite du fichier htaccess depend de l’herbergeur. Certaines hebergeurs limitent les directives des fichiers htaccess pour se proteger contre d’eventuels malversations. Donc dans certains cas, le fichier htaccess peut etre parfaitement orthographie, mais ne pas fonctionner en raison des directives placees au niveau de Apache lui-meme.
Merci beaucoup Emmanuel pour ce post très enrichissant !
Je me pose une question concernant la protection via .htaccess des dossiers wp-admin et du fichier wp-config.php : ne faut-il pas déclarer sur quels dossiers/fichiers les commandes deny et allow doivent s’appliquer ? J’ai tenté de me renseigner plus sur les commandes possibles mais c’est très nébuleux et j’ai lu qu’il fallait utiliser les commandes deny et allow avec précaution sous peine de bloquer le site. Je n’ose donc pas appliquer ces modifications…
Merci pour le billet 🙂 très intéressant en effet 🙂
Merci Emmanuel pour les liens. 😉