我似乎无法获得 Fail2Ban 与 Opensmtpd 配合使用的正则表达式?我可以进行健全性检查吗?

我似乎无法获得 Fail2Ban 与 Opensmtpd 配合使用的正则表达式?我可以进行健全性检查吗?

我正在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
"

让我们分析一下:显示他们正在暴力破解的那行是:

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

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

f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>

我们可以看到罪犯的 IP 地址。好吧,这很公平。我目前选择所有文本的正则表达式是:

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

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

有什么建议么?

答案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>

解释

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

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

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

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

相关内容