我打开了 journalctl,发现一个罪犯不断用 postfix 中的身份验证失败来攻击我。我默认启用了标准 postfix-sasl 过滤器,据我所知,它运行良好。
它没有抓住这个违规者,当然我很好奇为什么。所以我将合法的后缀禁令与此特定条目进行了比较,只注意到 LOGIN 不是大写的。
合法禁令 =Jul 03 11:47:30 domain.ca postfix/smtpd[9298]: warning: unknown[87.120.84.169]: SASL LOGIN authentication failed: authentication failure
没有抓住 =Jul 03 11:50:15 domain.ca postfix/smtpd[9554]: warning: unknown[190.119.186.242]: SASL login authentication failed: authentication failure
所以我进入了我的过滤器/etc/fail2ban/filter.d/postfix-sasl.conf
添加了这个:
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:login|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
由此:
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
我所做的就是改变登录到登录并抓获了这名罪犯。
由于我对 Python 正则表达式很不擅长,而且我找不到简单的文档。我该如何简单地添加一行来捕捉这些输入变量的大小写(?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5)
?
ps 由于这是 postfix 生成的日志,为什么它会为一个日志输入 LOGIN,为另一个日志输入 login ...不同类型或方法的身份验证失败,并且作者为每个日志写了不同的大写字母的条目?
谢谢
答案1
我该如何简单地添加一行来捕获大写和小写字母?
甚至可能完全不区分大小写。如果您的 fail2ban 使用 python3(现在大多如此) - 这会将括号中的本地部分切换为大小写敏感。
- (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5)
+ (?i:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5)
或者为了使整个 RE 不区分大小写(或对于 python2),只需(?i)
在 RE 的开头添加全局标志:
- ^%(__prefix_line)swarning: ...
+ (?i)^%(__prefix_line)swarning: ...
既然这是 postfix 生成的日志,为什么它会为一个日志输入 LOGIN,为另一个日志输入 login...
如果不检查该日志条目的整个源代码,就很难说。在这种情况下,这可能只是客户端请求中提供的原始外部数据,lOgIn
或者PlAiN
理论上也是可能的,因为根据 RFC 5321,SMTP 命令动词不区分大小写(不知道 postfix 到底允许什么)。