归档日志加密必须嵌入logrotate流程,使用lastaction钩子在压缩完成后立即用OpenSSL加密并删除明文,密钥通过root权限隔离文件注入,加密文件需设600权限并属主root:adm,辅以每日扫描校验确保无明文残留。

归档后的日志加密不能只靠“切完再加密”,而要嵌入整个 logrotate 流程,确保从压缩生成那一刻起就是密文。明文存在哪怕几分钟,都可能被未授权用户或恶意进程读取——尤其在共享主机、容器逃逸或权限配置松动的场景下。
用 logrotate 的 lastaction 触发即时加密
logrotate 提供 lastaction 钩子,在所有轮转、压缩动作完成且文件已稳定后执行命令。这是最安全的加密时机,避免对正在写入或尚未压缩完成的文件操作。
- 在 /etc/logrotate.d/nginx 中,将原本的
postrotate替换为lastaction - 加密命令建议使用 OpenSSL(无需额外密钥管理服务):
openssl enc -aes-256-cbc -pbkdf2 -salt -in "$1" -out "$1.enc" -pass pass:YOUR_STRONG_PASSPHRASE - 加密完成后立即删除明文:
rm -f "$1" - 注意:
$1是 logrotate 自动传入的归档文件路径(如 /var/log/nginx/access.log-20260905.gz)
密钥不硬编码,改用环境隔离方式注入
把密码写进配置文件等于公开密钥。生产环境应避免明文口令出现在任何可读配置中。
- 将加密口令存于仅 root 可读的文件(如 /etc/nginx/.log-encrypt-key),权限设为
600,属主为root - 在
lastaction中读取:KEY=$(cat /etc/nginx/.log-encrypt-key 2>/dev/null)openssl enc -aes-256-cbc -pbkdf2 -salt -in "$1" -out "$1.enc" -pass env:KEY - 确保 logrotate 运行身份(通常是 root)能读取该密钥文件,但 Nginx worker 进程无法访问
加密后文件命名与权限同步加固
加密只是第一步,后续访问控制必须跟上,防止密文被窃取后离线暴力破解。
- 加密文件默认继承原文件权限,需显式收紧:
chmod 600 "$1.enc" - 统一属主为
root:adm(或日志审计组),避免 Nginx 进程或其他普通用户拥有读权限 - 可配合
chown root:adm "$1.enc",确保即使目录权限宽松,单个密文文件也无法被越权打开 - 若需解密分析,应限定在专用跳板机或离线环境,使用相同密钥和 OpenSSL 命令:
openssl enc -d -aes-256-cbc -pbkdf2 -salt -in access.log-20260905.gz.enc -out access.log-20260905.gz -pass env:KEY
验证加密是否生效并防止漏掉新归档
自动化脚本容易因路径变更、权限错误或 logrotate 版本差异失效,必须有兜底检查机制。
- 每日定时扫描 /var/log/nginx/ 下所有
.gz文件,确认无一例外都被替换为.gz.enc: - 用
find /var/log/nginx -name "*.gz" | grep -q "." && echo "ERROR: Found plain gz logs!" - 添加简单校验:对任意一个
.gz.enc文件运行file $f,输出应含 "data" 而非 "gzip compressed",确认已加密 - 首次部署后务必手动执行
logrotate -f /etc/logrotate.d/nginx并检查生成结果


















