15 règles pour sécuriser WordPress

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

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.

  1. 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,
  2. 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.
  3. 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 fichier wp-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@');
  4. 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 fichier wp-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.

  5. 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;") );
  6. 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';
  7. Déplacer le fichier wp-config.php: si vous disposez d’une version 2.7 ou ultérieure, vous pouvez déplacer le fichier wp-config.php, qui contient tous les paramètres vitaux de votre installation. Cette opération rend la recherche du fichier, beaucoup plus difficile.
  8. Renommer le répertoire wp-content: Là encore, les versions 2.7.x et ultérieures permettent de changer le nom du répertoire wp-content. Il suffit pour cela de renommer le répertoire, et d’inclure la ligne suivante, dans le fichier wp-config.php:
    define('WP_CONTENT_DIR', dirname(__FILE__) . '&lt; Le nouveau nom du répertoire &gt;');
  9. 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.
  10. Limiter le nombre possible de tentatives de connexions grâce à des plugins comme Limit login attemps, ou Login lockdown.
  11. 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.

  1. 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
  2. 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épertoire wp-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.

  3. 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
  4. 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

6 thoughts on “15 règles pour sécuriser WordPress”

  1. 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 !

  2. 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

       Options -Indexes
       Order deny, allow
       Deny from all
       Allow from ...

    ou encore (pour proteger le fichier htaccess)

        Order allow,deny
        Deny from all
        Satisfy All

    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.

  3. 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…

Commentaires clos.