PostgreSQL GPG公钥加密备份文件

1. 目标

实现 PostgreSQL 备份文件:

  • 本地生成

  • GPG 公钥加密

  • 上传 S3

  • 支持灾难恢复

安全架构:

复制代码
Postgres
   ↓
pg_dump
   ↓
gzip
   ↓
GPG 公钥加密
   ↓
AWS S3 (SSE)

2. 安装依赖

Rocky / CentOS / RHEL:

复制代码
sudo dnf install -y gnupg2 pinentry pinentry-tty

验证:

复制代码
gpg --version
which pinentry-tty

3. 创建 GPG 密钥

推荐 batch 方式创建(服务器更稳定)。

创建配置文件:

复制代码
cat > ~/gpg-batch.conf <<'EOF'
Key-Type: RSA
Key-Length: 4096
Subkey-Type: RSA
Subkey-Length: 4096
Name-Real: <YOUR_NAME>
Name-Email: <YOUR_EMAIL>
Name-Comment: PostgreSQL Backup
Expire-Date: 0
Passphrase: <STRONG_PASSPHRASE>
%commit
EOF

设置权限:

复制代码
chmod 600 ~/gpg-batch.conf

生成密钥:

复制代码
gpg --batch --pinentry-mode loopback --generate-key ~/gpg-batch.conf

4. 查看密钥

复制代码
gpg --list-secret-keys --keyid-format LONG

示例输出(脱敏):

复制代码
sec   rsa4096/<GPG_KEYID> 2026-03-31 [SCEA]
      <GPG_FINGERPRINT>
uid                 [ultimate] <YOUR_NAME> (PostgreSQL Backup) <YOUR_EMAIL>
ssb   rsa4096/<SUBKEY_ID> 2026-03-31 [SEA]

关键字段

推荐使用:

复制代码
<GPG_KEYID>

如需更高唯一性,也可以使用完整指纹:

复制代码
<GPG_FINGERPRINT>

5. 导出 GPG 密钥前的 agent 配置

为避免 No pinentry 问题,先配置 gpg-agent。

复制代码
mkdir -p ~/.gnupg
chmod 700 ~/.gnupg

cat > ~/.gnupg/gpg-agent.conf <<'EOF'
pinentry-program /usr/bin/pinentry-tty
allow-loopback-pinentry
EOF

chmod 600 ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
export GPG_TTY=$(tty)

6. 导出公钥

复制代码
gpg --export --armor <GPG_KEYID> > /home/<USER>/db_backup/gpg-public.asc

7. 导出私钥(推荐方案)

复制代码
gpg --batch --yes --pinentry-mode loopback \
  --passphrase '<PRIVATE_KEY_PASSPHRASE>' \
  --export-secret-keys --armor <GPG_KEYID> \
  > /home/<USER>/db_backup/gpg-private.asc

8. 验证导出

复制代码
ls -lh /home/<USER>/db_backup/gpg-*.asc

检查内容:

公钥:

复制代码
head -3 /home/<USER>/db_backup/gpg-public.asc

应看到:

复制代码
-----BEGIN PGP PUBLIC KEY BLOCK-----

私钥:

复制代码
head -3 /home/<USER>/db_backup/gpg-private.asc

应看到:

复制代码
-----BEGIN PGP PRIVATE KEY BLOCK-----

9. 备份吊销证书

自动生成路径:

复制代码
~/.gnupg/openpgp-revocs.d/*.rev

复制备份:

复制代码
cp ~/.gnupg/openpgp-revocs.d/*.rev /home/<USER>/db_backup/

10. 设置安全权限

复制代码
chmod 600 /home/<USER>/db_backup/gpg-private.asc
chmod 644 /home/<USER>/db_backup/gpg-public.asc
chmod 600 /home/<USER>/db_backup/*.rev

11. 私钥安全保存

至少保存 2 份,推荐保存到:

  • 安全 S3 bucket

  • 密码管理器

  • 离线 U 盘

  • Vault / Secrets Manager

否则机器损坏后,可能无法解密历史备份。


常用命令

查看密钥:

复制代码
gpg --list-keys

查看私钥:

复制代码
gpg --list-secret-keys

导入密钥:

复制代码
gpg --import gpg-private.asc

删除密钥:

复制代码
gpg --delete-secret-keys <GPG_KEYID>
gpg --delete-keys <GPG_KEYID>

相关推荐
ClickHouseDB5 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906945 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺6 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw6 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社7 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙7 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain3768 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02149 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川9 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组9 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制