我知道如何使用fail2ban以及如何配置监狱,但我对它的实际工作原理感到不舒服。
问题是,有一个特殊的监狱选项激起了我的好奇心:findtime
。
当我配置过滤器时,需要使用主持人关键字(匹配IP地址),以便fail2ban可以知道要比较的IP,并在必要时禁止。好吧。
但是时间没有这样的事情:fail2ban 无法知道将一行添加到日志文件的确切时间,因为没有TIME
关键字,对吗?实际上,它可以在任何时间线上扫描文件,并且仍然可以工作。
我猜这意味着fail2ban正在定期扫描文件:它在内部设置扫描时间,以便它可以findtime
通过比较自己的扫描日期来处理选项。
首先,我说得对吗?如果是这样,扫描频率是多少?如果有很多大的日志文件需要经常扫描,难道不会成为瓶颈吗?
那么,如果扫描频率优于findtime
选项会发生什么情况呢?这是否意味着fail2ban适应了findtime
它发现的最小选项来设置其最小扫描频率?
答案1
首先。这(也许)不是一个答案,但也许比评论更好(而且有点长)。
时间戳
找到你的陈述:
实际上,它可以在任何时间线上扫描文件,并且仍然可以工作。
与文档冲突。你是什么意思工作?
如果您要创建自己的失败正则表达式,您应该了解以下一些事项:
[...]
为了使日志行与您的失败正则表达式匹配,它实际上必须匹配两部分:行的开头必须匹配时间戳模式或正则表达式,该行的其余部分必须与您的失败正则表达式匹配。如果failregex 使用前导 ^ 锚定,则锚点指的是时间戳和中间空格之后的行剩余部分的开头。
当前未记录与时间戳匹配的模式或正则表达式,并且无法供用户阅读或设置。看Debian 错误 #491253。如果您的日志具有fail2ban 不期望的时间戳格式,则会出现问题,因为它将无法匹配任何行。因此,您应该针对示例日志行测试任何新的失败正则表达式(如下面的示例所示),以确保它匹配。如果fail2ban无法识别您的日志时间戳,那么您有两个选择:重新配置您的守护进程以使用更常见格式的时间戳进行日志记录,例如上面的示例日志行;或提交错误报告,要求包含您的时间戳格式。
请注意,日志文件可以是配置好的包括时间戳以及格式的时间戳。 (其中包括消息正如评论中提到的。)
另请参阅此线程,特别是消息 #14 和 #19:
两个例子:
请注意,您还可以使用以下命令进行测试:
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
1 无时间戳:
$ fail2ban-regex ' [1.2.3.4] authentication failed' '\[<HOST>\] authentication failed'
Running tests
=============
Use failregex line : \[<HOST>\] authentication failed
Use single line : [1.2.3.4] authentication failed
Results
=======
Failregex: 0 total
Ignoreregex: 0 total
Date template hits:
Lines: 1 lines, 0 ignored, 0 matched, 1 missed
|- Missed line(s):
| [1.2.3.4] authentication failed
`-
2 带时间戳:
$ fail2ban-regex 'Jul 18 12:13:01 [1.2.3.4] authentication failed' '\[<HOST>\] authentication failed'
Running tests
=============
Use failregex line : \[<HOST>\] authentication failed
Use single line : Jul 18 12:13:01 [1.2.3.4] authentication failed
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] \[<HOST>\] authentication failed
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] MONTH Day Hour:Minute:Second
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
扫描次数
评估反应时间是相当困难的。 Fail2ban 等待1秒在检查要扫描的新日志之前。在大多数情况下这应该没问题。但是,登录失败的次数可能会多于 maxretry 指定的次数。
在这方面还请参阅此线程:回复:Bug#481265:fail2ban:轮询间隔不可配置。
但下可选但推荐的软件一找到加明。
Gamin 是一个文件更改监视器。 Gamin 极大地受益于支持“inotify”的内核。因此,不再需要主动轮询来获取文件修改。
如果安装了 Gamin 并且backend
injail.conf
设置为汽车(或者加明) - 将使用Gamin。
答案2
重要的是要注意,日期不必位于行的开头,当且仅当您让正则表达式使用通配符“识别”它时。
例如:假设tomcat7
日志文件中有一些像这样的行:
1.2.3.4 - - [13/Feb/2017:02:47:44 -0300] "GET /manager/html HTTP/1.1" 401 2486
1.2.3.4 - - [13/Feb/2017:02:47:45 -0300] "GET /manager/html HTTP/1.1" 401 2486
1.2.3.4 - - [13/Feb/2017:02:47:45 -0300] "GET /manager/html HTTP/1.1" 401 2486
1.2.3.4 - - [13/Feb/2017:02:47:45 -0300] "GET /manager/html HTTP/1.1" 401 2486
1.2.3.4 - - [13/Feb/2017:02:47:45 -0300] "GET /manager/html HTTP/1.1" 401 2486
1.2.3.4 - - [13/Feb/2017:02:47:46 -0300] "GET /manager/html HTTP/1.1" 401 2486
看看它们,日期不是开头,这应该是一个问题。
尽管如此,如果您使用具有“日期空间”的正则表达式对其进行测试,则测试将匹配:
$ fail2ban-regex '1.2.3.4 - - [13/Feb/2017:02:47:44 -0300] "GET /manager/html HTTP/1.1" 401 2486' '<HOST> - - \[.*\] "GET .* HTTP/1.1" 40\d \d+$'
Running tests
=============
Use regex line : <HOST> - - \[.*\] "GET .* HTTP/1.1" 40\d \d+$
Use single line: 1.2.3.4 - - [13/Feb/2017:02:47:44 -0300] "GET /man...
Matched time template Day/MONTH/Year:Hour:Minute:Second
Got time using template Day/MONTH/Year:Hour:Minute:Second
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] <HOST> - - \[.*\] "GET .* HTTP/1.1" 40\d \d+$
`-
Ignoreregex: 0 total
Summary
=======
Addresses found:
[1]
1.2.3.4 (Mon Feb 13 02:47:44 2017)
Date template hits:
2 hit(s): Day/MONTH/Year:Hour:Minute:Second
Success, the total number of match is 1