使用像 Digital Ocean 这样的提供商,如果我在 VPS 上存储私人/敏感信息,有没有办法保护这些信息(防止 VPS 主机获取访问权限)同时仍保留 SFTP 和 SSH 访问权限?
答案1
不幸的是,这根本不可能。下面是一些关于此问题的简短解释:
即使进行了加密,提供商也可以对内存和磁盘的当前状态进行快照,并克隆一个新实例以获取尽可能多的访问权限。(来源)
即使您运行的是带有加密文件系统的 VPS,所有 RAM 内的数据都将是未加密的,VPS 主机系统管理员可以访问这些数据,包括解密密码。如果您真的有如此严格的安全要求,听起来您需要运行自己的物理安全系统或找到专门从事此类工作的专用服务器托管公司。(来源)
...请记住,任何有权访问 VPS 图像的人都可能会在您的代码中添加错误来检测您使用的密码。(来源)
如果您可以控制硬件,那么[加密]就会有一定意义;当其他人控制硬件时,除非您相信主机并不真正想看它,否则加密就没有什么意义了...(来源)
物理访问是 root 访问,因此如果有人对服务器有物理访问权,无论它是在 VM 还是裸机上,他们都拥有 root 访问权。在 KVM 的情况下,裸机主机的所有者可以访问客户机。您始终可以加密数据,但这可能好处有限,因为当您访问数据时,数据将被解密。
网络也一样。虚拟机的所有者可以看到您的网络流量。同样,您可以加密部分流量(https、ssh 等)。(来源)
如果您只想在 VPS 上存储一些敏感数据,这里有一个特殊的解决方案:
如何通过 eCryptfs 创建和使用加密目录并远程挂载
先决条件
安装软件包ecryptfs-utils
并sshfs
重启系统:
sudo apt update && sudo apt -y install ecryptfs-utils sshfs
sudo apt update && sudo systemctl reboot
标准设置和使用
打开终端窗口并运行以下命令:
ecryptfs-setup-private
然后您将被要求:
Enter your login passphrase [<user>]:
此密码必须与当前用户的密码匹配,并将用于解锁(解密)您的加密信息。Enter your mount passphrase [leave blank ...]:
当您的加密数据正在加载时,此密码将被自动使用,但如果出现紧急情况并且必须恢复数据,您将需要它,因此请将其写在安全的地方。
上述命令将创建两个目录:
~/.Private
您的加密数据将被存储在哪里。~/Private
该目录~/.Private
将以解密形式挂载。
虽然~/.Private
未安装,但目录内~/Private
有两个带有说明的文件。
当您通过用户密码 ( ) 登录系统时,login passphrase
目录~/.Private
将自动挂载到~/Private
,您将能够在那里工作。当您logout
或 时exit
,目录~/.Private
将被卸载。要手动实现此目的,您可以使用以下命令:ecryptfs-mount-private
和ecryptfs-umount-private
。有关这些选项的更多信息,请参阅文章来自 ArchLinux Wiki 的 eCryptfs。 也可以看看:如何在随机目录中使用 ecryptfs。
如果您通过密码验证您的 SSH/SFTP 连接,则上述操作将有效。但是,如果您通过 SSH 密钥对验证自己,则需要使用ecryptfs-mount-private
来挂载~/.Private
。在这种情况下,首先您需要通过 SSH 连接到系统并运行,ecryptfs-mount-private
然后您将能够使用 SFTP 访问目录~/Private
。您可以将命令添加ecryptfs-mount-private
到 底部~/.bashrc
以自动执行此过程:
echo -e "\n# Mount my Private directory\necryptfs-mount-private\n" | tee -a ~/.bashrc
挂载远程加密目录并在本地解锁(解密)
在远程计算机(VPS)和本地计算机上执行以下命令,并在两台计算机上login passphrase
输入相同的数据:mount passphrase
ecryptfs-setup-private --nopwcheck --noautomount
该选项--nopwcheck
使您能够选择与用户登录密码不同的密码,并且该选项--noautomount
是不言自明的。
在远程计算机上:
运行命令:
ecryptfs-mount-private
笔记:当我测试这种方法时,我必须执行上述命令两次!
创建一些简单的内容:
echo "Hello Word!" > ~/Private/hello.txt
卸载
~/.Private
:ecryptfs-umount-private
此外,您可以删除存储解密数据的目录
~/.ecryptfs
(从 VPS 中)。
在本地机器上:
通过将远程加密文件夹挂载
~/.Private
到本地文件夹,并掩盖文件所有权(替换):~/.Private
sshfs
<user>@<host_name_or_ip>
sshfs -o idmap=user,uid=$(id -u),gid=$(id -g) <user>@<host_name_or_ip>:.Private ~/.Private
要卸载,请使用命令:
fusermount -u ~/.Private
或sudo umount -l ~/.Private
。然后将本地目录挂载(并解密)
~/.Private
到~/Private
ecryptfs-mount-private
检查文件是否
hello.txt
存在:$ cat ~/Private/hello.txt Hello Word!
如果您在使用命令时遇到问题
ecryptfs-umount-private
( ),您可以使用命令umount.ecryptfs_private
卸载本地目录。~/Private
sudo umount -l ~/Private
eCryptfs 具有错误有时
ecryptfs-mount-private
还ecryptfs-umount-private
不能正常工作。根据上述内容,您可以创建两个函数来
~/.bashrc
自动执行整个(挂载/卸载)过程(替换<user>@<host_name_or_ip>
):function ecryptfs-remote-mount { sshfs -o idmap=user,uid=$(id -u),gid=$(id -g) <user>@<host_name_or_ip>:.Private ~/.Private > /dev/null 2>&1 sudo keyctl clear @u sudo ecryptfs-insert-wrapped-passphrase-into-keyring $HOME/.ecryptfs/wrapped-passphrase # Attempt to mount, and loop the function unless it is true - due to CLI usage bug ecryptfs-mount-private && echo "Done!" || ecryptfs-remote-mount } function ecryptfs-remote-umount { ecryptfs-umount-private > /dev/null 2>&1 || sudo umount -l $HOME/Private fusermount -u $HOME/.Private > /dev/null 2>&1 || sudo umount -l $HOME/.Private echo "Done!" } export -f ecryptfs-remote-mount ecryptfs-remote-umount
然后
source ~/.bashrc
您将能够使用ecryptfs-remote-mount
和ecryptfs-remote-umount
作为命令。
参考文献和进一步阅读
创建一个加密的存档文件(tar),您的敏感数据隐藏在其中:
创建加密目录:
使用用户主目录加密: