WordPress est à ce jour le CMS le plus utilisé sur le marché : 40% de l’ensemble des sites web et 64% si on ne compte que les CMS (source : Kinsta) : de ce fait, il est la cible préférée des attaques. Outre le SPAM sur les commentaires, les pingback, il est victime de nombreuses tentatives de brute-force sur la page de login. Voyons aujourd’hui comment le protéger de ces attaques DDOS avec Fail2Ban.

wordpress fail2ban proteger wp login attaque brute force

Protection basique de WordPress sans Fail2Ban

Mettre à jour WordPress

Avant d’entrer dans le vif du sujet, il convient de mettre en place différentes couches de protection sur WordPress, au niveau CMS. Tout d’abord, les mises à jour. Cela peut paraître basique, mais de nombreux sites ne sont pas mis à jour : WordPress Core et plugins. Il est primordiale d’effectuer les mises à jour du CMS afin de corriger les failles de sécurités et renforcer les protections offertes par la solution. Il est possible de visualiser l’ensemble du changelog de WordPress sur cette page (à ce jour, la version 5.7). Des outils simples existent pour gérer WordPress et ses mises à jour : WP CLI (retrouvez notre article Déployer WordPress)

Filtrer les commentaires SPAM

Ensuite, il peut être utile de bloquer les commentaires SPAM : ils peuvent facilement être évités en utilisant un plugin comme Akismet Anti-Spam. Grâce à sa base de données, il analyse chaque validation de formulaire et commentaire et vérifie si ces derniers ne sont pas déjà considérés comme SPAM.

akismet protect wordpress spam comment security

Cross-Site Scripting (XSS)

XSS ou Cross-Site Scripting est une méthode qui consiste à injecter un script malveillant dans un site ou une application Web. Ceci permet à l’attaquant de récupérer des cookies ou des données de sessions de l’utilisateur, mais également réécrire du code HTML sur une page. Il convient de protéger WordPress et les plugins de ces attaques avec le code suivant, dans Nginx :

add_header X-Xss-Protection "1; mode=block" always;

Ou dans Apache :

Header set X-XSS-Protection "1; mode=block"

Renforcer la complexité de vos mot de passe

Encore une fois, un conseil des plus basiques, mais un des plus important : utilisez un mot de passe complexe pour votre compte Administrateur, et n’utilisez ce dernier que pour des tâches d’administration du site. Il est possible de générer des mots de passe complexes avec des outils comme Password Generator.

Protéger WordPress avec Fail2Ban

Fail2ban est un outil permettant d’analyser les logs systèmes, ou logs d’accès Web et en fonction de filtres prédéfinis, va enregistrer et bloquer les adresses IP source à l’aide de pare-feu comme Iptables ou UFW. Nous allons installer Fail2ban et le configurer pour analyser les logs systèmes afin d’identifier les tentatives de connexion au wp-login.php avec un utilisateur inconnu ou les tentatives de brute-force.

apt install fail2ban

Ensuite, il convient d’installer sur WordPress le plugin publié par invisnet : WP Fail2Ban . Ce dernier va rediriger dans le fichier /var/log/auth.log toutes les tentatives de connexions suspectes en y inscrivant l’adresse IP source. Il fourni également des Jails toutes prêtes pour Fail2ban, voici deux exemples, à intégrer dans le fichier /etc/fail2ban/jail.local :

[wordpress-hard] 
enabled = true 
banaction = ufw[application=Nginx,blocktype=deny] 
filter = wordpress-hard 
logpath = /var/log/auth.log 
maxretry = 1 
bantime = 14400 
port = http,https

[wordpress-soft] 
enabled = true 
banaction = ufw[application=Nginx,blocktype=deny] 
filter = wordpress-soft 
logpath = /var/log/auth.log 
maxretry = 3 
findtime = 300 
bantime = 7200 
port = http,https

Ici, lorsqu’une IP sera détectée comme frauduleuse dans le fichier auth.log, elle sera bloquée à l’aide d’UFW et intégrée à la liste des DENY :

➜ ~ ufw status numbered 
Status: active 
To Action From 
-- ------ ---- 
[ 1] Nginx DENY IN 93.189.30.194 
[ 2] Nginx DENY IN 31.24.146.153 
[ 3] Nginx DENY IN 18.163.15.137 
[ 4] Nginx DENY IN 103.152.254.202 
[ 5] Nginx DENY IN 160.251.4.88 
[ 6] Nginx DENY IN 3.233.233.95 
[ 7] Nginx DENY IN 192.185.130.170 
[ 8] Nginx DENY IN 139.99.148.4 
[ 9] Nginx DENY IN 174.138.40.141 
[10] Nginx DENY IN 133.167.108.110 
[11] Nginx DENY IN 212.48.71.164 
[12] Nginx DENY IN 145.239.2.45 
[13] Nginx DENY IN 51.159.59.87

Libre à vous d’optimiser / adapter la configuration de la jail pour renforcer la sécurité en jouant avec les paramètres bantime, findtime et maxretry.