Mettre en place une protection minimale
Une fois WordPress installé, il va nous falloir limiter certains types d’accès et protéger un minimum l’ensemble des fichiers. Nous allons voir qu’en respectant certaines règles, et en adoptant une attitude responsable, il n’est pas si compliqué de maintenir une sécurité de base qui soit certes minimale mais bien souvent efficace. Vous trouverez les fichiers nécessaires et abordés au cours de cet article sur le github WP-Minimal-Protection.
N’oubliez pas également de vous rapprocher du code en lisant l’article Hardening WordPress.
S’assurer des gestes de base dès l’installation
-
- Ne pas placer les fichiers inutiles sur le serveur, comme license.txt, readme.html, wp-config-sample.php
- Opter pour des mots de passe robustes, ne pas hésiter à générer trois mots de passe consécutifs depuis l’outil proposé par WordPress, et les coller les uns aux autres afin d’allonger le nombre de caractères utilisés
oI(3ckB1La3n3RfKDhQ99l&L
- Utiliser un pré-fixage de tables autre que wp_, par exemple wp_client_ref_ ou tout autre combinaison, si WordPress est déjà installé, rapprochez vous de l’article Changer la racine de ses tables une fois WordPress installé
$table_prefix = 'wp_ve1HaBr8b_';
- Employer dès le départ des sels auto-générés depuis https://api.wordpress.org/secret-key/1.1/salt/ et surtout à ne pas hésiter à fréquemment les modifier, disons tous les mois par exemple
define('AUTH_KEY', '2aGAEc-F`;R}p+Gm+6TbKBGy4-j]m)-wVmtxh5bcD*-wijp~QN]q3$jF:?=[h$}O'); define('SECURE_AUTH_KEY', 'Pu^KW|%K|gihW+r{;fZ9`1Q-TTI(40rt*,$0*YPr ]~}qR!4qn6UaE.hjM-$|RbuX'); define('LOGGED_IN_KEY', 'zHN*w94q4-zr{SOzM_^%MYg0GEBAA5a0ENy434IHk+.1ecP4qTM34qsT_nj/dTbFz'); define('NONCE_KEY', 'LzkEoMRT5[6*Ah,#K`xe1=jWXBX_1/aP7U|$rqgzxUOU;B@we4qcTy=BozjX3Aoi'); define('AUTH_SALT', 'r6-j]T_N1DBVM|HVug5Ba*f4Z N 9ZIg4q#}QxK*-hB.^s|U9l6T_F6bQSzHaM#2'); define('SECURE_AUTH_SALT', 'O3G|yp_m L3.*|~4||Q4qJ8%I{qP|3,w7|6Z+Qx|.xA(,n=~jmdCa/CcgjX?jD^*'); define('LOGGED_IN_SALT', 'IiovcJ3bvkgGF,dW6p!+ckX$~,_/*Vp4qjo ,y+)i!CypquRL4V[0;|^)51IdK,3B'); define('NONCE_SALT', 'Y5bvEW$p#eT1:.4q#aIwK3:?Djf!#^w@%Oz /M-S(MeC/a4qP7UdhbQOV8 BLLgj!2');
- Bloquer l’édition de fichiers depuis le tableau de bord de WordPress, en ajoutant les deux lignes suivantes au fichier wp-config.php
# Désactiver les modifications de fichier depuis le tableau de bord define('DISALLOW_FILE_EDIT', true);
- Si un plugin ou le thème employé génère une erreur, aussitôt cette erreur va se reporter sur la page en cours d’affichage et le chemin d’accès au serveur peut ainsi être révèler. Afin d’éviter cela penser à ajouter les lignes suivantes au fichier wp-config.php
# Évite l'affichage d'erreur error_reporting(0); @ini_set(‘display_errors’, 0);
- Retirer les thèmes non utilisés et faire de même avec les plugins
- Mettre en place un réel nettoyage de l’entête des documents générés, rapprochez vous de l’article Remove Unnecessary Code from wp_head
- Assurer vous que les autorisations (chmod) de fichiers soient placées sur 644 et celle des dossiers sur 755.
- Constamment mettre à jour WordPress, le thème employé, même celui de secour, ainsi que les plugins
- Vérifier les utilisateurs inscrits avec des adresses louches, et éventuellement les retirer, le plug-in Recently Registered, permet de rapidement classer les utilisateurs par ordre de leur inscriptions, cela facilite le repérage des derniers apparus.
L’emploi de fichiers .htaccess
Du coté du lourd, il existe des fichiers, les fichiers .htaccess qui permettent de paramétrer finement les relations client serveur. Attention ces fichiers sont lus par le serveur lors de chaque requête, donc il est important de les affiner et les minimiser afin de ne garder que l’utile et ne pas hésiter à déployer autant de fichiers que nécessaires. Les fichiers couvrent le dossier dans lequel ils sont placés et toute la descendance. Pour ses besoins de redirection, si aucun fichier n’était présent lors de l’installation, WordPress en crée un à la racine du site. Attention à ne pas écraser ces précieuses informations, mais, nous allons sans soucis, pouvoir le compléter.
Le fichier .htaccess, lui même, doit être protégé
Puisqu’il s’agit là d’un des fichiers des plus sensibles de notre site, il est avant tout important de le protéger. Il suffit d’ajouter quelques lignes pour limiter l’accès à ce fichier et à son contenu.
<files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files>
Le fichier wp-config.php
Il s’agit là d’un fichier très important car il contient des informations primordiales comme l’accès à la base de données, les sels en cours d’utilisation, le pré-fixage des tables, brefs tout un certain nombre d’infos qu’il est bon de mettre à l’abri des regards indiscrets. Il suffit donc de refuser l’accès à toutes connexion extérieures au serveur, pour cela ajouter les lignes suivantes
#protege le fichier wp-config.php <Files wp-config.php> Order Allow,Deny Deny from all </Files>
Afin de renforcer la protection de ce fichier, il est également possible de paramétrer son degré d’autorisation à 600.
Éviter l’indexation des dossiers
Afin d’éviter que le serveur renvoie la liste du contenu du répertoire lorsque la page demandée n’existe pas, il est bon de renforcer l’erreur 404 par une instruction qui évite le listage des dossiers
#evite le listage des dossiers Options -Indexes
Masquer le fichier install.php
Une fois l’installation terminée, il n’est pas nécessaire de laisser libre accès à ce fichier. Si vous visitez un site utilisant WordPress, rien ne vous empêche de pointer vers http://www.lesiteenquestion.ext/wp-admin/install.php et là le serveur vous répond… Déjà installé, il semblerait que WordPress soit déjà installé… etc… cela peut éventuellement donner accès à certaines utilisation malveillantes. Donc, dans le doute il est possible de refuser l’accès à ce fichier en plaçant un fichier .htaccess à la racine du dossier wp-admin et en lui ajoutant les lignes suivantes. Notez qu’il est également possible de renommer le fichier.
#protege le fichier install.php <Files install.php> Order Allow,Deny Deny from all Satisfy all </Files>
Protéger l’accès aux fichiers dans les dossiers includes
Les dossiers includes, contenu soit dans le dossier wp-admin/includes, soit dans le dossier wp-includes/, n’ont pas a être utilisés par quelques sources externes, nous pouvons donc contrôler cet accès et bloquer tout appels externes, simplement en ajoutant les lignes suivantes au fichier .htaccess placé à la racine du site
# Bloquer les fichiers contenus dans includes <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
Limiter l’accès au dossier wp-admin
De même le dossier wp-admin ne renferme que des fichiers qui sont utiles à l’administration du site et nullement à ce qui concerne les utilisateurs, il est donc possible de limiter l’accès aux URLs commençant par ce chemin, http://www.votresite.ext/wp-admin/, mais cependant en l’autorisant pour vous et vos collaborateurs. Il suffit de récupérer la liste des adresses IP de toutes les personnes autorisées, en vous rendant par exemple sur le site Adresse Ip – Mon IP – Quel est monip?, et d’ajouter les lignes suivantes au fichier .htaccess précédant, en prenant soin de lister l’ensemble des IPs autorisées:
#protege le dossier admin <FilesMatch ".*"> Order Deny,Allow Deny from all Allow from XXX.XXX.XXX.XXX Allow from XXX.XXX.XXX.XXX </Files>
Attention, cependant, l’accès au fichier http://www.votresite.ext/wp-login.php sera toujours permis. Vous pouvez si vous n’ouvrez pas l’utilisation de votre site à un public plus large bloquer cet accès de la même manière que le dossier admin et n’autoriser que les adresses IP souhaitées. Il suffit de placer le fragment de code ci-dessous au sein du fichier .htaccess se trouvant à la racine du site
#protege le fichier wp-login.php <Files wp-login.php> order deny,allow Deny from all allow from XXX.XXX.XXX.XXX </Files>
Bloquer l’exécution de script dans le dossier uploads
Un des rares dossiers WordPress qui autorise un accès externe, afin d’y déposer des fichiers, est le dossier uploads qui se trouve à la racine du dossier wp-content. Une manoeuvre mal intentionnée pourrait y déposer un fichier PHP et exécuter à distance des commandes. Donc, pour éviter cela, il est possible d’ajouter un fichier .htaccess à la racine de ce dossier et le compléter des lignes suivantes:
#protege le dossier uploads <Files *.php> deny from all </Files>
Protéger les fichiers .htaccess eux mêmes
Dans chacun de vos fichiers .htaccess, il est recommandé de placer un jeu d’instruction qui va bloquer leur accès depuis l’extérieur. Pensez à ajouter les lignes suivantes:
# Protéger le fichier .htaccess d'un accès externe <Files .htaccess> order allow,deny deny from all </Files>
Désactiver XML-RPC
Si vous n’avez pas l’utilité de ce protocole de transfert d’informations il est préférable de désactiver son utilisation et là encore .htaccess va nous permettre de réaliser cette tâche. Il suffit d’ajouter ces quelques lignes au fichier .htaccess qui se trouve à la racine du site.
# Block WordPress xmlrpc.php requests <Files xmlrpc.php> order deny,allow deny from all allow from XXX.XXX.XXX.XXX </Files>
Enfin quelques plugins qui peuvent également nous aider
Il existe également pléthore de plugins qui peuvent nous aider à renforcer la sécurité de notre site, en voici quelques uns qui parlent de eux-mêmes et qui vont contribuer à parfaire l’installation de WordPress
- Remove Version qui permet de retirer l’affichage de la version de WordPress
- Login LockDown qui va limiter le nombre de tentatives de connexion
- Lockdown WP Admin
- Hide Login+
- Rename wp-login.php
- Acunetix WP Security qui nous indique d’éventuelles failles oubliées
- All In One WP Security & Firewall qui permet de mettre en place et gérer tout un ensemble de points afin d’accroître la sécurité du site
1 réponse
[…] un précédent article, Mettre en place une protection minimale, nous avions vu qu’il était important de modifier le préfixe des tables. Cette opération […]