Bannir automatiquement les vilains
Rédigé par Alexandre le 2020-08-09
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.