Sécuriser un serveur

Fail2ban

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.

Installation

apt install fail2ban

Configuration

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
Il est déconseillé de modifier les fichiers de configuration /etc/fail2ban/fail2ban.conf et /etc/fail2ban/jail.conf (ils pourraient être écrasés par une mise à jour), car ces fichiers contiennent les configurations de base que nous pouvons surcharger au moyen d'un ou plusieurs fichiers enregistrés dans /etc/fail2ban/jail.dLe fichier /etc/fail2ban/jail.conf doit servir uniquement de référence et de documentation.

Adapter la configuration à vos besoins

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

Vérification de la configuration

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

Configuration avancée

À 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) .

Création d'une règle anti-w00tw00t

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.

Création d'une règle contre les erreurs 404

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)

Création d'une règle contre la CVE-2012-1823

[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.*"

Références

http://doc.ubuntu-fr.org/fail2ban

https://www.fail2ban.org/wiki/index.php/FAQ_french

https://wiki.visionduweb.fr/index.php?title=Installer_et_utiliser_Fail2ban

https://reseau.developpez.com/tutoriels/fail2ban/