Quelques infos glanées sur le web sur la sécurité WordPress. Les infos proviennent principalement de :
- http://wpchannel.com/14-astuces-securiser-site-wordpress/
- http://codex.wordpress.org/Hardening_WordPress
- http://moz.com/blog/the-definitive-guide-to-wordpress-security
Le fichier .htaccess
Bloquer le scan d’auteurs
# BEGIN block author scans RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} (author=\d+) [NC] RewriteRule .* - [F] # END block author scans
Protéger les fichiers sensibles :
## Block Sensitive Files ## Options All -Indexes <files .htaccess> Order allow,deny Deny from all </files> <files readme.html> Order allow,deny Deny from all </files> <files license.txt> Order allow,deny Deny from all </files> <files install.php> Order allow,deny Deny from all </files> <files wp-config.php> Order allow,deny Deny from all </files> <files error_log> Order allow,deny Deny from all </files> <files fantastico_fileslist.txt> Order allow,deny Deny from all </files> <files fantversion.php> Order allow,deny Deny from all </files>
Protéger le dossier wp-includes
Les fichiers n’étant destinés qu’à être inclus par d’autres scripts, on peut désactiver leur accès direct :
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]
à noter que cela peut poser quelques soucis en multisite. Dans ce cas il faut supprimer la ligne
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
Afin de ne pas empêcher le fichier ms-files.php de générer des images.
Bloquer la navigation dans les répertoires
Si le serveur est mal configuré, il est possible de lister le contenu de répertoires ne contenant pas de fichier d’index. Dans ce cas rajouter dans le .htaccess
Options All -Indexes
Désactiver la signature du serveur
ServerSignature Off
Bloquer certains bots qui n’ont pas de user-agent
Il est possible d’empêcher certains bots qui n’ont pas de user-agent d’ajouter des commentaires :
## Protect from spam bots ## <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} .wp-comments-post\.php* RewriteCond %{HTTP_REFERER} !.yourwebsite.com.* [OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L] </IfModule>
il faut évidemment personnaliser yourwebsite.com
Limiter les attaques par injection SQL
Attention : après test, il semble que les lignes ci-dessous ne fonctionnent pas… Je chercherai pourquoi quand j’ai 5mn 😉
## SQL Injection Block ## <IfModule mod_rewrite.c> RewriteBase / RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC] RewriteRule ^(.*)$ - [F,L] RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR] RewriteCond %{QUERY_STRING} boot\.ini [NC,OR] RewriteCond %{QUERY_STRING} tag\= [NC,OR] RewriteCond %{QUERY_STRING} ftp\: [NC,OR] RewriteCond %{QUERY_STRING} http\: [NC,OR] RewriteCond %{QUERY_STRING} https\: [NC,OR] RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR] RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [NC,OR] RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR] RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)||ê|"|;|\?|\*|=$).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*("|'|<|>|\|{||).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127\.0).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare).* [NC] RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$ RewriteRule ^(.*)$ - [F,L] </IfModule>
Extensions de protection
Les extensions de base à installer :
- Captcha : permet d’ajouter un captcha mathématique comme protection
- Limit Login Attempts : permet de bloquer les attaques par force brute
Quelques plugins permettant de vérifier la sécurité de votre WordPress :
D’autres plugins :
Ne pas utiliser « admin » comme login
Si possible le configurer lors de l’installation. Si le blog est déjà installé, on peut le modifier via phpMyAdmin. Dans la table wp_users simplement modifier le champ user_login de l’administrateur et trouver un login différent.
Ajouter des clés de sécurité
Elles se trouvent dans le fichier wp_config.php et peuvent être générées via l’url http://api.wordpress.org/secret-key/1.1/
Un autre conseil est de les changer régulièrement…
Masquer la version de wordpress
Supprimer la balise meta generator
Editer le fichier functions.php du thème et insérer :
1 | <?php remove_action('wp_head', 'wp_generator'); ?> |
Si la balise meta est toujours présente, suprrimer la ligne suivante de votre thème (header.php)
1 | <meta name=”generator” content=”WordPress <?php bloginfo('version'); ?>” /> |
Supprimer le fichier readme.html
Il se trouve à la racine du blog et contient le numéro de version
Détecter les modifications de fichier
La détection de la modification de fichiers WordPress permet de prévenir un hack de fichiers qui serait non détectable au premier abord. Plusieurs pistes à étudier :
- inotify-tools si on a la main sur le serveur
- OSSEC, un service open source de monitoring
Désactiver l’édition de fichiers
Rajouter dans wp-config.php
1 | define('DISALLOW_FILE_EDIT', true); |
Base de données
Changer le préfixe de votre base de données (peut-être fait via le plugin WP Security Scan)