服务器日志留存规范,安全审计必备要点:服务器日志留存规范
服务器日志留存规范的核心是确保日志被完整记录、安全存储并在规定时间内可查。
对于需要满足安全审计的场景,通常要求关键日志至少留存6个月,且不能被随意删除或篡改。
下面从零开始,一步步配置日志轮转、设置留存周期、验证审计可用性。
先搞清楚你的服务器上哪些日志需要留存
安全审计最关注的日志包括:
- 系统登录日志:
/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Debian/Ubuntu) - 系统操作日志:
/var/log/messages或/var/log/syslog - Web服务日志:Nginx的
access.log和error.log,Apache的access_log和error_log - 数据库日志:MySQL的
error.log、慢查询日志 - 应用自定义日志:根据业务代码写入的位置
判断标准:凡是能记录“谁在什么时间做了什么”的日志,都应纳入留存范围。
用logrotate配置日志轮转与留存周期
Linux系统默认使用 logrotate 管理日志轮转。
配置文件通常位于 /etc/logrotate.d/ 目录下,每个服务一个文件。
以Nginx为例,创建或编辑 /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 180
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
关键参数解释:
daily:每天轮转一次,也可用weekly或monthlyrotate 180:保留180个轮转文件,配合daily即留存约180天compress:压缩旧日志节省空间delaycompress:延迟压缩,避免影响正在写入的日志create 0640 www-data adm:创建新日志文件并设置权限
注意:rotate 数值需根据审计要求的留存天数调整。
例如要求留存6个月,daily轮转则设为 rotate 180。
对于系统日志,检查 /etc/logrotate.d/syslog 或 /etc/logrotate.d/rsyslog,确保 rotate 参数满足要求。
手动测试与强制轮转
配置完成后,不要直接等第二天。
用以下命令测试配置是否正确:
logrotate -d /etc/logrotate.d/nginx
-d 表示debug模式,只输出执行过程,不实际轮转。
确认无误后,强制立即轮转一次:
logrotate -f /etc/logrotate.d/nginx
执行后检查 /var/log/nginx/ 目录,应出现类似 access.log.1、access.log.2.gz 的文件。
避坑指南:权限、空间与审计陷阱
权限问题:日志文件权限过松会导致敏感信息泄露,过严可能导致服务无法写入。
建议日志目录权限为 750,日志文件为 640,属主为服务运行用户。
磁盘空间:压缩后的日志仍会占用空间。
用 du -sh /var/log/ 定期检查,并设置监控告警。
如果磁盘写满,新日志无法记录,审计会缺失关键时间段。
日志被篡改:安全审计要求日志具备完整性保护。
可以将日志实时发送到远程syslog服务器或对象存储,本地只保留短期副本。
使用 rsyslog 或 filebeat 转发是常见做法。
时间同步:多台服务器日志时间不一致会给审计带来困难。
确保所有服务器配置NTP时间同步:timedatectl set-ntp true。
验证留存效果与审计可用性
配置完成后,按以下清单验证:
- 检查轮转是否按计划执行:
ls -lh /var/log/nginx/查看文件日期 - 确认留存天数:
find /var/log/nginx/ -name "*.gz" -mtime +180应无输出(表示没有超过180天的旧日志,即留存周期正确) - 验证日志可读:随机解压一个旧日志
zcat /var/log/nginx/access.log.10.gz | head,确认内容完整 - 检查远程备份:如果配置了转发,登录远程服务器确认日志已到达
最终判断标准:在审计要求的时间范围内,任意一天的关键日志都能找到且内容完整,即视为合规。
常见疑问
日志留存多久才符合安全审计要求?
不同行业和地区要求不同,常见的是6个月。建议查阅适用的法律法规或行业标准,以官方要求为准。
logrotate执行了但日志没轮转怎么办?
检查 /var/lib/logrotate/logrotate.status 中的记录时间,确认cron任务是否正常运行:systemctl status logrotate.timer(如果使用systemd定时器)。
能不能直接删除旧日志?
如果日志已备份到远程且确认不再需要,可以删除本地旧文件。但审计期间内,本地或远程必须至少保留一份完整日志。
如何防止日志被恶意删除?
使用 chattr +a 给日志文件添加只追加属性,或配置远程日志服务器,确保本地删除不影响审计追溯。