Sécuriser WordPress

Comment sécuriser wordpress autant que possible et s’éviter les soucis ?

Voici une checklist pour passer en revue les différentes mesures à prendre afin d’avoir une installation aussi sûre que possible.

Pour faire ça « proprement » et surtout éviter qu’une mise à jour supprime votre travail. Les modifications générales (à appliquer quelque soit le thème) devraient être faites via un pluggin perso. Et les modifications spécifiques à un thème en particulier, avec un thème enfant.

  1. Les plugins de sécurité

    C’est la base !
    Ils permettent de verifier l’intalation, faire la plupart des réglages et modifications de base, monitorer le traffic, controler correctement l’accès à l’interface d’administration, etc

    2 des plugins les plus connus sont WordFence et iThemes Security (Better Wp Security).

    La plupart des manipulations de sécurisation présentées ici sont déjà effectuées ou réalisables grâce à ces 2 pluggins.

  2. Penser à ajouter les clés de sécurité au fichier wp-config.php

    En installant wordpress avec le script d’install normalement c’est fait automatiquement. Mais si ce n’est pas le cas, et bien il faut s’en charger manuellement.
    iTheme security permet aussi de s’en occuper.
    Tout est expliqué en commentaire dans le fichier, et l’url pour créer des phrases aléatoire est ici. Ça ressemble à ça:

    define('AUTH_KEY',        ';vZQcQ4R>`IDfJ/vW#RK;x.4A-,FRF~J-dIT(l1.]ouvo@nhs_)B');
    define('SECURE_AUTH_KEY', 'uJ:L:U.JVsL_x21e?o7k.1d;]K*iR*^7nCbmdO~A{yCW8clB4');
    define('LOGGED_IN_KEY',   '`-U&tD4kZs,<(kCpW^ln)B=Z;lF!s{bIF)+NkF0%r^7tf-Vi-S;f');
    define('NONCE_KEY',       'O+j{|j!yd>7j++_7QYtu{DbHHmM*I-MYOiVp6Y_5(=-S[Gld$');
    define('AUTH_SALT',       ',/GkY;qVg5ja&UD|:YzC?w~.b@uX[hNJtF_2gULO(c8FP,mB[ r#2');
    define('SECURE_AUTH_SALT','n7 ji^O;t;47/Y8?9A7<k3i#r=53s+z|qFVZ#C}k>3G56_2FV');
    define('LOGGED_IN_SALT',  '$REF1q9++rQ?DqUh#|z>ld_OOyz+B@8Nuin|!o~PM)&4Gsilh');
    define('NONCE_SALT',      'a$tELIZtp7_eQfa{PzNL3,VHrqkZKx`Jg1z- 7`w|-<@g?B/#8PI');
  3. Remplacer le préfixe des tables

    Là encore, normalement vous le faites à l’instalation du blog, et iTheme Security peut aussi vous aider pour le faire après instalation.

    Par défaut, le préfixe est « wp_ ». Le fait d’en mettre un autre, qui soit de préférence difficile à deviner (ex: « fg45r33e21s44e7_ »), ajoutera un peu de sécurité à votre base de donnée (contre les injections SQL notamment).

    Si vous ne l’avez pas fait au moment de l’installation, voici un site qui explique comme le faire sur un site déjà installé.

  4. Pas de compte « Admin »

    Tout simplement, éviter d’avoir un compte administrateur avec le pseudo « admin ».
    Si il existe déjà, il suffit de faire le changement.

    De tte façon c’est aussi quelque chose à faire à l’installation du blog, et là encore les pluggins de sécurité peuvent aider à faire les modifications nécessaires.

  5. Gérer correctement les mots de passe !

    Ça, c’est un conseil qui s’applique de toute façon partout sur internet pour tous les endroits où vous avez à utiliser un mot de passe.
    Utilisez tjr des mots de passes uniques (un différent pour chaque endroit) et très difficile à deviner (ex: eFç(t:hpy4e5e6Rg!tm).
    Si vous devez absolument vous en rappeler de tête, faite une petite phrase avec des majuscules et des chiffres (ex: UnP3uc0MmeçA) 😉

    Les pluggins de sécurité pourront vous aider à controler que tous les utilisateurs de votre sites utilisent des mots de passe sûrs. C’est configurable selon leur rôle et selon le niveau de complexité souhaité.

  6. Sécuriser le répertoire wp-admin avec un mot de passe

    Ajouter une bonne vieille restriction d’accès par mot de passe sur le répertoire wp-admin permet d’ajouter une étape d’identification en plus de celle de la page wp-login.php de wordpress.
    Évidement, vous choisissez un login et un mot de passe différents de ceux utilisé sur la page de login wordpress.

    Si vous ne savez pas comment faire, d’abord vérifiez que votre hébergeur n’a pas une interface pour le faire via votre cpanel ou autre système d’administration de votre hébergement.
    Et si il n’y a rien c’est de tte façon très simple, et je vous explique ici comment sécuriser un répertoire avec un .htaccess.

    Par contre, il faut penser à débloquer le fichier admin-ajax.php pour que certaines fonctionnalités puissent fonctionner correctement. Il suffit d’ajouter ça dans le .htaccess du répertoire wp-admin.

    <Files admin-ajax.php>
    Order allow,deny
    Allow from all
    Satisfy any
    </Files>
    
  7. Cacher l’administration

    Avec iTheme Security vous aller aussi pouvoir cacher la page wp-login.php, le répertoir wp-admin, etc.

    Cela permettra de rendre l’accès au formulaire de connexion à l’administration un peu plus difficile à trouver (et ainsi limiter les risque d’accès non autorisé évidement).

  8. Supprimer les mentions à la version de wordpress

    La version de wordpress peut donner des indications aux hackers à propos d’éventuelles failles de sécurités.
    Du coup, pour y remédier, il suffit d’effacer le fichier readme.html pour commencer.
    Et ensuite, rajouter ces quelques lignes de code à votre fichier function.php

    function cacher_version() {return '';}
    add_filter('the_generator', 'cacher_version');

    Là encore, les pluggins de sécurité (wordfence en l’occurence) s’en chargent très efficacement pour vous.

  9. Limiter les tentatives d’identification

    Encore une mesure à prendre pour sécuriser l’accès à l’admin, et éviter les attaques de type Brute Force.
    Très simplement, ça permettra d’empecher un bot de tester rapidement un grand nombre de mot de passe

    C’est, bien évidement, un des apsects que les pluggins de sécurité vont traiter. Il faut donc veiller à configurer correctement le nombre d’essais autorisés, les logins interdits, et comment traiter les erreurs.

  10. Ajouter des captcha

    C’est très simple mais aussi très efficace pour s’éviter pas mal de nuisances. Avec l’ajout d’un captcha vous allez pouvoir bloquer pas mal de bots qui commentent ou tentent de deviner vos mots de passe automatiquement.

    Pour ce blog j’ai utilisé un plugin qui intègre noCaptcha ReCaptcha de Google car c’est celui qui me semble le moins contraingant (tout en étant efficace). Il est activé partout où c’est possible (commentaires, administration, mot de passe perdu…).

  11. Masquer les erreurs de connection

    Le message d’erreur en cas d’échec de connexion, peut aider les hackers, et donc cette petite manip permet d’enlever ce message d’erreur.
    Bien évidement Wordfence peut s’en charger pour vous.

    Il suffit d’ajouter cette ligne de code dans le fichier function.php

    add_filter('login_errors',create_function('$a', "return null;"));
  12. Désactiver l’édition de fichiers

    Normalement iTheme Security s’en occupe pour vous. C’est une mesure importante pour la sécurité mais aussi pour ne pas détraquer le blog par erreur en faisant une modification sans pouvoir revenir en arrière facilement comme avec un bon éditeur.

    Voilà une petite ligne de code à ajouter au fichier wp-config.php pour désactiver la possibilité d’éditer les fichiers à partir de l’admin wordpress.

    define('DISALLOW_FILE_EDIT',true);
  13. Protections des fichiers et répertoires

    Encore une peu de bidouillage du fichier .htaccess pour blinder un peu la sécurité des dossiers et fichiers sur le serveur.

    Pour commencer une ligne à ajouter pour interdire de se balader dans les dossiers qui n’ont pas de fichier index

    Options All -Indexes

    Et encore quelques lignes pour protéger les fichiers .htaccess et wp-confing.php.

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

    Et enfin, à l’aide de votre client FTP, des permission 755 sur les dossiers, 644 sur les fichiers, et 400 sur wp-config.php et .htaccess.

  14. Empêcher le hot-linking

    Le hot-linking c’est lorsqu’un site affiche une de vos images (ou plusieures), en utilisant votre bande passante.
    À grande échelle ça peut très sérieusement impacter la bande passante de votre site et impacter sur sa disponibilité et son référencement.

    Pour y remédier, il y a juste une petite manip à faire sur le fichier .htaccess (encore lui !)

    <IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} .*jpg$|.*jpeg$|.*gif$|.*png$ [NC]
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http(s)?://(.+.)?votresite\.fr/ [NC]
    RewriteCond %{HTTP_REFERER} !google\. [NC]
    RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
    RewriteRule .(jpg|jpeg|png|gif)$ http://i.imgur.com/MlQAH71.jpg [NC,R,L]
    </IfModule>

    Ici ça autorise votre site (vous pouvez en rajouter d’autres) et aussi google, et le cache goole.

  15. Faire des sauvegardes régulières

    C’est une habitude à prendre. Et en cas de problème (piratage ou problème côté serveur), ça évite bien des soucis.
    Vous pouvez le faire manuellement, en sauvegardant les fichiers, et en exportant la base de donnée. Ou alors, parceque c’est beaucoup plus pratique, en utilisant un plugin.

    Si optez pour un plugin (ceci dit, vous pouvez aussi le faire en manuel, en plus), en voici un gratuit et assez complet.
    Et voici un site qui explique un peu son fonctionnement.

    C’est pratique pour faire une sauvegarde complète (base de donnée et fichiers) mais de toute façon, iTheme Security vous offre aussi un système de sauvegarde de la base de donnée.

  16. Faire les mises à jours régulièrement

    Régulièrement des failles de sécurités sont découvertes, l’info se propage, et du coup les risques de piratage aussi. Dès qu’une parade est trouvé il y a une mise à jour disponible, et plus tôt on l’installe, plus vite on est protégé 🙂

    Prenez donc le temps de mettre à jour WordPress, mais aussi les plugins, et prenant bien le temps de vérifier que tout reste fonctionnel.

  17. Télécharger les thèmes et pluggins sur les sites officiels

    Un conseil basique, mais toujours bon à rappeler: Évitez de télécharger des thèmes et plugins sur des sites bizares. En général le site officiel de wordpress devrait vous permettre de trouver tout ce dont vous avez besoin, tout en étant à peu près sûr que les fichiers ne sont pas corrompus.

  18. Bien choisir son hébergement web

    Il semble évident que tous les hébergeurs ne se valent pas en terme de prix, rapidité, qualité et disponibilité de support. Et un des points importants, c’est bien entendu, la sécurité.
    Donc un bon choix d’hébergeur contribuera à sécuriser (ou pas) votre site.

    En ce qui me concerne, je suis chez Planet Hoster et je n’ai pas à me plaindre de quoique ce soit 🙂

  19. Désactiver windowsLiveWriter

    WordPress ajoute une ligne au <head> pour assurer la compatibilité avec Widows Live Writer. Si vous n’utilisez pas ce logiciel (et vous avez raison de ne pas l’utiliser) il vaut mieux l’enlever.

    Et encore un petit bidouillage du fichier functions.php

    remove_action('wp_head', 'wlwmanifest_link');

