备份也要加密:gpg 给备份文件加把锁

备份包里躺着数据库和用户数据,裸奔传到异地等于裸奔。小够讲 gpg 加密备份:对称加密一条命令搞定,密钥怎么保管、自动化怎么配,一次说清。

我是小够。备份传到另一台机器、同步到对象存储,传输过程和落盘之后,备份包都是明文。里面是什么?数据库、用户邮箱、配置文件里的密钥。一旦备份服务器被入侵,或者云存储桶配置失误公开了,等于把家底双手奉上。备份必须加密,这是底线。

最简单的:对称加密

gpg 一条命令就能加密,密码自己定:

gpg --symmetric --cipher-algo AES256 site-2025-08-04.tar.gz
# 生成 site-2025-08-04.tar.gz.gpg,输密码即可

解密:

gpg --decrypt site-2025-08-04.tar.gz.gpg > site-2025-08-04.tar.gz

对称加密的好处是简单,坏处是密码要保管好。密码丢了,备份就是一堆乱码——谁也解不开。

自动化脚本里怎么用

备份脚本里不能交互输密码,用 --passphrase 从文件读:

gpg --symmetric --cipher-algo AES256 \
    --passphrase-file /root/.backup-pass \
    --batch --yes \
    site-$DATE.tar.gz

注意两点:

  1. /root/.backup-pass 权限设为 600,只让 root 读
  2. 加密完删掉明文原包,不然加密等于白做
shred -u site-$DATE.tar.gz   # 安全删除明文

更讲究的:非对称加密

如果备份要传给别人、或者想做到"连备份服务器被黑也解不开",用非对称:本地只留公钥加密,私钥离线保管。备份服务器上只有公钥,黑客拿到了加密包也没有私钥可解。

# 离线机器上生成密钥对,公钥传到 VPS
gpg --encrypt --recipient [email protected] site-$DATE.tar.gz

密钥保管:真正的难点

加密不难,难的是密钥管理。小够的建议:

  • 密码/私钥至少两处离线保存:密码管理器 + 纸质/离线 U 盘
  • 别只存在 VPS 上——服务器丢了要恢复,结果密钥也在那台服务器上,就搞笑了
  • 定期验证:每季度拿一份旧备份解密一次,确认密钥有效

小够的结论

备份三件套:做备份、传异地、加加密,少一件都不完整。gpg 对称加密五分钟就能配上,没有理由裸奔。记住:能恢复的加密备份才是备份,解不开的加密包只是占磁盘的乱码。

非对称加密实战

对称加密够用,但有个升级版:非对称加密。区别在于:加密用公钥(可以放在备份服务器上),解密用私钥(离线保管,绝不上服务器)。

# 1. 在自己的电脑上生成密钥对(只做一次)
gpg --gen-key
# 2. 导出公钥,传到 VPS
gpg --export -a "[email protected]" > backup-public.asc
# 3. VPS 上导入公钥
gpg --import backup-public.asc
# 4. 备份脚本里加密(只用公钥,不需要密码)
gpg --encrypt --recipient "[email protected]" \
    --trust-model always \
    site-$DATE.tar.gz

好处:备份服务器被黑,黑客拿到的是公钥加密的包,没有私钥解不开。连备份服务器本身都解不开自己的备份,这才是真安全。

密钥保管清单

  • 私钥导出两份:一份放密码管理器,一份放离线 U 盘
  • 公钥可以随便放,公开了也没事
  • 吊销证书也生成一份存好,万一私钥泄露可以吊销
# 生成吊销证书(现在生成,存好,以备不时之需)
gpg --gen-revoke "[email protected]" > revoke.asc

openssl 备选方案

如果机器上没有 gpg,openssl 也行:

# 加密
openssl enc -aes-256-cbc -salt -pbkdf2 \
    -in site-$DATE.tar.gz -out site-$DATE.tar.gz.enc \
    -pass file:/root/.backup-pass
# 解密
openssl enc -d -aes-256-cbc -pbkdf2 \
    -in site-$DATE.tar.gz.enc -out site-$DATE.tar.gz \
    -pass file:/root/.backup-pass

注意 -pbkdf2 参数,openssl 默认的密钥派生比较弱,加上这个才够安全。

自动化脚本完整示例

把加密串进备份流程:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/backup

# 1. 打包
tar -czf $BACKUP_DIR/site-$DATE.tar.gz /var/www
# 2. 加密(非对称,公钥在服务器上)
gpg --encrypt --recipient "[email protected]" \
    --trust-model always --batch --yes \
    $BACKUP_DIR/site-$DATE.tar.gz
# 3. 安全删除明文
shred -u $BACKUP_DIR/site-$DATE.tar.gz
# 4. 推送到异地(rclone/rsync)
rclone copy $BACKUP_DIR/ mybackup:vps-backup/

常见问题

Q:加密后备份大了多少? A:对称/非对称加密本身几乎不增加体积,该多大还多大。压缩要在加密之前做(先 tar -czf 再加密),顺序别反。

Q:密码忘了怎么办? A:对称加密忘了密码,数据就没了,神仙也救不回来。所以密码必须离线存两份。非对称的私钥同理。

Q:数据库备份也要加密吗? A:要。数据库里有机密信息,mysqldump 出来的 SQL 直接加密,和文件备份一个流程。