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