← 中文资源

简体中文版本

备份上传前进行客户端加密

使用 age 在备份主机上加密数据库转储,私钥离线保存,并在恢复演练中验证可解密与可还原。

阅读英文原文

概述

桶策略、TLS 和服务端加密只在数据留在桶内时有效。一旦有人为排查问题下载转储文件,保护就结束了。使用 age 做客户端加密,可以让归档在备份主机之外始终不可读,而存储提供方不需要持有私钥。

步骤

  1. 生成 age 密钥对,私钥 identity 存入离线保险库,绝不放进 CI 变量或代码仓库:
age-keygen -o /secure/backup-identity.txt
  1. 将 pg_dump 的输出直接通过管道加密,避免明文落盘:
set -o pipefail
pg_dump -Fc -d appdb \
  | age -r age1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs3290gq \
      -o /backups/appdb-2026-10-21.dump.age
  1. 计算 SHA-256 校验和并随对象一起记录,然后上传到对象存储。
  2. 在演练库中验证解密与恢复:解密流直接交给 pg_restore。

验证

预期 age -d -i /secure/backup-identity.txt 能成功解密,pg_restore 无错误完成,恢复库的行数与源库快照一致。同时确认备份主机上不存在明文转储文件,对象存储中的文件大小与校验和匹配。

注意事项

  • 丢失 identity 会导致所有历史备份不可恢复,应双人保管并每季度验证可访问性。
  • 轮换收件人时先同时加密给新旧两个公钥,验证都能解密后再淘汰旧密钥。
  • 客户端加密无法防御已拿到 identity 的被入侵主机,私钥不应与备份主机长期共存。
  • 解密时使用流式管道,避免明文落盘和磁盘耗尽;校验和只能证明完整性,不能替代恢复演练。