Utiliser le module « Limit Login Attempts » de WordPress pour alimenter une liste noire

Ce post explique comment intégrer les outils “Limit Login Attempts” (qui est un plugin de WordPress) et Modsecurity (qui est un utilitaire apache) pour créer une liste noire d’IPs auxquelles on interdit l’accès au serveur apache entier.

J’ai régulièrement des tentatives d’intrusions frauduleuses pour mon blog wordpress et l’installation du module Limit Login Attempts de WordPress me permet d’en suivre l’évolution. Quand une adresse IP est bannie, je reçois un email de ce type :

2 tentatives d'accès ont échouées (1 bloqué(s)) depuis l'adresse IP: XX.XX.XXX.XX
Dernière tentative de l'utilisateur: admin
L'adresse IP a été bloquée pour 9999 minutes

Habituellement, le nombre de blocages est de quelques-uns par jour mais j’ai récemment subie une attaque d’environ 1600 blocages en l’espace de deux heures. Ce post explique comment utiliser les informations envoyées par e-mail pour alimenter la blacklist mise en place dans le module Modsecurity comme décrit dans ce post.

Récupérer la liste des IPs à bannir

Je récupère la liste des IPs à bannir directement au niveau des répertoires de mon serveur IMAP avec la commande :

grep "depuis l'adresse IP" bannedIP > all_blocked.txt

bannedIP est le dossier IMAP contenant les e-mails envoyés par le plugin WordPress.

Fusionner les IPs à bannir avec le fichier blacklist.txt

La suite est effectuée à l’aide du logiciel R : elle consiste à fusionner la liste des adresses bloquées par le plugin WordPress avec la liste des adresses déjà blacklistées, blacklist.txt qui se situe dans le répertoire /etc/modsecurity. Pour cela, le script suivant est exécuté :

old.ips = read.table("blacklist.txt",stringsAsFactor=FALSE)
export.ips = unique(old.ips$V1)
emails.ips = read.table("all_blocked.txt",sep=" ",stringsAsFactor=FALSE)
emails.ips = unique(emails.ips$V5)
emails.ips = paste("/",emails.ips,"/",sep="")
export.ips = unique(union(export.ips,emails.ips))
write.table(export.ips,file="new_blacklist.txt",row.names=FALSE,col.names=FALSE,quote=FALSE)

qui permet de créer un nouveau fichier new_blacklist.txt contenant toutes les IPs à blacklister entourées par le caractère “/” comme indiqué dans ce post. J’envoie ensuite simplement ce fichier sur mon serveur dans le répertoire /etc/modsecurity pour remplacer le fichier blacklist.txt.