Bannir automatiquement les vilains

Rédigé par Alexandre le 09/08/2020

#auto-hébergement #debian #loisir

Toutes mes excuses pour ce titre un peu enfantin, mais je ne trouvais pas de mots courts pour ceux qui tentent de pénétrer une machine. Évidemment, on pourrait appeler ça des pirates, mais trouver un mot de passe par force brute ne requiert aucun talent particulier; je refuse donc d'appeler ces gens des pirates, même si dans les faits, ils le sont.

Bref, dans cet article, je documente la mise en place de fail2ban. Un outil permettant de bannir des IP en fonction de filtres appliqués sur les journaux d'un serveur.

Prérequis

Avant d'installer fail2ban, il est nécessaire de disposer d'un pare-feu applicatif. Ensuite, il est possible d'installer fail2ban :

sudo apt install fail2ban

Configurer

La configuration de Debian est un peu sommaire, je l'adapte pour définir :

  • une adresse de courriel de destination
  • le nom d'envoi des courriels (pratique pour filtrer)
  • qu'en cas de bannissement, un courriel est envoyé
  • une liste blanche d'adresses IP
  • un créneau d'une heure où sont recherchées les anomalies
  • un jour de bannissement pour l'IP ayant générée l'anomalie
  • le nombre d'anomalies avant bannissement
  • surveiller les tentatives échouées de connexion SSH
  • surveiller les anomalies sur mon serveur web (ici nginx)
  • surveiller les récidives

Par défaut, un fichier de configuration visant à observer les tentatives de connexion SSH est fourni : /etc/fail2ban/jail.d/defaults-debian.conf. Ce fichier est un peu sommaire, il faut en créer un autre avec quelques options supplémentaires :

  • # nftables : demander à fail2ban d'utiliser nftables (par défaut, il utilise iptables)
  • # rules : définir les règles pour bannir. Ici, au bout de trois tentatives échouées durant l'heure passée, bannir pendant une journée
  • # notification : recevoir un courriel lorsqu'une IP est bannie
  • ignoreip = : ne pas appliquer les règles sur certaines IP ou plage d'IP

    sudo tee /etc/fail2ban/jail.d/99-custom.conf <<EOF
    [DEFAULT]
    # nftables
    banaction = nftables-multiport
    banaction_allports = nftables-allports
    
    # rules
    findtime = 3600
    bantime = 86400
    maxretry = 3
    
    # notification
    destemail = alexandre@ykn.local
    sender = "$(hostname) <expediteur@ykn.local>"
    action = %(action_mwl)s
    
    ignoreip = 127.0.0.1/8, 192.168.3.0/24
    EOF
    

Supprimer le fichier de configuration par défaut :

sudo rm /etc/fail2ban/jail.d/defaults-debian.conf

Récupérer le port SSH depuis le fichier de configuration :

sshPort=$(grep "^Port" /etc/ssh/sshd_config | awk '{print $2}')

Ajouter la prison :

sudo tee --append /etc/fail2ban/jail.d/99-custom.conf <<EOF

[sshd]
enabled = true
port = $([[ -z $sshPort ]] && echo 22 || echo $sshPort)
EOF

Ajouter la prison pour les récidive :

sudo tee --append /etc/fail2ban/jail.d/99-custom.conf <<EOF

[recidive]
enabled = true
EOF

L'ajout de cette prison nécessite de modifier la configuration de fail2ban lui-même. Créer un fichier personnalisé :

sudo tee /etc/fail2ban/fail2ban.d/99-custom.conf <<EOF
[Definition]
loglevel = ERROR
dbpurgeage = 8d
EOF

Si votre serveur héberge un serveur web public, ajouter les règles qui y sont liées :

sudo tee --append /etc/fail2ban/jail.d/99-custom.conf <<EOF

[nginx-http-auth]
enabled = true

[nginx-limit-req]
enabled = true

[nginx-botsearch]
enabled = true
EOF

De nombreuses autres prisons (jails) sont disponibles et visibles dans le fichier /etc/fail2ban/jail.conf. Il est également possible d'en créer.

Activer la configuration en redémarrant le service :

sudo systemctl restart fail2ban

Utiliser

S'assurer que le service est bien démarré :

systemctl is-active fail2ban

Doit retourner :

active

Afficher le status des prisons activées :

sudo fail2ban-client status

Afficher les statistiques d'une prison activée :

sudo fail2ban-client status sshd

Sortir une IP d'une prison :

sudo fail2ban-client set sshd unbanip 151.12.85.xx

Ajouter manuellement une IP :

sudo fail2ban-client set sshd banip 151.48.78.xx

Exemple

Bannir l'IP 8.8.8.8 (Google) :

sudo fail2ban-client set sshd banip 8.8.8.8

Afficher le début des règles du pare-feu applicatif :

sudo nft list ruleset | head -n5

On peut alors y trouver une ligne spécifique à l'IP 8.8.8.8 :

table inet filter {
	set f2b-sshd {
		type ipv4_addr
		elements = { 8.8.8.8 }
	}

Retirer le banissement :

sudo fail2ban-client set sshd unbanip 8.8.8.8

Cela fonctionne également avec des IPv6.