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