我尝试使用 fail2ban 创建暴力破解保护。使用 fail2ban 测试,它匹配我想要匹配的日志,但使用我的测试暴力破解网站并有 7 次以上登录失败,它不会禁止我的 IP 地址。
筛选:
[Definition]
failregex = <HOST>:.*"POST /login.*" 200 .*$
ignoreregex =
监狱:
[shop-brute-force]
enabled = true
filter = shop-brute-force
logpath = /etc/exampleorg/shop/log/access.log
maxretry = 7
findtime = 60
bantime = 900
ignoreip =
日志示例(使用...、88.88.88.88 和 example.org 匿名化):
2022/04/01 08:09:25.413720 88.88.88.88:10729 - - [01/Apr/2022:08:09:25 +0000] "POST /login?target=%2Fshop%2F HTTP/1.1" 200 2192 "https://example.org/login?target=%2Fshop%2F" "..."
测试:
Running tests
=============
Use failregex filter file : shop-brute-force, basedir: /etc/fail2ban
Use log file : /home/user/test.log
Use encoding : UTF-8
Results
=======
Failregex: 3 total
|- #) [# of hits] regular expression
| 1) [3] <HOST>:.*"POST /login.*" 200 .*$
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [106] Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
`-
Lines: 106 lines, 0 ignored, 3 matched, 103 missed
[processed in 0.02 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 103 lines
答案1
我尝试使用 fail2ban 创建暴力破解保护
failregex = ... 200 ...
这不一定是暴力破解尝试,因为 200 是常规响应,表示 OK... 通常,像 401 或 403 这样的代码表示未经授权的尝试,或者如果服务以 200 响应,它会在某些日志文件或日志中写入额外的日志条目(不一定写入access.log
)。但这里还有另外一些事情非常值得怀疑,更不用说理论上可以使用其他方法进行暴力破解POST
。
但是我的测试强制该网站登录失败7次以上......
Lines: 106 lines, 0 ignored, 3 matched, 103 missed
您没有提供与这 7 次尝试相对应的完整日志摘录。并且fail2ban-regex
只找到 3 个与您的相关的匹配项failregex
(这根本不好,例如未锚定且有 catch-all,但没关系 - 匹配项不在那里)。可能它会将其他内容记录为您的示例中的单个日志行,因为您的 RE 基本上与此相匹配。因此,请使用与您所做的所有 7 次尝试相对应的完整日志摘录来更新您的问题。
最后但同样重要的一点是,更好的 RE 看起来应该是这样的:
failregex = ^\s*<ADDR>:\d+ [^"]*"[A-Z]+ /login\b[^"]*" 200\b
但是我仍然不确定您是否真的会使用它(由于我上面提到的第 200 个问题等)。
如果只是测试(有 3 条日志行),而你确实在实际日志中看到了所有 7 条日志行,则可以检查此有关 fail2ban 无法禁止的可能原因的常见问题解答。例如,它可能不正确backend
(将其设置auto
为与文件相关的监控)或不合适的禁止操作或 fail2ban 方面存在一些错误(也请检查 fail2ban.log)。