vps 非对称加密备份指南

阅读本文不需要你有任何密码学知识, 只要会执行脚本即可, 前半段都是技术细节, 不感兴趣也可跳过

引言

为了在 vps 上部署的项目不丢失数据, 通常需要对数据定期备份, 上传到 s3/网盘/其他服务器等地方.
但是只打包并压缩数据进行备份不够安全, 备份信息中通常有很多个人信息, 对于各种备份方案而言, 都存在潜在的安全风险(这里只讨论数据读取安全, 不考虑违反 tos 被删除的情况):

  • s3: 部分 s3 存储会扫描数据, 并且 s3 一般使用公开存储桶, 实际上没有访问限制
  • 网盘: 同上, 并且网盘通常被各类工具, 例如 alist/rclone 等工具挂载, 而这些设备又存在安全风险, 一旦部署环境被黑, 就有可能泄漏工具保存的网盘 cookie
  • 其他服务器: 同样有系统安全风险
  • github: 类似网盘, 但更危险一些

因此需要在备份时对数据进行加密, 但传统的文件加密方式实际上对机器也是透明的, 被攻击时不仅泄漏了当前版本的数据, 也同时泄漏了之前加密的数据.
同时, 这种加密方式要求每台机器使用不同的加密密码, 否则, 一旦泄漏所有文件都明文了.
但手里有一堆账号的都知道, 记录密码是很麻烦的事, 更何况解密时还需要判断是什么密钥

AGE & 对比其他加密工具

由于以上问题, 我们需要一个非对称加密工具.

什么是非对称加密

通俗点讲, 非对称加密是一种加密方式, 使用一对密钥: 公钥和私钥, 公钥可以随便传, 加密时使用公钥, 解密文件时只能用私钥. 由于私钥在加密过程中不使用, 因此不存在泄露风险.

平时使用 ssh 密钥登录服务器, 就是一种非对称加密, 通常使用 rsa 或者 ed25519 进行签名.

使用这种方法, 在 vps 上加密的文件, 除了存有私钥的电脑以外, 都是安全的.
所有 vps 可以用同一个加密密钥, 共同存储到一个位置上, 哪怕 vps/存储环境 泄漏, 也不影响任何安全问题, 加密公钥可以直接放在 github.
甚至加密后的文件也可以一样放在 github 上, 理论上, 存储在任何位置, 都不影响数据安全性.

AGE

age 是一个非对称加密工具. 相对于 openssl/gpg 来说, 他更现代化, go单文件, 不需要各种配置, 不需要使用其他私钥体系, 可以直接用和 ssh key 一样的 id_rsa/id_ed25519 来进行加解密.

使用和安装

安装:

1
2
3
4
5
6
7
8
9
10
# windows (需要有choco), 也可以去 github 下载直接用
choco install age.portable
# windows (需要有scoop)
scoop bucket add extras && scoop install age
# debian 11
apt install age/bullseye-backports
# debian 12
apt instal age
# mac
brew install age

使用:

1
2
3
4
5
6
age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age
# 或者使用在线密钥 (甚至可以直接用github配置的密钥)
curl https://github.com/<username>.keys | age -R - example.jpg > example.jpg.age

# 解密
age -d -i ~/.ssh/id_ed25519 -o example.jpgge example.jpg.age

没错, 这玩意就这么简单, 一行就加密/解密完了
但我们在 vps 上用的话, 还需要弄个自动化脚本

自动化备份脚本(暂不带上传, 后续更新)

使用此脚本即可自动设置备份, 注意, 使用了 crontab, 如果你系统没有, 需要安装一下
注意: 每次重新执行时, 都会自动删除之前设置的 crontab, 先成功执行一次再重建 crontab

参数 说明 默认值 示例
--from 指定要备份的源目录 --from /path/to/source_directory
--backup 指定存储备份的目录 --backup /path/to/backup_directory
--cron 指定 cron 作业时间表 30 2,8,14,20 * * * --cron "0 2 * * *"
--age-recipient 指定下载 age 公钥的 URL --age-recipient https://example.com/age.pub
-h, --help 显示帮助信息并退出 -h--help

例子

1
2
3
bash <(curl -sL https://link.kuusei.moe/encrypt-backup) --from <source_directory> --backup <backup_directory> --age-recipient <age_key_url>
# 或者, 使用交互模式
bash <(curl -sL https://link.kuusei.moe/encrypt-backup)

此外, 还可以使用 -h 获取更多配置参数, 例如 crontab 时间配置

备份结果

至此, 整个备份流程就完成了, 后续要上传到哪里, 用什么工具上传, 也许后续可能还会更新

One more thing

age 哪都好, 就是不能使用 ssh-agent, 例如我上面写的一样, 需要使用文件解密, 对于使用 ssh-agent 的人来说, 这太不方便了.
因此我写了一个脚本, 从 1password 自动获取密钥

参数 说明 示例
-i, --input 输入文件路径,即加密的文件。 -i /path/to/encrypted_file
-o, --output 输出文件路径,即解密后的文件。 -o /path/to/decrypted_file
-k, --key 1Password 项的名称,默认值为 VPS Encrypt -k "My Custom Item"

例子

1
2
3
bash <(curl -sL https://link.kuusei.moe/encrypt-decrypt) -i /path/to/encrypted_file -o /path/to/decrypted_file -k "private_key"
# 或者, 使用交互模式
bash <(curl -sL https://link.kuusei.moe/encrypt-decrypt) -k "private_key"

解密结果

vps 非对称加密备份指南

https://kuusei.moe/post/20240728051924

作者

kuusei

发布于

2024-07-28

更新于

2024-07-28

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×