我目前正在尝试使用 fail2ban 版本 0.11.2-2(在 Debian 11 上运行)捕获基于证书的身份验证(证书正确但密码错误)的失败 SSH 登录尝试。
因此我创建了一个新文件,/etc/fail2ban/filter.d/sshd.local
内容如下
[Definition]
failregex = %(known/failregex)s
^%(__prefix_line)sConnection closed by authenticating user <F-USER>.+</F-USER> <HOST> port \d+ \[preauth\]$
以便过滤规则不会在未来的更新中被覆盖。
为了测试这一点,我自己造成了这种情况几次,并且可以确认sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.local
过滤器找到了日志条目:
- [88] ^(?:[])?\s*(?:<[^.]+.[^.]+>\s+)?(?:\S+\s+)?(?:kernel:\s?[ *\d+.\d+]:?\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:[\d+])?:\s+[[(]?sshd(?:(\S+))?[])]?:?|[[(]?sshd(?:(\S+))?[])]?:?(?:[\d+])?:?)\s+)?(?:[ID \d+ \S+]\s+)?通过身份验证用户关闭连接 .+ port \d+ [preauth]$
但过滤器状态没有任何变化:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| - File list: /var/log/auth.log
- Actions
|- Currently banned: 0
|- Total banned: 0
- Banned IP list:
您是否知道这里什么地方出了问题或者我还应该去哪里寻找?
答案1
可以确认
fail2ban-regex ... /etc/fail2ban/filter.d/sshd.local
过滤器找到了日志条目
默认过滤器(在模式中normal
)将忽略它,并使用其他已经可用的 RE,这有助于考虑会话的 IP(对于在同一会话中发生但没有 IP 的其他消息),并且它会停止第一个 RE匹配消息。同时fail2ban-regex
显示任何匹配的 RE,以及重复项。
因此您还会20) [88] ...
在输出中看到。以及Lines: N lines, 88 ignored, X matched, Y missed
。
为了正确实现这一点(完全不需要进行本地修改):
- 要么设置
filter = %(known/filter)s[publickey=any]
监禁sshd
(因为你的版本必须已经支持它,请参阅https://github.com/fail2ban/fail2ban/discussions/3176#discussioncomment-1768538了解更多信息)。 - 或者干脆被关
mode = aggressive
进sshd
监狱。
要正确处理这个问题(使用本地修改):
- 或者重写
mdre-normal-other
,例如在jail.local中:
[sshd]
filter = %(known/filter)s[mdre-normal-other=""]
failregex = %(known/failregex)s
^Connection closed by ...
- 或者在原始 RE 之前写入自定义 RE...请注意,最新的 fail2ban 版本会对它们进行重新排序(https://github.com/fail2ban/fail2ban/pull/3007):
failregex = ^Connection closed by ...
%(known/failregex)s
不要%(__prefix_line)s
在 中使用failregex
,因为它已经在 中处理了prefregex
,因此需要像这里这样写:
- ^%(__prefix_line)sConnection ...
+ ^Connection ...