我刚刚在 CentOS 服务器上安装了 fail2ban,以应对 SSH 暴力破解尝试。fail2ban 的 sshd.conf 文件中的默认正则表达式与 audit.log 中的任何条目都不匹配,而 SSH 似乎会在此记录所有连接尝试,因此我尝试添加一个匹配的表达式。
我尝试匹配的字符串如下:
type=USER_LOGIN msg=audit(1333630430.185:503332): user pid=30230 uid=0 auid=500
subj=user_u:system_r:unconfined_t:s0-s0:c0.c1023 msg='acct="root": exe="/usr
/sbin/sshd" (hostname=?, addr=<HOST IP>, terminal=sshd res=failed)'
我尝试使用的正则表达式是:
^.*addr=<HOST>, terminal=sshd res=failed.*$
我曾使用 regextester.com 和 regexr 尝试构建正则表达式。测试人员为我提供了此正则表达式的匹配项:^.*addr=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}, terminal=sshd res=failed.*$
但如果我不在<HOST>
正则表达式中使用该标签,fail2ban-regex 会发出警告。但是,使用^.*addr=<HOST>, terminal=sshd res=failed.*$
会给我 0 个匹配项。
到目前为止,我完全陷入了困境,非常感谢任何帮助。我在尝试使用的正则表达式中做错了什么?
答案1
显然,这是 RTFM 的一个案例。经过一番搜索,我找到了一个关于失败2ban网站称它每行进行两次正则表达式匹配,一次匹配时间戳,一次匹配时间戳后面的行的其余部分。audit.log 中的时间戳采用 Epoch 格式,显然第一次正则表达式匹配失败。使用 fail2ban-regex 将 /var/log/secure 与我的 fail2ban sshd.conf 文件进行比较,得到了所需的行为。
正确的解决方案是将我的 jail.conf 的相应部分指向 /var/log/secure。
对于仍然想创建自己的正则表达式的人来说,本节有很多有用的信息,包括这个最终帮助我解决这个问题的小信息:
为了使日志行与您的 failregex 匹配,它实际上必须匹配两个部分:行的开头必须与时间戳模式或正则表达式匹配,行的其余部分必须与您的 failregex 匹配。如果 failregex 以 ^ 开头,则锚点指的是行的其余部分的开头,位于时间戳和中间空格之后。
我希望我的 RTFM 时刻能够对某些人有所帮助。