En regardant les logs apache défiler on repère qu’une plage d’IPs flood le site cible. La commande suivante permet de générer la liste des IPs qui "abusent" à partir des logs Apache [1] :
tail -n 500 /var/log/apache2/access.log | cut -d' ' -f1 | sort | uniq -c | sort -gr
Notez qu’on peut aussi utiliser netstat pour dresser ce genre de liste. Voir aussi logtop qui permet d’analyser les logs en temps réel.
Vu que dans notre cas il y a plus de 500 IPs différentes qui envoient des requêtes par paquets, on ne va pas tenter de bloquer par IP. Par contre, le user-agent est toujours le même :
Apache-HttpClient/4.5 (Java/1.8.0-jdk8u76-b00)
On commence par calmer le jeu en bloquant toutes les connections de cet user agent [2] :
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Apache-HttpClient/4.5 (Java/1.8.0-jdk8u76-b00)" -j DROP
Et on peut vérifier combien d’IPs sont bloquées par cette règles avec la commande suivante [3] :
iptables -L fail2ban-HTTP | grep -Ecv '^$|^Chain |^target'
Affinons tout ça en indiquant à fail2ban que cet user agent est malveillant. Pour cela, on va ajouter l’user agent en question à la liste de ceux déjà présents dans le filtre apache-badbots :
nano /etc/fail2ban/filter.d/apache-badbots.conf
Et ajouter le contenu suivant au bout de la ligne badbotcustom :
|Apache-HttpClient/4\.5 \(Java/1\.8\.0-jdk8u76-b00\)
On peut vérifier que notre filtre repère bien le nouvel user agent avec la commande suivante :
fail2ban-regex -v /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-badbots.conf
Qui doit afficher une ligne comme celle qui suit à la fin :
Lines: 115141 lines, 0 ignored, 9830 matched, 105311 missed
Puis on active la filtre en éditant le fichier de configuration de fail2ban :
nano /etc/fail2ban/jail.conf
[apache-badbots]
enabled = true
filter = apache-badbots
Et on redémarre fail2ban pour qu’il prenne en compte tous ces changements :
service fail2ban restart
Maintenant que fail2ban est prêt à bloquer le flood, on peut rouvrir le robinet d’iptables et laisser venir le trafic en supprimant la règle qu’on a ajouté au début :
iptables -D INPUT -p tcp --dport 80 -m string --algo bm --string "Apache-HttpClient/4.5 (Java/1.8.0-jdk8u76-b00)" -j DROP
Et vérifier que fail2ban fait bien son travail avec la commande suivante :
fail2ban-client status apache-badbots
Qui devrait afficher la liste des IPs bloquées suivi d’une ligne comme celle qui suit :
- Total banned: 580
Plan B pour le blocage si ça provient d’une seule IP
Si on veut faire simple, il suffit de bloquer l’IP en question cf iptables -A INPUT -s 103.197.70.56 -j DROP
.