logrotate 不支持内置加密,必须用 postrotate 调用 gpg/openssl 手动实现压缩→加密→清理;启用 compress 会导致明文 .1.gz 与加密 .1.gz.gpg 并存,浪费空间且破坏一致性,故须设 nocompress 并禁用 auditd 自压缩。

logrotate 本身不支持加密,所谓“加密归档”必须靠 postrotate 调用 gpg 或 openssl 手动完成;直接在配置里写 compress 会和加密流程冲突,必须禁用并自行串起压缩→加密→清理三步。
为什么不能在 logrotate 配置里直接启用 compress
启用 compress 后,logrotate 会在轮转后自动调用 gzip 并重命名文件为 .1.gz,而你后续在 postrotate 中再对 .1 加密,就会出现两个副本:.1.gz(明文压缩)和 .1.gz.gpg(加密),既浪费空间又破坏一致性。更糟的是,如果没注意顺序,可能加密的是正在被写入的活跃日志。
- 必须显式声明
nocompress - 若需保留一份未压缩的 .1 用于调试,可加
delaycompress,但加密前得手动rm /var/log/audit/audit.log.1 -
compress和delaycompress是互斥逻辑,别混用
postrotate 中如何安全执行 gpg 加密
gpg 在 postrotate 里失败时默认静默退出,旧日志裸奔留在磁盘上——这是生产环境最危险的盲点。必须强制错误中断,并确保密钥环境可用。
- 开头加
set -e或结尾检查$?,失败立即exit 1 - 用绝对路径调用
/usr/bin/gpg,避免 PATH 不一致 - 确认密钥已导入且无密码短语:
gpg --list-keys --homedir /root/.gnupg,--recipient必须匹配 UID - 加
--batch --yes --quiet确保无交互;如密钥在非默认 homedir,必须传--homedir /path/to/gnupghome - 加密目标是轮转后的完整路径,例如
/var/log/audit/audit.log.1,不是audit.log
审计日志(audit.log)的特殊注意事项
CentOS/RHEL 的 auditd 可能自己启用了压缩(max_log_file_action = rotate+compress),这会和 logrotate 的 postrotate 加密打架,导致文件被重复处理或丢失。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 先查
auditctl -s | grep max_log_file_action,若输出含compress,必须改回rotate - 对应修改
/etc/audit/auditd.conf,设max_log_file_action = rotate,然后systemctl restart auditd -
audit.log轮转必须配sharedscripts,否则多个日志段(如audit.log.1,audit.log.2)可能被多次加密 - 权限要严控:
create 0600 root root,防止新日志被非 root 进程覆盖或读取
一个可直接部署的 audit.log 加密归档示例
把下面内容存为 /etc/logrotate.d/audit-encrypted,权限设为 644,属主 root:
/var/log/audit/audit.log {
daily
missingok
notifempty
nocompress
rotate 30
create 0600 root root
sharedscripts
postrotate
set -e
[ -f /var/log/audit/audit.log.1 ] || exit 0
/usr/bin/gzip -c /var/log/audit/audit.log.1 | \
/usr/bin/gpg --batch --yes --quiet --encrypt --homedir /root/.gnupg --recipient 'audit-archiver@prod' > /var/log/audit/audit.log.1.gz.gpg
/bin/rm -f /var/log/audit/audit.log.1
endscript
}
真正难的不是写这几行,而是密钥生命周期管理、解密验证流程、以及当 gpg 因环境变量缺失或权限问题静默失败时,没人知道日志已经裸奔了——这点在上线前必须用 logrotate -f -v /etc/logrotate.conf 实测一遍。










