La recherche par des robots de scripts sur les serveurs web sujets à des failles de sécurité est une activité qui engendre un grand nombre d'erreurs 404 dans les logs de ces serveurs. Voyons comment calmer les ardeurs de ces robots avec Fail2ban.

fail2ban_logo.png


Symptôme

Pour illustrer par un exemple très parlant, évoquons le cas de PHPMyAdmin. Plusieurs vulnérabilités critiques ont touché cet outil très répandu durant l'année 2011, d'où une recrudescence des robots à la recherche d'installations non mises à jour. Ces robots font travailler votre serveur web pour rien, laissent des traces biens visibles dans les logs et polluent les statistiques de vos sites.

tropde404.png

L'idéal serait d'intercepter et d'interdire ces requêtes avant qu'elles ne soient traitées par votre Apache/NGinx/etc. Fail2Ban est fait pour ça !


Configuration

Pour rappel, le fichier /etc/fail2ban/jail.conf est le fichier de configuration par défaut. Vous pouvez copier son contenu dans le fichier /etc/fail2ban/jail.local et éditer ce dernier ensuite, pour garder un fichier jail.conf propre et faciliter les futures mises à jour.

Pour découvrir Fail2ban, jetez un oeil au billet protéger un serveur avec Fail2ban.

On commence par ajouter au fichier /etc/fail2ban/jail.local les lignes suivantes :

[nginx-404]

# on active ou pas le filtre
enabled  = true
# le nom du filtre qui doit correspondre au nom du fichier
# dans le dossier /etc/fail2ban/filter.d/
filter   = nginx404
# l'action associée, ici un ban par iptables sur le port http (80)
action   = iptables[name=nginx404, port=http, protocol=tcp]
# le fichier de log à étudier
logpath  = /var/log/nginx/votre.serveur.access_log
# le nombre de tentative avant d'être banni
maxretry = 4
# le temps en seconde durant lequel les
# tentatives peuvent être accumulée.
findtime  = 6
# la durée en seconde du ban
bantime  = 120

Avec un configuration comme ci-dessus, une adresse IP qui réalise plus de 3 erreurs 404 en moins de 6 secondes est bannie pour 120 secondes.

Vous pouvez spécifier plusieurs fichiers de logs ou utiliser un wildcard dans logpath :

Logpath =       /var/log/domain.com/logs/*access.log
                /var/log/domain.fr/logs/*access.log
                /var/log/domain2.org/logs/*access.log
                /var/log/domain3.org/logs/*access.log

On crée ensuite un filtre adéquat, à placer dans "/etc/fail2ban/filter.d/" et qu'il faut nommer "nginx-404". Il s'agit d'une expression rationnelle chargée de reconnaître les erreurs 404 dans les logs "combined" de NGinx.

[Definition]

failregex = <HOST> - - \[.*?\] ".*?" 404)

ignoreregex = 

Et voilà, ne reste plus qu'à redémarrer Fail2ban pour être tranquille.

fail2ban-client restart
Ne pas se limiter aux erreurs 404

Il est bien sûr possible d'étendre le filtre aux autres erreurs de la série 40x, en adaptant l'expression rationnelle utilisée.

Pour toucher les erreurs de 400 à 415 :

failregex = <HOST> - - [.*?] ".*?" 4(0[0-9]|1[0-5])

Pour toucher l'ensemble des erreurs de la série 40x (même l'erreur 418 ;-) ) :

failregex = <HOST> - - [.*?] ".*?" 4(0[0-9]|1[0-8]|2[2-6]|49|50)

Amusez-vous bien !

Source : www.kaworu.ch

Commentaires

1. Le 7 septembre 2012, 06:39 par Ao

Bonjour,

Dans l'expression rationnelle failregex = <HOST> - - [.*?] ".*?" 4(0[0-9]|1[0-5]]), il n'y a t-il pas un "]" en trop ?

2. Le 7 septembre 2012, 07:02 par Matthieu Patout

@Ao : C'est exact, je viens de corriger. Merci !