我有一个dovecot日志文件,其中包含这样的条目:Jun 1 04:16:24 mail dovecot: auth-worker(3158): sql(ryan,193.42.32.170): unknown user (given password: ryan)
我想创建一个fail 2ban过滤器,阻止任何登录尝试,其中用户名与给定的密码相同,到目前为止,我有:failregex = auth-worker.*,<HOST>,.* (Password mismatch|unknown user) .*given password: ryan.*
这只适用于这个特定的密码,但我希望它与任何用户名/密码的组合是相同的,以阻止字典攻击
当前的正则表达式可以工作,但在用例中非常有限
2条答案
按热度按时间5m1hhzi41#
您可以使用this syntax捕获命名捕获组中的用户:
(?P<group_name> ... )
其中...
是您的模式。然后,您可以在模式的其余部分中重用此捕获的内容,方法是使用命名的反向引用,如下所示:
(?P=group_name)
因此,对于您的示例,我假设用户位于IP地址旁边,在这里以粗体显示:
如果是这种情况,那么你可以使用这个正则表达式:
我不知道你是如何在fail 2ban中启用case-insensitive标志的,但我对“密码不匹配”上的大写“P”感到有点惊讶。你可能需要玩这个:
https://regex101.com/r/pTXjmM/1
还要检查用户名模式是否有效。这里我只使用了
\w+
,但也许您的用户可以使用其他字符。如果你有IPv6,你必须适应捕获 ip 组,因为我认为你需要它来禁止它。vaj7vani2#
Fail 2ban有自己的正则表达式来检测IPv4或IPv6,所以它已经在这里做它的工作了
我对它做了一些修改,并确实让它可以用fail 2ban-regex进行测试。
但是我做了另一种方法,我给了ChatGPT一个尝试,提供了这样的问题:
令我非常惊讶的是,chatgpt给了我这个:
我又修了一点,最后,这是最终的结果: