概述
桶策略、TLS 和服务端加密只在数据留在桶内时有效。一旦有人为排查问题下载转储文件,保护就结束了。使用 age 做客户端加密,可以让归档在备份主机之外始终不可读,而存储提供方不需要持有私钥。
步骤
- 生成 age 密钥对,私钥 identity 存入离线保险库,绝不放进 CI 变量或代码仓库:
age-keygen -o /secure/backup-identity.txt
- 将 pg_dump 的输出直接通过管道加密,避免明文落盘:
set -o pipefail
pg_dump -Fc -d appdb \
| age -r age1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs3290gq \
-o /backups/appdb-2026-10-21.dump.age
- 计算 SHA-256 校验和并随对象一起记录,然后上传到对象存储。
- 在演练库中验证解密与恢复:解密流直接交给 pg_restore。
验证
预期 age -d -i /secure/backup-identity.txt 能成功解密,pg_restore 无错误完成,恢复库的行数与源库快照一致。同时确认备份主机上不存在明文转储文件,对象存储中的文件大小与校验和匹配。
注意事项
- 丢失 identity 会导致所有历史备份不可恢复,应双人保管并每季度验证可访问性。
- 轮换收件人时先同时加密给新旧两个公钥,验证都能解密后再淘汰旧密钥。
- 客户端加密无法防御已拿到 identity 的被入侵主机,私钥不应与备份主机长期共存。
- 解密时使用流式管道,避免明文落盘和磁盘耗尽;校验和只能证明完整性,不能替代恢复演练。