安全轮转策略核心是确保日志不丢失、不断、不被未授权访问,需匹配服务机制配置create 0600 root root、missingok、notifempty、delaycompress+compress、sharedscripts五项底线,并验证语法、强制轮转及服务状态。

安全轮转策略的核心不是“防止覆盖”,而是确保日志不丢失、不中断、不被未授权访问,同时避免因轮转失败导致旧日志被意外截断或新日志写入失败。Logrotate 本身不覆盖当前日志,而是通过重命名+通知机制实现无缝切换;所谓“被覆盖”,往往是配置不当(如漏发信号、权限错误、未用 copytruncate 且服务不支持重开)造成的日志丢失假象。
明确日志来源与服务行为
不同日志由不同服务生成,轮转方式必须匹配其日志管理机制:
-
audit.log 来自
auditd:它不自动重开日志文件,必须在postrotate中发送SIGHUP或调用systemctl kill --signal=SIGHUP auditd,否则轮转后新日志仍写入旧 inode,造成“看似覆盖实则错位” -
auth.log / syslog 来自
rsyslog或syslog-ng:需调用其自带的 reload 脚本(如/usr/lib/rsyslog/rsyslog-rotate)或systemctl reload rsyslog,否则新日志可能丢失 -
Java/Python 等自研服务:若不响应日志信号,应启用
copytruncate——先复制内容再清空原文件,虽有极小窗口丢失风险,但比完全停写更可靠
关键配置项必须配齐
以下五项是防止“逻辑覆盖”(即日志中断或错写)的底线配置,缺一不可:
- create 0600 root root:确保新日志文件权限严格,避免非 root 进程无法写入或越权读取
- missingok:日志路径暂不存在时不报错,防止 cron 执行失败干扰其他轮转
- notifempty:空文件不轮转,避免无意义重命名和信号误发
-
delaycompress + compress:延迟压缩保证
postrotate时旧日志仍为明文可读,便于调试;压缩节省空间又不牺牲可用性 -
sharedscripts:多个日志块共用同一段
postrotate,避免重复发信号或脚本冲突
验证是否真正生效
配置写完不等于安全落地,必须做三步验证:
- 语法检查:
logrotate -d /etc/logrotate.d/your-config—— 确认无解析错误,看到完整执行流程 - 强制轮转:
logrotate -f /etc/logrotate.d/your-config—— 观察是否生成.1文件、原日志是否变为空、新日志是否可写 - 服务状态确认:
ls -l /var/log/your.log*+journalctl -u your-service --since "1 minute ago"—— 验证服务未重启、日志连续写入、无“Permission denied”或“Bad file descriptor”报错
SELinux 或权限异常的静默陷阱
在启用 SELinux 的系统(如 RHEL/CentOS)上,即使配置语法全对,也可能因上下文错误导致轮转静默失败:
- 检查日志路径 SELinux 类型:
ls -Z /var/log/audit/audit.log,正常应为system_u:object_r:auditd_log_t:s0 - 若为
unconfined_u或类型不符,手动修复:sudo semanage fcontext -a -t auditd_log_t "/var/log/audit(/.*)?",再restorecon -Rv /var/log/audit - 验证
logrotate进程能否访问目标目录:sudo -u root ls -l /var/log/audit/,确保 root 可读写,且目录无noexec或nodev挂载选项

















