Utiliser fail2ban pour protéger votre application web

Décembre 2016

fail2ban est un puissant logiciel pour protéger vos serveurs contre les attaques par force brute (essai de tous les mots de passe). Il est capable de repérer les échecs répétés de connexion et de reconfigurer automatiquement le firewall pour bloquer les adresses IP des attaquants.

Pour cela, il surveille en permanence les logs des applications de votre choix (dans /var/log) et utilise iptables pour bloquer définitivement ou temporairement les adresses IP.

Il peut ainsi protéger les serveurs ssh, ftp, apache ou même vos propres applications: Vous pouvez en effet écrire vos propres règles fail2ban. Le guide suivant va vous expliquer comment procéder, avec un exemple d'application php.



Notre application php


Imaginons que nous ayons une application en php avec un formulaire de connexion (identifiant/mot de passe). Si notre application détecte un login/mot de passe incorrecte, on écrit dans les logs système l'échec de la tentative, en notant également l'adresse IP en question:

if (loginok($user,$password))
{
    // Login ok
    // ...
}
else
{
    // Echec de connexion: on écrit dans le log
    openlog("monapplication", LOG_PID | LOG_PERROR, LOG_LOCAL0);
    syslog(LOG_WARNING, "monapplication - echec de connexion depuis {$_SERVER['REMOTE_ADDR']}");
    closelog();    
}


Maintenant, faites des essais de connexion sur votre application en fournissant le mauvais mot de passe. Vous devriez voir dans /var/log/messages une chaîne du genre:

Jul  7 23:30:30 ubuntu monapplication[11634]: monapplication - echec de connexion depuis 127.0.0.1


Nous allons maintenant apprendre à fail2ban à reconnaître cette chaîne, et à bloquer l'adresse IP en conséquence.

Installer fail2ban


Sous Debian et dérivés, tapez: sudo apt-get install fail2ban

Dès lors, fail2ban est actif et protège par défaut votre serveur ssh (si vous en avez un).
Nous allons maintenant écrire une règle pour notre application web.

Ecrire notre propre règle fail2ban


fail2ban a 2 notions: filtre et jail.

Les filtres indiquent à fail2ban quelles chaînes rechercher dans les logs, et comment en extraire l'adresse IP.
Les jails indique à fail2ban dans quels logs rechercher ces chaînes, combien d'échecs tolérer, quels ports bloquer et pendant combien de temps.

Nous allons écrire un filtre et un jail.

Ecrire le filtre


Créez le fichier /etc/fail2ban/filter.d/monapplication.conf

[Definition]
failregex=monapplication - echec de connexion depuis <HOST>


failregex est une expression régulière qui sert à reconnaître notre information d'échec dans le log et en extraire l'adresse IP.
Vous pouvez tester son bon fonctionnement avec la commande fail2ban-regex.
Syntaxe: fail2ban-regex ligne_de_log regex

Dans notre exemple:
fail2ban-regex 'Jul  7 23:30:30 ubuntu monapplication[11634]: monapplication - echec de connexion depuis 127.0.0.1' 'monapplication - echec de connexion depuis <HOST>'


On s'assure qu'il a bien trouvé l'adresse IP:

Summary
=======

Addresses found:
[1]
    127.0.0.1 (Tue Jul 07 23:30:30 2009)


On voit qu'il a bien réussi à extraire l'adresse IP (127.0.0.1). Notre regex est bonne.

Ecrire le jail


Créez le fichier /etc/fail2ban/jail.local

[monapplication]
enabled = true
port = 80
filter = monapplication
logpath = /var/log/messages
maxretry = 3
bantime = 600


On y indique ici le filtre qu'on a définit précédemment (filter), l'emplacement du log à surveiller (logpath), le nombre d'échec tolérés (maxretry), la durée du bannissement en secondes (bantime) et le port du serveur web sur lequel est disponible notre application (port).

Puis redémarrez fail2ban: sudo /etc/init.d/fail2ban restart

A partir de ce moment, si une adresse IP fait 3 échec de connexion, elle est bloquée au niveau du firewall. L'intrus ne peut alors plus du tout se connecter sur le serveur web pendant 10 minutes (600 secondes).

Cela suffit pour rendre les attaques par force brute infaisables.

Tester notre jail


Ouvrez une fenêtre et tapez: sudo tail -f /var/log/fail2ban.log
Vous verrez alors en temps réel les adresse IP bannies et débannies.

Vous pouvez utiliser un cgi-proxy pour tester, comme https://ztunnel.com
Entrez l'URL de votre serveur web, et entrez un login et un mot de passe invalide 3 fois de suite.

Vous devriez alors voir l'adresse IP se faire bannir:
2009-07-08 11:04:39,919 fail2ban.actions: WARNING [monapplication] Ban 74.63.96.192


Une fois le délai expiré, l'adresse est "débannie":
2009-07-08 11:14:39,919 fail2ban.actions: WARNING [monapplication] Unban 74.63.96.192

Aller plus loin


fail2ban peut être configuré pour autant de logs, chaînes et ports différents que vous le voulez.
On peut également placer des adresses IP en liste blanche, ou encore modifier les actions: Au lieu de lancer une commande iptables pour bloquer une adresse IP, on peut demander à fail2ban de lancer d'autres commandes.

Un ensemble de règles prédéfinie sont fournies pour sécuriser les serveurs les plus courants (voir dans /etc/fail2ban/filter.conf): proftpd, vsftpd, sshd, wuftpd, postfix, apache-auth, exim...

fail2ban est un outils puissant et réactif, et malgré tout simple à configurer.

A voir également :

Ce document intitulé «  Utiliser fail2ban pour protéger votre application web  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.