6 votes

Je n'arrive pas à faire fonctionner une Regex pour Fail2Ban avec Opensmtpd ? Est-ce que je peux avoir une vérification ?

J'ai openSMPTD l'exploitation d'un serveur de messagerie. Il semble que je subisse actuellement des attaques par force brute, même si je doute qu'elles parviennent à entrer. Cela dit, j'aimerais alléger le fardeau que représentent pour mon serveur les tentatives constantes de connexion. Je configure fail2ban d'interdire les contrevenants. Cependant, je n'arrive pas à trouver la bonne expression rationnelle et cela me rend fou ! J'ai vu ce lien sur le forum freeBSD à propos de la fail2ban pour l'attraper. Cependant, même cette regex ne semblait pas capturer le texte d'exemple qu'ils ont fourni. J'ai modifié leur regex en vain. J'espère que quelqu'un pourra me donner quelques conseils car je suis très faible en matière de regex.

Mes fichiers journaux ressemblent à ceci :

Dec 25 20:03:29 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp tls ciphers=TLSv1.2:ECDHE-RSA-AES128-SHA256:128
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp authentication user=info result=permfail
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp disconnected reason=quit
"

Voyons donc ce qu'il en est : la ligne qui montre qu'il s'agit d'un forçage brutal est la suivante :

f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"

Où l'on voit que l'authentification a échoué. Cependant, bizarrement, openSMTPD n'inclut pas l'adresse IP à bannir dans cette ligne : Nous devons regarder un nombre variable au-dessus de celle-ci :

f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>

Où l'on peut voir l'adresse IP de l'auteur de l'infraction. D'accord, je suis d'accord. La regex que j'ai actuellement et qui sélectionne tout le texte est :

^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*

bien que fail2ban veut un modèle plus fin. Je ne suis pas sûr d'avoir un moyen propre d'obtenir l'adresse IP appropriée pour le bannissement, car il est possible que deux personnes se connectent en même temps et que la mauvaise ligne soit choisie pour le bannissement.

Des suggestions ?

1voto

AndroidX Points 166

La façon la plus récente et la plus propre d'utiliser une expression rationnelle sur plusieurs lignes est d'utiliser la fonction <F-...> qui ont été introduites dans le 0.10.0 et ne sont malheureusement pas encore bien documentés.

[Definition]

prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$

failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>)</F-NOFAIL>
            smtp failed-command command="AUTH LOGIN \(password\)" result="535 Authentication failed"
            <F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>

Explication

L'expression rationnelle pré-filtre est utilisée pour prétraiter chaque ligne et capturer l'identifiant de la session, qui est, je suppose, l'identifiant de la session. f7fa148a43b34578 et identifient la même session qui s'étend sur plusieurs lignes. Le texte à l'intérieur <F-CONTENT> est la partie qui nous intéresse et qui sera traitée par la failregex.

Dans l'index de défaillance, l'élément premier correspond à la ligne contenant l'adresse IP, qui sera nécessaire si une interdiction doit être prononcée, et qui est incluse dans la balise <F-NOFAIL> pour indiquer que la ligne n'est pas considérée comme un échec. Les deuxième est l'échec réel de l'authentification, qui, s'il correspond, bloquera l'adresse IP précédemment capturée. Les dernier on est entouré par les <F-MLFFORGET> pour signaler qu'il est temps d'abandonner l'identifiant de connexion capturé (puisque l'utilisateur s'est déconnecté), et il est également inclus entre les directives <F-NOFAIL> parce que cette ligne en elle-même n'est pas non plus un échec.

Vous pouvez utiliser le fail2ban-regex pour tester cela.

Je comprends pourquoi la regex de l'article du forum lié n'a pas fonctionné pour vous ; la chaîne est différente dans plus d'une partie. Il est donc évident que vous devrez modifier la 2ème failregex ci-dessus si vous souhaitez qu'elle corresponde à des cas plus génériques (je n'utilise pas opensmtpd, je ne peux donc pas vous aider sur ce point).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X