Protéger un repertoire avec un .htaccess

Protéger un répertoire avec un fichier .htaccess est très simple 🙂

Le fichier .htaccess

Pour commencer, on créé un fichier .htaccess dans le répertoire à protéger et on y met le contenu suivant:

AuthName "Le texte autoritaire que vous voulez"
AuthType Basic
AuthUserFile "/le/chemin/absolu/vers/le/fichier/.htpasswd"
Require valid-user

« AuthName » affichera le texte que vous y avez mis sur la fenêtre d’identification (ex: « Merci d’entrer votre login et votre mot de passe »).
« AuthUserFile » est le chemin absolu vers le fichier .htpasswd qui contiendra vos paires de logins et mots de passe. En fait vous pouvez nommer ce fichier comme vous voulez, mais commencez de préférence par .ht 😉

Si vous ne connaissez pas le chemin absolu de votre fichier .htpasswd, vous pouvez utiliser ce code dans un fichier php placé dans le même dossier:

<?php echo realpath(null); ?>

Vous n’aurez plus qu’à y ajouter « /.htpasswd » (ou le nom que vous avez donné à votre fichier) 😉

Le fichier .htpasswd

Dans ce fichier, vous allez mettre les paires de login / mots de passe cryptés.
ça resemble à ça:

login:mot_de_passe_crypté

