Lutter contre les attaques par force brute - Debian 9.0 Stretch
Rédigé par Marc GUILLAUME | 7 commentairesTraduction de la page : https://workaround.org/ispmail/stretch/fighting-brute-force-attacks/
Il y a tant de méchants partout. Paranoïa dites-vous ? Bien, jetez un oeil à vos logs de mail. Pendant la préparation de ce guide je pouvais à peine les suivre. Le serveur de mail que j'utilisais pour les tests était loin d'être prêt, et j'avais déjà la visite de bandes d'adresses IP chinoises cherchant à deviner les identifiants des comptes mail de ses utilisateurs. Des canailles parcourent constamment Internet à la recherche de serveurs de mail et inlassablement essayent de trouver un moyen d'en abuser. Faisons donc quelque chose contre ça avant qu'ils ne réussissent à deviner les comptes existants.
Les formes des attaques dans les logs
Il y avait un type d'attaque qui m'a sauté aux yeux :
Jan 24 23:59:34 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:35 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:36 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:37 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242] Jan 24 23:59:38 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]
Un système chinois est en train d'essayer de s'identifier sur mon Postfix encore et encore. Et croyez-moi ou pas, il faisait cela pendant des jours. Mon fichier de log est monté jusqu'à 500 Mo par jour à cause de ces abrutis. Il fallait mettre fin à cela.
Installation
Un logiciel classique que j'installe sur les serveurs pour lutter contre cela est fail2ban. Installez-le sur votre serveur de mail :
apt install fail2ban
Il connaît un grand nombre de structures dans vos fichiers de log qui traduisent quelque chose de nuisible. Le programme tourne en arrière plan et analyse les différents fichiers de log. Chaque nouvelle ligne dans les logs est comparée avec des expressions rationnelles (regular expressions en anglais). Si une correspondance est trouvée il bloque l'adresse IP qui figurait dans les logs.
Ajouter un filtre
Comme fail2ban ne sait pas que la forme « lost connection after AUTH » marque un échec de connexion il faut lui apprendre cette forme. Créez un nouveau fichier /etc/fail2ban/filter.d/postfix-ispmail.conf contenant ceci :
[INCLUDES] before = common.conf [Definition] _daemon = postfix(-\w+)?/(?:submission/|smtps/)?smtp[ds] failregex = ^%(__prefix_line)slost connection after AUTH from \S+\[<HOST>\]$< ignoreregex = [Init] journalmatch = _SYSTEMD_UNIT=postfix.service
Ceci définit un nouveau filtre appelé « postfix-ispmail ». La ligne importante est la ligne failregex. Elle décrit une expression rationnelle qui est une description compréhensible par la machine de ce que vous recherchez. « %(…)s étend une variable. Et « _prefix_line » est une forme décrivant la partie de chaque ligne de log : Jan 25 00:32:01 jen postfix/smtpd[32600]:. la partie postfix/smtpd est définie par la variable « _daemon ». « \S+ » indique qu'à cet endroit vous attendez un ou plusieurs caractères qui ne soient pas un espace. Les crochets doivent être échappés avec un anti-slash car ils ont une signification particulière dans les expressions rationnelles. Et « <HOST> » est une forme spécifique de fail2ban qui représente un adresse IP. Vous devriez vous familier avec les expressions rationnelles, même si elles peuvent vous effrayer dans un premier temps. Elles sont beaucoup plus puissantes qu'effrayantes en réalité. 🙂
Ajouter un bannissement
fail2ban peut maintenant trouver la forme que nous cherchons. Mais où la rechercher ? Et que faire si nous trouvons une correspondance ? C'est notre prochain travail. Créez un autre fichier /etc/fail2ban/jail.d/postfix-ispmail.conf contenant :
[postfix-ispmail] logpath = %(syslog_mail)s enabled = true port = smtp,submission
La première ligne fait référence au nom du filtre. Nous avons appelé le filtre « postfix-ispmail.conf » c'est donc le nom du filtre (on ignore le .conf). Le fichier de log que nous voulons suivre est défini dans la variable syslog_mail qui est définie ailleurs (dans le fichier paths-debian.conf). Il pointe sur le fichier /var/log/mail.log. Nous voulons activer ce bannissement qui est désactivé par défaut dans le fichier /etc/fail2ban/jail.conf. Et finalement nous définissons sur quels ports réseau nous voulons bloquer l'attaquant.
Allons-y
Passons à l'action. Redémarrez fail2ban pour charger les changements de configuration :
service fail2ban restart
Pour savoir ce que fail2ban a fait, regardez le fichier /var/log/fail2ban.log. Dans mon exemple il a noté :
2018-01-24 23:59:34,443 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:35,430 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:36,434 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:37,427 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:38,413 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242 2018-01-24 23:59:38,781 fail2ban.actions [32003]: NOTICE [postfix-ispmail] Ban 122.231.43.242
Il a trouvé la ligne « lost connection after AUTH » mentionnant cette adresse IP chinoise et a décidé de le bannir. La raison figure dans le fichier de configuration /etc/fail2ban/jail.conf :
# “bantime” est le nombre de secondes pendant lesquelles l'hôte est banni. bantime = 600 # Un hôte est banni si il a généré “maxretry” pendant les dernières “findtime” # seconds. findtime = 600 # “maxretry” est le nombre d'échec avant qu'un hôte soit banni. maxretry = 5
Donc par défaut si une telle phrase apparaît au moins maxretry fois dans un délais de findtime secondes, l'IP sera bannie pour bantime secondes. Vous pouvez personnaliser ces valeurs, mais surtout n'éditez pas le fichier jail.conf. À la place créer un fichier jail.local comme décrit dans la page man 5 jail.conf.
La magie du bannissement
Vous demandez-vous comment le bannissement fonctionne en pratique ? fail2ban ajoute une nouvelle rêgle dans votre pare-feu de votre serveur en utilisant iptables. La liste des règles iptables actives peut ête visualisée avec…
iptables -nvL
Cela va afficher vos règles de pare-feu. fail2ban crée une nouvelle chaîne pour chaque bannisement que vous configurez. J'ai appelé mon filtre ispmail-postfix donc ma règle apparaît sous cette forme :
Chain f2b-postfix-ispmail (1 references) pkts bytes target prot opt in out source destination 3 152 REJECT all -- * * 125.106.22.171 … 22 972 REJECT all -- * * 115.213.146.75 … 3 152 REJECT all -- * * 1.195.252.154 … 837 39050 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Mais il existe un affichage plus agréable pour visualiser l'état actuel d'une règle de bannissement :
fail2ban-client status postfix-ispmail
Qui va afficher quelque chose comme ça :
Status for the jail: postfix-ispmail |- Filter | |- Currently failed: 1 | |- Total failed: 168 | `- File list: /var/log/mail.log `- Actions |- Currently banned: 14 |- Total banned: 36 `- Banned IP list: 1.199.191.44 125.106.250.51 115.213.233.184 …
Ajouter d'autres règles de bannissement
Vous pouvez parcourir les filtres prédéfinis soit dans /etc/fail2ban/jail.conf soit en regardant tous les fichiers dans /etc/fail2ban/filter.d/. Par défaut seul le filtre sshd est activé dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf. Mais libre à vous d'activer de nouvelles règles…
- dovecot
- postfix
- postfix-sasl
- roundcube-auth
Tout cela mettra fin aux attaques par force brute et définitivement. Détail amusant… deux jours après avoir écrit cela j'avais déjà banni 1645 adresses IP.
(Si vous trouvez d'autres informations dans les logs que fail2ban ne connaît pas encore, je les ajouterai. En avez-vous trouvé une ?)