Accueil > Docs > Bloquer un flood Apache avec fail2ban et iptables

Bloquer un flood Apache avec fail2ban et iptables

dimanche 2 avril 2017, par b_b

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.