Vous pouvez le faire vous même avec ce petit outil pour faire automatiquement autant de paires que vous voulez.
Vous écrivez les  login:mot_de_passe sur chaque ligne, et le script vous retourne ça avec les mots de passe cryptés 😉

Si les mots de passes posent problème sur votre serveur (algo de cryptage pas compatible), voici le code à mettre dans un fichier .php pour récupérer les mots de passe.
En l’utilisant sur votre serveur, il ne devrait pas y aura pas de problème de compatibilité.

<html>
  <head>
    <meta charset="UTF-8">
    <title>Générateur de .htpasswd</title>
  </head>
  <body>
    <form method="post">
      <textarea id="textzone" name="logpass" cols="75" rows="6"><?php
        echo (isset($_POST['logpass']))?
        $_POST['logpass'] :
        "login:password\nJacky:son_mot_de_passe\nBruce:mot_de_passe";
      ?></textarea><br>
      <button type="submit">Crypter !</button>
    </form>
    <?php
      if(isset($_POST["logpass"])){
        echo "Vous copiez ça dans votre fichier de login:password et voilà !<br><br>";
        $tab=explode("\n", $_POST["logpass"]);
        foreach($tab as $line){
          $rr=explode(':', $line, 2);
          echo $rr[0].':'.crypt($rr[1]).'<br>';
        }
      }
    ?>
  </body>
</html>

Dernier point, toujours bon à rappeler, utilisez des mots de passe dur à deviner (ex: C3c1!E5t,un.M0t/de!P45s3*sUr;) ) et si possible des logins pas trop évidents non plus

Voilà !
Vous allez pouvoir avoir des dossiers sûrs 🙂.