一次logroate未生效的根因和解决过程
故障现象
- 监控系统预警某服务器A的存储使用用率超过80%。经查发现Linux的系统日志文件/var/log/messages在某个时间起不再轮换并删除归档文件,形成一个超大文件,占用服务器的大量本地存储。
故障环境
- centos7.6
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
故障根因
- 某次信息安全测评过程中对/var/log/messages文件追加了不可修改扩展属性a,导致logroate对/var/log/messages失效。
改进措施
修改/etc/logrotate.d/syslog文件,在日志轮换前删除/var/log/messages的a属性,在日志轮换后增加a属性。
- 修改前的 /etc/logrotate.d/syslog文件内容如下:
# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
#
- 修改后的 /etc/logrotate.d/syslog文件内容如下:
# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
compress
missingok
sharedscripts
prerotate
/bin/chattr -a /var/log/messages 2>/dev/null || true
endscript
postrotate
/bin/chattr +a /var/log/messages 2>/dev/null; /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
#
故障解决过程
- 监控系统预警某服务器A的存储使用用率超过80%:
- 登录服务器A,通过
du -h --max-depth=1
命令层层往下查,查看到/var/log/messages文件非常大,并且从某个日期起不再轮换。 - 查看logrotate的轮换状态文件,以确定是否执行了具体切割任务。发现/var/log/messages在前一天被轮换了:
# cat /var/lib/logrotate/logrotate.status
logrotate state -- version 2
...(手工删除部分显示)
"/var/log/messages" 2023-3-xx-3:14:1
...(手工删除部分显示)
#
- 执行
/usr/sbin/logrotate -d /etc/logrotate.d/syslog
命令,在调试模式看查看logrotate运行情况,发现/var/log/messages竟然未达到轮换的大小,猜测应该是logrotate未读取到/var/log/messages的真实大小。
# /usr/sbin/logrotate -d /etc/logrotate.d/syslog
...(手工删除部分显示)
considering log /var/log/messages
log does not need rotating (log size is below the 'size' threshold)
...(手工删除部分显示)
- 查看logrotate轮换模式:在/etc/logrotate.d/syslog文件未指定轮换模式,查看/etc/logrotate.conf设置默认的轮换模式为create,即把当前日志文件改名再新建一个同名的日志文件。因此推测logrotate对 /var/log/messages 无改名权限。
# cat /etc/logrotate.conf
...(手工删除部分显示)
# create new (empty) log files after rotating old ones
create
...(手工删除部分显示)
- 查看/var/log/messages的读写属性及扩展属性,发现其拥有仅追加扩展属性a。有关 Linux 文件的扩展属性,请参见 文章Linux 文件权限 文件的扩展属性 文件或目录的默认权限 UMASK值详解
# ll /var/log/messages
-rw------- 1 root root XXX XXX 4 19:52 /var/log/messages
# lsattr /var/log/messages
-----a---------- /var/log/messages
- 哪什么时候对/var/log/messages增加了权限扩展属性a呢?根据最后一次轮换日期回溯,发现在某次信息安全测评中的Linux的基线检查发现如下漏洞并完成了整改。
检测方法
使用命令查看/var/log/messages文件是否只可追加不可修改:
#lsattr /var/log/messages
判定依据
/var/log/messages文件的权限第六位为a则合规,否则不合规。
加固方案参考配置操作
1、更改/var/log/messages文件属性
#chattr +a /var/log/messages #如果不存在则忽略
待跟进事项
- /var/log/messages为什么产生了大量日志?要分析其来源,并判断是否适合写到此文件中。