我似乎无法获得一个用于 Fail2Ban 的正则表达式来与 Opensmtpd 一起工作?我可以得到健全性检查吗?

Dav*_*ick 6 regex fail2ban

openSMPTD运行了一个邮件服务器。看来我目前正在受到蛮力攻击,虽然我怀疑他们会进入。话虽如此,我想通过不断的登录尝试来减轻我的服务器的负担。我正在配置fail2ban以禁止违规者。但是,我无法获得正确的正则表达式,这让我很生气!我在 freeBSD 论坛上看到有关fail2ban正则表达式的链接以捕获它。然而,即使那个正则表达式似乎也没有捕捉到他们提供的示例文本。我编辑了他们的正则表达式无济于事。我希望有人能给我一些指示,因为我在正则表达式方面非常薄弱。

我的日志文件如下所示:

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
"

Run Code Online (Sandbox Code Playgroud)

所以让我们分解一下:显示它们是蛮力的那一行是:

f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Run Code Online (Sandbox Code Playgroud)

我们看到身份验证失败的地方。然而,奇怪的是,openSMTPD 并没有在该行中包含要禁止的 IP 地址:我们必须查看其上方的变量数字:

f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Run Code Online (Sandbox Code Playgroud)

哪里可以看到罪犯的ip地址。好吧,够公平。我选择所有文本的当前正则表达式是:

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

虽然fail2ban想要一个更细粒度的。我不确定我是否有一种干净的方法来禁止适当的 ip 地址,因为有可能两个人同时连接,然后选择错误的线路来禁止。

有什么建议?

And*_*idX 1

使用多行正则表达式的更新且更干净的方法是使用版本<F-...>中引入的标签0.10.0,但不幸的是仍然没有很好的记录。

[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>
Run Code Online (Sandbox Code Playgroud)

解释

预过滤器正则表达式用于预处理每一行并捕获会话 ID(我假设它是一部分)f7fa148a43b34578,并识别跨越多行的相同会话。里面的文本<F-CONTENT>是我们感兴趣的部分,将由failregex 处理。

在failregex中,第一个匹配该行与IP地址(如果要发出禁令,则需要该IP地址),并且将其包含在标签中<F-NOFAIL>以指示该行不被视为失败。第二正则表达式是实际的身份验证失败,如果匹配,则fail2ban将阻止先前捕获的IP地址。最后一个被指令包围,表示是时候删除捕获的连接 ID(因为用户已断开连接),并且它也包含在标签之间,因为该行本身也不是失败。<F-MLFFORGET><F-NOFAIL>

您可以使用该fail2ban-regex工具来测试这一点。

我明白为什么链接论坛帖子中的正则表达式对您不起作用;该字符串有多个部分不同。因此,如果您想匹配更通用的情况,显然您需要更改上面的第二个failregex(我没有使用opensmtpd,所以我无法帮助您)。