生产环境日志轮转归档本身不依赖数字签名,logrotate 原生不支持自动签名,但可通过组合 logrotate 与 gpg 或 openssl 在 postrotate 中追加签名实现完整性保障,需确保私钥安全、过程原子性及验证路径明确。

生产环境日志轮转归档本身不依赖数字签名,logrotate 原生不支持自动签名。但可通过组合 logrotate + 签名工具(如 gpg 或 openssl)在轮转后追加签名步骤,实现可验证的归档完整性保障。关键在于将签名作为 postrotate 的一部分,且必须确保私钥安全、签名过程原子性、验证路径明确。
先配稳轮转:避免签名失效的前提
签名建立在可靠轮转之上。若轮转失败、文件被覆盖或权限异常,签名就失去意义。
-
双条件触发更稳妥:高流量服务(如 Nginx、Java 应用)建议同时设
daily和size 100M,防止单一大日志阻塞轮转周期 -
保留与压缩要协同:设
rotate 30保留一个月归档;启用compress和delaycompress,保证.log.1可读、其余自动压缩省空间 -
权限与属主必须显式声明:用
create 0640 www-data adm(Debian/Ubuntu)或create 0640 nginx root(CentOS/RHEL),防止新日志因权限问题无法写入 -
务必通知服务重载日志句柄:Nginx 用
kill -USR1 $(cat /var/run/nginx.pid);rsyslog 用systemctl kill --signal=USR1 rsyslog
轮转后自动添加 GPG 数字签名
GPG 是最实用的签名方式,适合自动化集成,密钥可离线生成、公钥分发给审计方。
- 确保 GPG 密钥已导入并信任:私钥存于
/etc/logrotate.d/sec/gpg-priv.key,权限设为0600,属主为root - 在配置块中加入
postrotate段,调用 detach-sign 生成 ASCII 签名:
daily
size 100M
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/bin/gpg --quiet --batch --yes --detach-sign --armor /var/log/nginx/access.log.1 2>/dev/null || true
endscript
}
- 签名生成后为
access.log.1.asc,与归档文件同目录,便于后续验证 - 注意:GPG 命令需绝对路径;加
|| true防止签名失败导致整个轮转中断(但应配合日志监控告警)
OpenSSL 签名(无 GPG 环境下的替代方案)
若系统受限(如某些嵌入式或最小化镜像),只能使用 OpenSSL,则流程稍重但可控。
- 提前生成离线保管的私钥:
openssl genpkey -algorithm RSA -out /etc/ssl/private/logrotate-sign.key -aes256,密码由运维统一保管 - 对应公钥导出供审计:
openssl pkey -in /etc/ssl/private/logrotate-sign.key -pubout -out /etc/ssl/certs/logrotate-sign.pub - 在
postrotate中执行签名(注意:OpenSSL 不支持直接生成 ASCII 签名,输出为二进制):
openssl dgst -sha256 -sign /etc/ssl/private/logrotate-sign.key -out /var/log/nginx/access.log.1.sig /var/log/nginx/access.log.1 2>/dev/null || true
endscript
- 签名文件为
.sig后缀,验证时需配套公钥和原文件,命令为:openssl dgst -sha256 -verify /etc/ssl/certs/logrotate-sign.pub -signature access.log.1.sig access.log.1 - 务必检查签名命令退出码,失败时应在系统日志中记录错误(例如用 logger 写入 /var/log/messages)
验证、备份与运维闭环
签名不是摆设,必须有配套验证机制和归档保障,否则等于未签。
-
定期抽检验证:每日或每周从归档中随机抽取 3–5 个
.log.N及其签名,用gpg --verify或openssl dgst -verify执行校验,并记录结果 -
状态文件同步备份:
/var/lib/logrotate/status记录每次轮转时间戳,应与归档文件一同存入只读归档存储(如 S3 + WORM 模式、或 NAS 的不可删目录) -
禁止明文日志长期留存私钥所在机器:轮转+签名完成后,建议通过 rsync + ssh 加密通道,将
.log.N和.asc/.sig一并推送至专用日志归档服务器,源机仅保留最近 1–2 天日志 -
监控与告警:用 cron 每小时检查
/var/log/nginx/*.asc是否存在且非空;缺失或校验失败时触发企业微信/钉钉告警











