logo piwik

Réseau - Web - GNU/Linux

2018 14 février

Lutter contre les attaques par force brute - Debian 9.0 Stretch

Rédigé par Marc GUILLAUME | 2 commentaires
Article précédent Mail façon FAI - Debian 9.0 Stretch Article suivant

Traduction 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 ?)

2 commentaires

#1  - Grubshka a dit :

Pour améliorer la sécurité, il existe une règle de bannissement à durée incrémentale très utile. Elle se base sur le fichier fail2ban.log lui-même pour bannir plus longtemps les IP bannies plusieurs fois de suite.
Voir https://github.com/fail2ban/fail2ban/issues/19 et http://blog.shanock.com/fail2ban-increased-ban-times-for-repeat-offenders/

Répondre
#2  - Marc GUILLAUME a dit :

Oui ça semble une très bonne idée, tellement simple qu'on se demande pourquoi on n'y avait pas pensé soi-même, le signe des vraies bonnes idées, c'est qu'elles semblent évidentes une fois qu'un autre les a eues... ;-)

Répondre

Écrire un commentaire

Quelle est la deuxième lettre du mot bnncf ?

Fil RSS des commentaires de cet article

À propos

Yakati.info - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.07s  - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.info
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml