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 | windows (需要有choco), 也可以去 github 下载直接用 |
使用:
1 | age -R ~/.ssh/id_ed25519.pub example.jpg > 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 | bash <(curl -sL https://link.kuusei.moe/encrypt-backup) --from <source_directory> --backup <backup_directory> --age-recipient <age_key_url> |
此外, 还可以使用 -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 | bash <(curl -sL https://link.kuusei.moe/encrypt-decrypt) -i /path/to/encrypted_file -o /path/to/decrypted_file -k "private_key" |
解密结果
vps 非对称加密备份指南