fail2ban lit les logs de divers serveurs (SSH, Apache, …) à la recherche d'erreurs d'authentification répétées et ajoute une règle iptables pour bannir l'adresse IP de la source.
apt install fail2ban
Par rapport au blocage par défaut (600s), un blocage de 1h est bien plus réaliste (3600s), ou même 1 journée (86400s), ou pourquoi pas 1 semaine (604800s). Mais attention que changer le 'bantime' n'agit pas sur le 'findtime' qu'il faut également ajuster, car sinon le 'findtime' par défaut (10mn) est utilisé. L'inconvénient d'un (très ?) grand 'findtime' est qu'il pousse fail2ban à analyser de plus longs fichiers de log, et que ça peut être pénalisant du point de vue des performances, alors c'est à vous de voir. La solution est alors de choisir un grand 'findtime' et un très grand 'bantime' : 3600 et 86400, ou encore 86400 et 604800.
Nous devons bien veiller à ajouter en liste blanche vos adresses IPs les plus communes, car l'erreur est humaine, donc il ne faudrait pas nous bloquer nous-même de l'accès à notre serveur. La liste 'ignoreip' est séparée d'espaces, donc si votre IP est xxx.xxx.xxx.xxx, Il faut créer le fichier dans /etc/fail2ban/jail.d/custom.conf
(ou un autre nom de votre choix) contenant :
[DEFAULT] ignoreip = 127.0.0.1/8 xxx.xxx.xxx.xxx findtime = 86400 bantime = 604800
Le fichier /etc/fail2ban/jail.conf doit servir uniquement de référence et de documentation.
Pour spécifier à fail2ban quels services il doit surveiller, éditons le fichier /etc/fail2ban/jail.d/custom.conf
.
Dans la partie jail nous trouverons des blocs du type :
[ssh] enabled = true port = ssh,sftp filter = sshd logpath = /var/log/auth.log maxretry = 6
Il indique, par ordre, l'activation, les ports à bloquer avec les règles iptables, le nom du filtre (expression régulière) associé, le fichier de log à lire, le nombre maximal de tentatives. Un certain nombre de services disposent de tels blocs de configuration, vous pouvez les activer en passant si besoin false à true. Attention, sur la ligne “port”, “ssh” n'est qu'un alias pour le port standard, comme nous avons changé le port SSH dans la configuration (C'est recommandé de le faire pour éviter les robots qui testent le port 22 par défaut), il faut le préciser à fail2ban. Dans la configuration ci-dessus, ajoutons à la ligne “port”, notre port SSH, par exemple port =ssh,sftp,1612 sans quoi fail2ban ne surveillera que le port 22.
Relançons la configuration avec :
fail2ban-client reload
et nous vérifions si les prisons sont correctement lancées avec :
fail2ban-client status Status |- Number of jail: 3 `- Jail list: apache, vsftpd, ssh
Les prisons peuvent être contrôlées séparément avec les mots clés start, stop et status.
Par exemple :
fail2ban-client stop ssh Jail stopped
Nous pouvons surveiller l'activité avec la commande :
sudo fail2ban-client status ssh
Cette commande retournera le statut de la prison ssh
ou de celle qui sera passée en paramètre avec le nombre de tentatives échouées et la liste des adresses IP bannies.
Une variante de fail2ban-client statut
, qui permet un checklist des adresses IP bannies sur toutes les jails :
nano /usr/local/sbin/checklist_ban chmod 700 /usr/local/sbin/checklist_ban
#!/bin/bash # checklist_ban # # vérifier utilisateur ou droit root avec id -u = 0 # if [ "`id -u`" -eq 0 ]; then JAILS=$(fail2ban-client status | grep " Jail list:" | sed 's/`- Jail list:\t\t//g' | sed 's/,//g') for j in $JAILS do echo "$j $(fail2ban-client status $j | grep " Currently banned:" | sed 's/ |- Currently banned:\t//g')" done exit 0 else echo "This script must be run as root" 1>&2 exit 1 fi
À chaque service est associé un fichier de configuration dans le dossier /etc/fail2ban/filter.d
Une expression régulière définit les lignes du log qui signalent une erreur d'authentification. Il est possible de spécifier via une regex des exceptions (par exemple pour ne pas bannir des IP spécifiques) .
Voici un exemple, pour bannir les désormais célèbres requêtes DFind w00tw00t. Dans le fichier /etc/fail2ban/jail.d/custom.conf
nous ajoutons :
[apache-w00tw00t] enabled = true filter = apache-w00tw00t action = iptables-multiport[name=Apache-w00tw00t,port="http,https",protocol=tcp] logpath = %(apache_access_log)s maxretry = 0 bantime = 864000 findtime = 3600
Notons que contrairement aux autres règles, celle-ci s'attaque au fichier de log des accès (/var/log/apache2/access*.log).
Voici le fichier de règles /etc/fail2ban/filter.d/apache-w00tw00t.conf
:
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".* ignoreregex =
Testons maintenant si la règle s'applique bien en faisant :
fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-w00tw00t.conf
Si vous subissez ce genre d'attaque, vous pourrez voir en sortie de ce programme les adresses des spammeurs. Les règles iptables
seront automatiquement créés en conséquence.
Une adresse IP à l'origine d'un nombre important d'erreur 404 est souvent la conséquence d'un scanner à la recherche de ressources, logiciels ou d'interfaces d'administration à exploiter.
[apache-404] enabled = true port = http,https filter = apache-404 action = iptables-multiport[name=apache-404, port="http,https"] sendmail-whois-lines[name=apache-404, lines=5, dest=root@domaine.eu, sender=fail2ban@domaine.eu] logpath = %(apache_access_log)s bantime = 86400 findtime = 3600 maxretry = 15
[Definition] failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 404 .*$ ignoreregex = .*(robots.txt|favicon.ico|sitemap.xml|sitemap.xml.gz|jpg|jpeg|gif|png|svg)
[php-cve-2012-1823] enabled = true port = http,https filter = php-cve-2012-1823 action = iptables-multiport[name=php-cve-2012-1823, port="http,https"] sendmail-whois-lines[name=php-cve-2012-1823, lines=5, dest=root@domaine.eu, sender=fail2ban@domaine.eu] logpath = %(apache_access_log)s bantime = 604800 findtime = 86400 maxretry = 1
# Fail2Ban configuration file for CVE-2012-1823 # Apache / PHP5.x Remote Code Execution Exploit # http://www.exploit-db.com/exploits/29290/ # # Author : d2air # Licence : CC BY-SA v3.0 # [Definition] failregex = ^<HOST> -.*"POST //%%63%%67%%69%%2D%%62%%69%%6E/%%70%%68%%70?.*" ignoreregex =
Pour se protéger contre l'attaque sur la version CGI de PHP, l'expression régulière possible est :
failregex = ^<HOST> -.*"POST .*cgi.*\?%%2D%%64\+%%61%%6C%%6C%%6F%%77%%5F%%75%%72%%6C%%5F%%69%%6E%%63%%6C%%75%%64%%65%%3D%%6F%%6E\+%%2D%%64\+%%73%%61%%66%%65%%5F%%6D%%6F%%64%%65%%3D%%6F%%66%%66.*"