Qu’est-ce que Fail2ban ?
Fail2ban lit des fichiers de log comme /var/log/auth.log
ou /var/log/apache/error_log
et bannit les adresses IP qui ont obtenu un trop grand nombre d’échecs lors de l’authentification afin de limiter les tentatives de hack du serveur. Il met à jour les règles du pare-feu pour rejeter cette adresse IP. Ces règles peuvent êtres définies par l’utilisateur dans un fichier de configuration. Fail2ban peut lire plusieurs fichiers de log comme ceux de sshd ou du serveur Apache.
Présentation de fail2ban sur le site officiel du projet.
Installation de fail2ban
En suivant le tutoriel de Fil sur zzz.rezo.net on installe fail2ban :
- sudo apt-get install fail2ban
Le fichier de configuration local est /etc/fail2ban/jail.local
dans lequel on copiera les éléments modifiés par rapport au fichier original de configuration /etc/fail2ban/jail.conf
où dans lequel on ajoutera d’autres règles.
Configuration de fail2ban
En fonction des services qui sont activés sur votre serveur, on active les règles de filtrages spécifiques en les insérant dans le fichier /etc/fail2ban/jail.local
, on ouvre donc ce fichier en écriture :
- sudo nano /etc/fail2ban/jail.local
Les plus importantes sont certainement :
SSH
- [ssh]
- enabled = true
- port = ssh
- filter = sshd
- logpath = /var/log/auth.log
- maxretry = 6
Proftpd si vous utilisez ce server ftp:
- [proftpd]
- enabled = true
- port = ftp,ftp-data,ftps,ftps-data
- filter = proftpd
- logpath = /var/log/proftpd/proftpd.log
- maxretry = 6
Règles de filtrage supplémentaires
w00tw00t
Si vous observez ce genre de choses dans les logs d’apache :
- sudo tail -F /var/log/apache2/access.log
- 217.195.204.194 - - [17/Jun/2010:17:39:26 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 518 "-" "-"
Créez le filtre dans /etc/fail2ban/filter.d/apache-w00tw00t.conf
:
- sudo nano /etc/fail2ban/filter.d/apache-w00tw00t.conf
Insérez la règle suivante dans le fichier :
- #<HOST> - - [29/Apr/2008:22:54:08 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 326
- [Definition]
- # Option: failregex
- # Notes.: regex to match the w00tw00t scan messages in the logfile. The
- # host must be matched by a group named "host". The tag "<HOST>" can
- # be used for standard IP/hostname matching.
- # Values: TEXT
- failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
- # Option: ignoreregex
- # Notes.: regex to ignore. If this regex matches, the line is ignored.
- # Values: TEXT
- ignoreregex =
Puis activez la nouvelle règle dans /etc/fail2ban/jail.local
:
- sudo nano /etc/fail2ban/jail.local
En ajoutant ceci dans la section apache du fichier :
- [apache-w00tw00t]
- enabled = true
- filter = apache-w00tw00t
- port = http,https
- banaction = iptables-allports
- logpath = /var/log/apache*/*access*.log
- maxretry = 1
- bantime = 86400
Lire la source sur le blog de nyrodev.
apache-phpmyadmin
Il se peut que des bots scannent les serveurs pour trouver l’accès à phpmyadmin. Si vous voyez beaucoup d’accès en erreur dans vos fichiers de logs d’apache sur des adresses de type /pma
ou /phpmyadmin
ou autres, c’est certainement le cas. On va donc créer une règle spécifique.
Créez le filtre dans /etc/fail2ban/filter.d/apache-phpmyadmin.conf
:
- sudo nano /etc/fail2ban/filter.d/apache-phpmyadmin.conf
Insérez la règle suivante dans le fichier :
- # Fail2Ban configuration file
- # Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
- #
- [Definition]
- # Option: failregex
- # Notes.: Regexp to match often probed and not available phpmyadmin paths.
- # Values: TEXT
- #
- failregex = [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|phpMyAdmin|myadmin|mysql|mysqladmin|sqladmin|mypma|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)
- # Option: ignoreregex
- # Notes.: regex to ignore. If this regex matches, the line is ignored.
- # Values: TEXT
- #
- ignoreregex =
Puis activez la nouvelle règle dans /etc/fail2ban/jail.local
:
- sudo nano /etc/fail2ban/jail.local
En ajoutant ceci dans la section apache du fichier :
- [apache-phpmyadmin]
- enabled = true
- port = http,https
- filter = apache-phpmyadmin
- logpath = /var/log/apache*/*error*.log
- maxretry = 3
- bantime = 86400
Pour renforcer un peu plus la sécurité de phpMyAdmin, il est possible de limiter le nombre d’essais de login sur celui-ci à l’aide de fail2ban, comme on le fait déjà pour ssh.
Avant d’activer la règle, il faut personnaliser les logs de phpMyAdmin afin qu’ils contiennent les informations nécessaires au repérage des tentatives de login en ajoutant ce qui suit au virtualhost correspondant à phpMyAdmin (cf Sécurisation basique de phpMyAdmin).
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{userID}n %{userStatus}n" pma_combined
- CustomLog /var/log/apache2/phpmyadmin-access.log pma_combined
Et on recharge la configuration Apache pour prendre en compte ces changements :
- sudo service apache2 reload
On peut maintenant créer notre règle personnelle dans /etc/fail2ban/filter.d/phpmyadmin.conf
avec le contenu suivant :
- [Definition]
- denied = mysql-denied|allow-denied|root-denied|empty-denied
- failregex = ^<HOST> -.*(?:%(denied)s)$
- ignoreregex =
Et on teste son bon fonctionnement après avoir effectué une tentative de login sur phpMyAdmin avec un mauvais mot de passe pour remplir notre fichier de log.
- fail2ban-regex /var/log/apache2/phpmyadmin-access.log /etc/fail2ban/filter.d/phpmyadmin.conf
Il ne reste plus qu’à activer notre règle dans /etc/fail2ban/jail.conf
(ou /etc/fail2ban/jail.local
suivant votre système) :
- [phpmyadmin]
- enabled = true
- port = http,https
- filter = phpmyadmin
- logpath = /var/log/apache2/phpmyadmin-access.log
Pour finir, on recharge la configuration de fail2ban :
- sudo service fail2ban reload
Lire la source sur phryneas.de
Recevoir des alertes mails de fail2ban
Si on souhaite recevoir une alerte mail lors de "la mise en cage" d’une adresse IP par fail2ban, il faut créer le fichier jail.local :
- sudo nano /etc/fail2ban/jail.local
Et y insérer ceci :
- [DEFAULT]
- destemail = truc@machin.net
- action = iptables[name=%(__name__)s, port=%(port)s]
- mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]
Puis relancer fail2ban :
- sudo /etc/init.d/fail2ban restart
Si les notifactions par mail ne fonctionnent pas ?
Si vous utilisez postfix et que vous ne disposez pas de la commande mail vous risquez de trouver ce genre de chose dans les logs de fail2ban :
- sudo tail -F /var/log/fail2ban.log
- 2010-06-17 17:32:37,294 fail2ban.actions.action: ERROR printf %b "Hi,\n
- The jail apache-w00tw00t has been started successfully.\n
- Regards,\n
- Fail2Ban"|mail -s "[Fail2Ban] apache-w00tw00t: started" truc@machin.net returned 7f00
Vous disposez probablement de la commande sendmail. Copiez /etc/fail2ban/action.d/mail-whois.conf vers /etc/fail2ban/action.d/mail-whois.local, modifiez ce fichier et remplacez mail par sendmail. Voici un exemple :
- actionban = echo -en "From:root <fail2ban>
- To: <dest>
- Subject: [Fail2Ban] <name>: banned <ip>
- Hi,\n
- The IP <ip> has just been banned by Fail2Ban after
- <failures> attempts against <name>.\n\n
- Here are more information about <ip>:\n
- `whois <ip>`\n
- Regards,\n
- Fail2Ban"|sendmail -t
Lire la source sur le site officiel de fail2ban.
Redémarrage du démon
A la fin de toute modification de la configuration, il est nécessaire de redémarrer le démon par la commande :
- sudo /etc/init.d/fail2ban restart
Quelques autres tutoriels et liens à ce sujet :