我有一台备份服务器,它会创建要备份的目录树的xz
压缩档案。这些 tar 档案可能非常大(数 TB),会被分成多个部分(2.5 TB),每个部分都会写入 LTO-6 磁带,然后磁带会移至异地。tar
split
现在我想添加加密。我可以在拆分之前使用公钥-私钥加密以及一个或多个收件人(管理员公钥)对 tar 存档进行 GPG 加密。
然而,为了便于恢复,至少有一名管理员需要将他的私钥放到备份服务器上,因为文件太大,无法在其他任何地方解压。
GPG 内部采用混合加密方案,使用 AES 等对称密码和会话密钥,并且只有该会话密钥才能为接收者获得公钥-私钥加密。
有没有办法让管理员提供会话密钥来解密要恢复的文件无需将私钥放到备份服务器上?
我当然可以重新发明轮子:
- 在备份服务器上为每个要备份的文件创建一个随机会话密钥
- 使用 GPG 对称加密来加密文件
- 使用 GPG 非对称加密来加密每个接收者的会话密钥
但是,是否存在一种“标准”或内置或最佳实践的方法来实现上述目标?
答案1
使用--show-session-key
和 --override-session-key
选项绝对可以实现这一点。
首先,你需要获取加密文件的开头部分。这是存储加密会话密钥的地方。
root@qwerty:~/gpg# head -c 1024k bigfile.gpg > head.gpg
然后将其复制到您的工作站并检索会话密钥
PS C:\Users\redacted\Downloads> gpg --show-session-key .\head.gpg
gpg: encrypted with 2048-bit RSA key, ID DC21D645, created 2016-02-01
"admin <[email protected]>"
gpg: session key: '9:926EC16DF1248A1C4401F5AD5D86C63C1BD4BF351ECEFB121C57EC209DE3933D'
现在您可以使用会话密钥解密文件
root@qwerty:~/gpg# gpg -d -o bigfile --override-session-key 9:926EC16DF1248A1C4401F5AD5D86C63C1BD4BF351ECEFB121C57EC209DE3933D bigfile.gpg
gpg: encrypted with 2048-bit RSA key, ID DC21D645, created 2016-02-01
"admin <[email protected]>"
答案2
看起来好像您的大部分问题都已得到解答,但是,如果您的管理员团队担心私钥最终脱离他们的本地控制,您可能需要考虑sshfs
通过 ssh 会话安装远程备份。
在每个远程管理员的系统上通过 apt 安装
sudo apt-get install sshfs
假设管理员的 ssh 配置如下所示
# configuration for ssh login to remote server
Host Remote
Hostname Remote.web.domain
User admin
IdentityFile ~/.ssh/private.key
然后你的管理员可以使用类似下面的方法进行安装
# make a mount point
mkdir -p /mnt/remote
# mount remote directory to local file system
sshfs Remote:/path/to/encrypted/dir /mnt/remote
要在检查后卸载,远程管理员可以使用以下命令
fusermount -u /mnt/remote
使用 sshfs 的好处是远程服务器上只需要 GnuPG 和 ssh 的公钥,相关私钥保留在拥有它们的系统上。第二个好处是,在读取或访问之前,大多数文件信息都保留在其相关文件系统上。
如果你仍在寻找能够自动加密日志或目录的工具,你可能需要查看我推送的概念工具GitHub(具体来说场景四为sshsf
使用而编写的,只需稍加定制即可通过 GnuPG 加密几乎所有数据。但请注意,它是实验性的,如果误用,它的某些功能可能会导致数据损坏。源代码少于 ~1600~ 行,因此很可能在不到一个周末的时间内进行审计。
可以通过设置远程服务器的 ssh 配置来 chroot 用户以仅允许访问加密目录并禁用以这种方式使用的管理员密钥的交互式 shell,从而获得额外的安全性。
答案3
如果您希望密钥不保存在硬盘上,您可以创建一个 ramdisk(还记得吗?),并根据需要从非服务器上的安全位置加载密钥。使用它进行解密,完成后用 /dev/random 覆盖它。密钥必须进入 RAM 才能被 GPG 使用,那么为什么不重复呢?
如果您不能让密钥留在服务器上,即使是在 RAM 中,那么在技术上也是行不通的。GPG 必须将密钥放在某处才能解密任何东西。
Ramdisk 信息:https://unix.stackexchange.com/questions/66329/creating-a-ram-disk-on-linux