这是我在 serverfault 上提出的第一个问题;)
我的配置:Debian 9.6、tomcat 8.5.14.0、fail2ban 0.9.6-2
我已经创建了一个 tomcat8 过滤器来检测多个 404 错误
/etc/fail2ban/filter.d/tomcat.conf:
[INCLUDES]
[Definition]
failregex = ^<HOST>.*\/.*\/.*404
ignoreregex =
/etc/fail2ban/jail.d/defaults-debian.conf:
[tomcat]
enabled = true
port = http,https,8080,8443
ignoreip = 127.0.0.1/8 MyIP/8 MyIP/16
bantime = 1728000
findtime = 5
filter = tomcat
logpath = /var/log/tomcat8/localhost_access_log.*.txt
maxretry = 3
过滤器有效,但问题是,一天内可能没有对我的 tomcat web 应用程序的访问请求,因此我可能没有 tomcat 创建的当天的任何日志访问权限(我注意到该文件是在第一个请求时创建的)...因此,有关 fail2ban 工作的文件不存在...例如,我收到此错误:
2018-11-20 04:56:11,771 fail2ban.filterpoll [18667]: ERROR Unable to get stat on /var/log/tomcat8/localhost_access_log.2018-11-19.txt because of: [Errno 2]
No such file or directory: '/var/log/tomcat8/localhost_access_log.2018-11-19.txt'
并且 fail2ban 停止了我的 tomcat jail......
最好的方法是什么?
在 cron 中,检测日志访问文件是否存在,如果不存在则为当天创建它(使用 dateTime 参数的触摸方法)?
编写一个 curl 请求脚本来强制 tomcat 创建日志访问文件,并强制 fail2ban 重新启动?
其他 ?
答案1
基于ASCII 格式设置,只需创建一个 cron。他遇到了同样的问题:
使用 cron 设置日志轮换
我在 Tomcat 轮换日志文件的方式上遇到了各种错误,因此我禁用了 Tomcat 的日志轮换并使用 cron...
如你看到的:
00 00 * * * /bin/cp /var/log/tomcat8/localhost_access_log.txt /var/log/tomcat8/localhost_access_log.$(/bin/date +\%Y-\%m-\%d -d "yesterday").txt && /usr/bin/truncate -s 0 /var/log/tomcat8/localhost_access_log.txt
这会将日志文件的内容复制到新文件,然后删除原始文件的内容。fail2ban 会将此事件检测为日志轮换