我的 logrotate 服务失败了。它抱怨 modsecurity 的条目重复。
● logrotate.service - Rotate log files
Loaded: loaded (/lib/systemd/system/logrotate.service; static; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2021-06-08 14:22:07 CST; 2h 54min ago
Docs: man:logrotate(8)
man:logrotate.conf(5)
Main PID: 15370 (code=exited, status=1/FAILURE)
Jun 08 14:22:07 server1.example.com systemd[1]: Starting Rotate log files...
Jun 08 14:22:07 server1.example.com logrotate[15370]: error: modsecurity:1 duplicate log entry for /var/log/apache2/modsec_audit.log
Jun 08 14:22:07 server1.example.com logrotate[15370]: error: found error in file modsecurity, skipping
Jun 08 14:22:07 server1.example.com systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE
Jun 08 14:22:07 server1.example.com systemd[1]: logrotate.service: Failed with result 'exit-code'.
Jun 08 14:22:07 server1.example.com systemd[1]: Failed to start Rotate log files.
但是,/etc/logrotate.d/modsecurity
不包含任何重复项:
/var/log/apache2/modsec_audit.log
{
rotate 14
daily
missingok
compress
delaycompress
notifempty
}
任何想法?
更新:
#grep -r 'modsec_audit.log' /etc/
/etc/logrotate.d/modsecurity:/var/log/apache2/modsec_audit.log
/etc/modsecurity/modsecurity.conf:SecAuditLog /var/log/apache2/modsec_audit.log
/etc/modsecurity/modsecurity.conf-recommended:SecAuditLog /var/log/apache2/modsec_audit.log
所以我经历了:
/etc/modsecurity/modsecurity.conf:SecAuditLog /var/log/apache2/modsec_audit.log
/etc/modsecurity/modsecurity.conf-recommended:SecAuditLog /var/log/apache2/modsec_audit.log
并散列 modsec_audit.log 值,如下所示
#SecAuditLogType Serial
#SecAuditLog /var/log/apache2/modsec_audit.log
然后运行:
systemctl restart logrotate
同样的错误
更新2:
根据@Nikita Kipriyanov 的建议,我仔细检查并完全散列了 /etc/logrotate.d/modsecurity,现在 logrotate 已成功执行(所有 mdosec 日志均已散列):
#systemctl status logrotate
● logrotate.service - Rotate log files
Loaded: loaded (/lib/systemd/system/logrotate.service; static; vendor preset: enabled)
Active: inactive (dead) since Thu 2021-06-10 09:36:53 CST; 52s ago
Docs: man:logrotate(8)
man:logrotate.conf(5)
Process: 20308 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf (code=exited, status=0/SUCCESS)
Main PID: 20308 (code=exited, status=0/SUCCESS)
Jun 10 09:36:52 tester1.example.com systemd[1]: Starting Rotate log files...
Jun 10 09:36:53 tester1.example.com systemd[1]: logrotate.service: Succeeded.
Jun 10 09:36:53 tester1.example.com systemd[1]: Started Rotate log files.
因此,我启用了位于的原始 modsec_audit.log/etc/modsecurity/modsecuirty.conf
以查看会发生什么。同样,一切似乎都正常
# systemctl status logrotate
● logrotate.service - Rotate log files
Loaded: loaded (/lib/systemd/system/logrotate.service; static; vendor preset: enabled)
Active: inactive (dead) since Thu 2021-06-10 09:54:05 CST; 4s ago
Docs: man:logrotate(8)
man:logrotate.conf(5)
Process: 21452 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf (code=exited, status=0/SUCCESS)
Main PID: 21452 (code=exited, status=0/SUCCESS)
Jun 10 09:54:05 tester1.example.com systemd[1]: Starting Rotate log files...
Jun 10 09:54:05 tester1.example.com systemd[1]: logrotate.service: Succeeded.
Jun 10 09:54:05 tester1.example.com systemd[1]: Started Rotate log files.
同样的故事/etc/modsecurity/modsecurity-recommended
,这意味着 logrotate 服务仅有的当我使用时失败/etc/logrotate.d/modsecuirty
,并且碰撞必须是通配符,正如@Nikita Kipriyanov 所建议的那样
答案1
因此,该文件/var/log/apache2/modsec_audit.log
被设置为由/etc/logrotate.d/modsecurity
和某个其他文件轮换,该文件用通配符覆盖它。例如,它可能被定义为/var/log/apache2/*log
,当然包括此文件。我不知道您还有哪些其他 logrotate 配置文件,但很有可能是/etc/logrotate.d/apache2
或类似文件带有通配符。
因此,/var/log/apache2/modsec_audit.log
即使删除了,也会旋转/etc/logrotate.d/modsecurity
。或者更好的是,用一个空文件(或一个只有注释的文件,其中包含指向此 SF 问题和答案的链接,以便轻松记住发生了什么)替换它。这是解决问题最简单的近期解决方案。另一种方法是,您可能希望删除被/var/log/apache2/modsec_audit.log
通配符捕获的文件;没有办法在中设置排除通配符logrotate
,因此您最终需要重写通配符,以便它将包含除此文件之外的所有文件。我认为这很麻烦。
还要记住,/etc/logrotate.d/modsecurity
其他 logrotate 配置可能由某些 OS 软件包安装。更新这些软件包时,这些文件将被重新安装。虽然删除的文件将重新放到位,但编辑的文件不会。配置文件保护将启动,至少您会收到有关更新配置的通知和手动解决的提示。因此,“创建一个空文件”算作编辑,这将为您省去一些麻烦。
而且,为了彻底、永久地解决这个问题,您应该找出这些冲突文件属于哪些软件包,并将错误提交到您的发行版的错误跟踪器中。您可以说服他们修复软件包,以便更新不会包含这些文件,或者这些文件不会发生冲突,这样更新后就不会出现任何问题。
答案2
很可能你在另一个文件中定义了重复的条目。
检查/etc/logrotate.conf
文件是否有重复项,如果此文件中没有重复项,则会出现问题
grep -rnw '/etc/logrotate.d/' -e 'modsec_audit.log'
在其他文件中查找重复项。
您也可以尝试在/etc/logrotate.d/rsyslog
文件中查找:
grep 'modsec_audit.log' /etc/logrotate.d/rsyslog
您可能会在那里发现重复的内容。