Table of Contents

fail2ban

fail2ban est un logiciel qui permet de bloquer les IPs (avec iptables) des machines qui dépassent un certains seuil de matches dans les logs d'un service (souvent, des tentatives de connexion ratées), pendant un certain laps de temps. Pour cela, il recherche des expressions régulières prédéfinies dans les journaux de différents logiciels : serveur SSH, serveur web apache, serveur de mail, serveur FTP, etc. Il est donc utile pour se prémunir des attaques de type force brute.

Son comportement diffère de celui du fichier /etc/hosts.deny (qui, pour mémoire, blackliste directement toute connexion issue des IPs renseignées dans ce fichier) : fail2ban, lui, puni les abus avérés (et peut lever le ban au bout d'un certain temps).

Installation

aptitude install fail2ban

Sous Debian, les fichiers de configuration sont situés dans /etc/fail2ban :

[DEFAULT]
# whitelist (IPs qui ne seront jamais blacklistées)
ignoreip = 127.0.0.1 192.168.0.0/24
bantime  = 3600      # temps de blocage, en secondes (1 jour)
# Une IP est bannie si elle génère "maxretry" fails pendant les dernières "findtime" secondes
maxretry = 5         # nombre de fail avant blocage
findtime = 600       # intervalle de temps pour vérifier les logs, en secondes (10 min)
# destinataire des mails de rapports
destemail = root@localhost
mta = sendmail

…ainsi qu'une section par service ([ssh], [apache], etc…) qui peut surcharger les paramètres globaux :

[ssh]
enabled = true
port    = ssh
filter  = sshd       # nom du filtre qui est déclaré dans le dossier 
 
# il est possible de définir soit-même des filtres sous forme d'expressions régulières ici :
failregex = courierpop3login: LOGIN FAILED.*ip=\[.*:<HOST>\]
 
logpath  = /var/log/auth.log  # chemin vers le fichier de log du service sshd
maxretry = 6         # surcharge du paramètre maxretry

Après modification d'un fichier de conf, penser à recharger le service :

systemctl restart fail2ban || /etc/init.d/fail2ban restart

Les alertes de fail2ban sont recueillies dans le fichier de log /var/log/fail2ban.log par défaut ; lorsqu'il bloque une machine on obtient :

grep WARNING /var/log/fail2ban.log
 18:2010-07-08 14:36:54,228 fail2ban.actions: WARNING [ssh] Ban 192.168.1.22
 20:2010-07-08 14:46:39,376 fail2ban.actions: WARNING [ssh] Unban 192.168.1.22

fail2ban-client

Permet de voir l'état du serveur fail2ban :

fail2ban-client status
Status
|- Number of jail:      7
`- Jail list:           apache-overflows, apache-noscript, ssh, openvpn, postfix, sasl, dovecot

… ou l'état d'un filtre spécifique :

fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:        /var/log/auth.log 
|  |- Currently failed: 0
|  `- Total failed:     2
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

On peut arrêter/relancer une prison indépendamment des autres :

fail2ban-client stop ssh
fail2ban-client start ssh

Ajouter un ban manuellement

Pour ajouter une adresse IP à une prison (rappel : on liste les jails avec fail2ban-client status, et le flag -vvv, adaptable, permet d'afficher les détails DEBUG):

fail2ban-client -vvv set <JAIL> banip <ADDRESS IP>
# par exemple
fail2ban-client -vvv set apache-overflows banip 45.155.205.233

Pour débloquer une IP qui a été ban (dans cet exemple, dans le jail sshd) :

fail2ban-client set <JAIL> unbanip <ADDRESSE IP>
# par exemple
fail2ban-client set sshd unbanip 10.0.0.1

fail2ban-regex

Permet de tester un fichier de filtre sur un fichier de log, pour voir s'il matche comme prévu :

#fail2ban-regex "ligne de log" "regex à tester"
# OU
#fail2ban-regex <fichier de log> <fichier de filtres>
fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/sasl.conf