logrotate 本身不支持自动数字签名,但可通过 postrotate 调用 gpg 或 openssl 在轮转后追加签名,需确保私钥安全、过程原子性及验证路径明确,并配合稳健轮转策略与定期验证机制。

生产环境日志轮转归档本身不依赖数字签名,logrotate 原生不支持对归档文件自动签名。但可通过组合 logrotate + 签名工具(如 gpg 或 openssl)在轮转后追加签名步骤,实现可验证的归档完整性保障。关键在于将签名作为 postrotate 的一部分,且必须确保私钥安全、签名过程原子性、验证路径明确。
配置 logrotate 实现可靠轮转归档
先确保日志轮转策略稳健,这是签名的前提:
-
按需选择触发条件:高流量服务建议用
daily+size 100M双条件,避免单一大日志阻塞轮转 -
保留与压缩要平衡:设
rotate 30保留一个月归档,启用compress和delaycompress,保证最新一份可读、其余压缩省空间 -
权限与属主必须显式声明:用
create 0640 www-data adm(Debian/Ubuntu)或create 0640 nginx root(CentOS/RHEL),防止新日志因权限问题无法写入 -
务必包含 postrotate 通知机制:例如 Nginx 用
kill -USR1 $(cat /var/run/nginx.pid),rsyslog 用systemctl kill --signal=USR1 rsyslog,确保服务切换到新日志文件
在轮转后自动添加 GPG 数字签名
GPG 是最实用的签名方式,适合自动化集成:
-
前提:以 root 身份生成专用密钥对(不设密码短语,便于脚本调用),导出公钥供后续验证:
gpg --batch --passphrase '' --quick-generate-key "nginx-log-signer@prod" rsa4096 sign 0 -
修改 logrotate 配置,在
postrotate段末尾追加签名命令(绝对路径):gpg --quiet --batch --yes --detach-sign --armor /var/log/nginx/access.log.1
这会生成access.log.1.asc文件,与归档一一对应 -
签名目标要精准:logrotate 轮转后,
.1是最新归档(未压缩时),若启用了delaycompress,则签名对象应为.1;若已压缩,则签.1.gz,并调整后缀为.1.gz.asc
使用 OpenSSL 签名(适用于无 GPG 环境)
若系统受限只能用 OpenSSL,流程稍重但可控:
-
准备签名密钥:提前生成离线保管的私钥(如
/etc/ssl/private/logrotate-sign.key),对应公钥分发给审计方 -
在 postrotate 中执行签名:
openssl dgst -sha256 -sign /etc/ssl/private/logrotate-sign.key -out /var/log/nginx/access.log.1.sig /var/log/nginx/access.log.1 - 注意文件状态同步:OpenSSL 签名不改变原文件时间戳,但需确保签名命令执行成功后再退出 postrotate,否则 logrotate 认为轮转失败
验证签名与运维注意事项
签名不是摆设,必须有配套验证机制:
-
定期抽检验证:用
gpg --verify access.log.1.asc access.log.1或openssl dgst -sha256 -verify pubkey.pem -signature access.log.1.sig access.log.1 - 状态文件与日志需同步备份:/var/lib/logrotate/status 记录轮转时间,应与归档文件一同存入只读归档存储(如 S3 + WORM 模式)
- 禁止在私钥所在机器上长期留存明文日志:轮转+签名完成后,建议通过 rsync + ssh 加密通道将归档及签名文件推送至独立审计服务器
-
测试必须覆盖全流程:用
logrotate -f -v /etc/logrotate.d/nginx强制执行,检查是否生成.asc或.sig,再立即验证











