logrotate 不支持直接加密压缩归档文件,其 extension 指令仅用于指定日志非数字后缀以正确识别轮转文件,与加密无关;需通过 postrotate 脚本调用 openssl 或 gpg 实现压缩后加密。

Logrotate 本身不支持直接对压缩后的归档文件进行加密(如 AES 加密),也**没有名为 Extension 的内置参数**。你提到的 “Extension 参数” 是一个常见误解——logrotate 配置中确实有 extension 指令,但它仅用于**指定日志文件的非数字后缀(如 .log)以便正确识别和轮转**,与压缩、归档或加密完全无关。
1. logrotate 的 extension 指令真实作用
该指令告诉 logrotate:你的日志主文件名带有一个固定后缀(非数字序号),例如:
-
/var/log/app/app.log(而非/var/log/app.log)
此时需配置:
/var/log/app/app.log {
extension .log
daily
rotate 7
compress
}
这样 logrotate 才能正确识别 app.log.1.gz、app.log.2.gz 等归档文件。它**不会修改压缩行为,更不参与加密**。
2. 实现“压缩后加密”的可行路径
logrotate 支持通过 compresscmd 和 compressext 自定义压缩命令与后缀,再结合 postrotate 脚本完成加密。关键步骤如下:
-
用
compresscmd替换 gzip 为加密压缩工具(如gpg --cipher-algo AES256 --symmetric),但注意:gpg 默认不输出标准压缩流格式,需配合--compress-algo或改用openssl enc+gzip管道 -
设置
compressext为加密后缀(如.gz.gpg或.enc) -
在
postrotate中对已生成的.gz文件调用加密命令(更稳妥,兼容性强)
推荐使用 postrotate 方式,避免压缩流程耦合过紧。
3. 实用配置示例(postrotate 加密)
假设使用 OpenSSL 对已压缩的 .gz 文件 AES-256 加密,密码从环境变量读取(生产中建议用 keyfile):
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
compressext .gz
sharedscripts
<pre class="brush:php;toolbar:false;">postrotate
# 查找刚生成的 .gz 文件(排除 .gz.gpg)
for f in /var/log/myapp/*.log.[0-9]*.gz; do
[ -f "$f" ] || continue
# 若尚未加密,则加密并重命名
if [[ "$f" != *.gz.gpg ]]; then
openssl enc -aes-256-cbc -pbkdf2 -salt -in "$f" -out "${f}.gpg" -pass env:LOGROTATE_PASS
if [ $? -eq 0 ]; then
rm -f "$f"
fi
fi
done
endscript}
启用前需确保:
- OpenSSL 已安装(
openssl version可查) - 运行 logrotate 的用户(通常是 root)能读取
LOGROTATE_PASS环境变量(可在/etc/cron.daily/logrotate前 export,或写入/etc/logrotate.conf顶部) - 加密后缀
.gz.gpg明确区分于原始压缩文件
4. 注意事项与替代建议
直接加密归档文件存在几个现实约束:
- logrotate 不校验加密完整性,解密失败将导致日志丢失
- 无法用
zcat/gunzip直接查看,需先openssl enc -d | gunzip - 若需审计合规(如等保),建议将加密逻辑下沉到应用层写日志时加密,或使用专用日志收集器(如 Filebeat + SSL/encryption output)
- 更轻量做法:用
gpg --encrypt --recipient配合公钥体系,避免密码分发问题
本质上,logrotate 是轮转调度器,不是安全网关。加密应作为独立、可验证的后处理环节嵌入,而非强依赖其内部参数。











