regex 用于重复模式的正则表达式

nfs0ujit  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(146)

我有一个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.*
这只适用于这个特定的密码,但我希望它与任何用户名/密码的组合是相同的,以阻止字典攻击
当前的正则表达式可以工作,但在用例中非常有限

5m1hhzi4

5m1hhzi41#

您可以使用this syntax捕获命名捕获组中的用户:
(?P<group_name> ... )其中...是您的模式。
然后,您可以在模式的其余部分中重用此捕获的内容,方法是使用命名的反向引用,如下所示:
(?P=group_name)
因此,对于您的示例,我假设用户位于IP地址旁边,在这里以粗体显示:

  • Jun 1 04:16:24 mail dovecot:auth-worker(3158):SQL(ryan,193.42.32.170):未知用户(给定密码:ryan)*

如果是这种情况,那么你可以使用这个正则表达式:

auth-worker.*?sql\((?P<user>\w+),(?P<ip>\d+(?:\.\d+){3}).*?(?:password mismatch|unknown user)\s*\(given password:\s*(?P=user)\)

我不知道你是如何在fail 2ban中启用case-insensitive标志的,但我对“密码不匹配”上的大写“P”感到有点惊讶。你可能需要玩这个:
https://regex101.com/r/pTXjmM/1
还要检查用户名模式是否有效。这里我只使用了\w+,但也许您的用户可以使用其他字符。如果你有IPv6,你必须适应捕获 ip 组,因为我认为你需要它来禁止它。

vaj7vani

vaj7vani2#

Fail 2ban有自己的正则表达式来检测IPv4或IPv6,所以它已经在这里做它的工作了
我对它做了一些修改,并确实让它可以用fail 2ban-regex进行测试。
但是我做了另一种方法,我给了ChatGPT一个尝试,提供了这样的问题:

create a regular expression from the following log entry, that detects if a given username matches the same password:

Jun  1 02:47:50 mail dovecot: auth-worker(2587): sql(holly,193.42.32.97): unknown user (given password: holly)

令我非常惊讶的是,chatgpt给了我这个:

^(.*?) dovecot: auth-worker\(\d+\): sql\((\w+),.*?\): unknown user \(given password: \2\)$

我又修了一点,最后,这是最终的结果:

auth-worker.*(.*?).*(\w+),<HOST>.*?\).*(Password mismatch|unknown user).*given password: \2\)

相关问题