关键机制是chattr +a:它从vfs层强制仅允许>>追加,禁止>覆盖、truncate清空及直接修改;但不阻止rm/mv删除重命名,需配合目录750权限、文件640权限、logrotate动态管理+a及ext4文件系统使用。

在 Linux 系统中,让日志文件“只追加、不修改”,关键不是单靠 chmod,而是组合使用 属组权限 + chattr +a 属性 + 目录控制。+a 是核心机制,它从内核 VFS 层限制写入方式,确保只有 >> 追加可行,> 覆盖、truncate 清空、直接编辑等操作全部被拒。
设置 chattr +a 锁定追加模式
这是防误写和覆盖的基石。+a 不阻止删除(rm)或重命名(mv),但它能拦住最常见的人为/脚本误操作:
- 用 root 执行:
sudo chattr +a /var/log/myapp/app.log - 验证是否生效:
lsattr /var/log/myapp/app.log→ 应显示类似----a----------e---(含小写 a) - 测试追加:
echo "$(date) INFO" >> app.log→ 成功 - 测试覆盖:
echo "reset" > app.log或truncate -s 0 app.log→ 报Permission denied
配合合理的属主属组与基础权限
仅设 +a 不够,攻击者若获得写权限仍可能删文件。必须同步收紧基础权限:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 日志目录(如
/var/log/myapp)设为750:chmod 750 /var/log/myapp,确保非授权用户无法进入或列目录 - 日志文件属主为服务运行用户(如
myapp或syslog),属组为统一管理组(如adm或syslog) - 日志文件权限设为
640:chmod 640 app.log→ 仅属主可写,同组可读,其他无权
保障 logrotate 安全轮转
轮转过程会新建文件,若不干预,新日志默认无 +a 属性,且权限可能错乱:
- 在
/etc/logrotate.d/myapp中启用:create 640 myapp adm,确保新文件继承正确权限和属组 - 避免使用
copytruncate(它会先复制再清空原文件,绕过 +a 保护) - 推荐方案:在
prerotate中执行chattr -a app.log,在postrotate中立即chattr +a app.log,保持活跃日志始终受控
进阶防护:目录级 +a 与归档锁定
对整套日志目录持续加固,或对已归档日志做最终封存:
- 对整个日志子目录递归加 +a:
sudo chattr -R +a /var/log/myapp/→ 此时目录本身也无法被rm或mv(这是 +a 对目录的特殊行为) - 压缩归档后的日志(如
app.log-20260925.gz)移至专用审计目录后,改用chattr +i彻底锁定(不可改、不可删、不可重命名),但需手动-i后才能解压或轮转 - +a 仅在 ext4 文件系统稳定支持;XFS/Btrfs 上行为不可靠,生产环境请确认文件系统类型










