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>