使用 VPS 服务,我可以阻止 VPS 主机访问我的数据吗?

使用 VPS 服务,我可以阻止 VPS 主机访问我的数据吗?

使用像 Digital Ocean 这样的提供商,如果我在 VPS 上存储私人/敏感信息,有没有办法保护这些信息(防止 VPS 主机获取访问权限)同时仍保留 SFTP 和 SSH 访问权限?

答案1

不幸的是,这根本不可能。下面是一些关于此问题的简短解释:

  • 即使进行了加密,提供商也可以对内存和磁盘的当前状态进行快照,并克隆一个新实例以获取尽可能多的访问权限。(来源

  • 即使您运行的是带有加密文件系统的 VPS,所有 RAM 内的数据都将是未加密的,VPS 主机系统管理员可以访问这些数据,包括解密密码。如果您真的有如此严格的安全要求,听起来您需要运行自己的物理安全系统或找到专门从事此类工作的专用服务器托管公司。(来源

  • ...请记住,任何有权访问 VPS 图像的人都可能会在您的代码中添加错误来检测您使用的密码。(来源

  • 如果您可以控制硬件,那么[加密]就会有一定意义;当其他人控制硬件时,除非您相信主机并不真正想看它,否则加密就没有什么意义了...(来源

  • 物理访问是 root 访问,因此如果有人对服务器有物理访问权,无论它是在 VM 还是裸机上,他们都拥有 root 访问权。在 KVM 的情况下,裸机主机的所有者可以访问客户机。您始终可以加密数据,但这可能好处有限,因为当您访问数据时,数据将被解密。

    网络也一样。虚拟机的所有者可以看到您的网络流量。同样,您可以加密部分流量(https、ssh 等)。(来源


如果您只想在 VPS 上存储一些敏感数据,这里有一个特殊的解决方案:

如何通过 eCryptfs 创建和使用加密目录并远程挂载

先决条件

安装软件包ecryptfs-utilssshfs重启系统:

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-privateecryptfs-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到本地文件夹,并掩盖文件所有权(替换):~/.Privatesshfs<user>@<host_name_or_ip>

    sshfs -o idmap=user,uid=$(id -u),gid=$(id -g) <user>@<host_name_or_ip>:.Private ~/.Private
    

    要卸载,请使用命令:fusermount -u ~/.Privatesudo umount -l ~/.Private

  • 然后将本地目录挂载(并解密)~/.Private~/Private

    ecryptfs-mount-private
    
  • 检查文件是否hello.txt存在:

    $ cat ~/Private/hello.txt
    Hello Word!
    
  • 如果您在使用命令时遇到问题ecryptfs-umount-private( ),您可以使用命令umount.ecryptfs_private卸载本地目录。~/Privatesudo umount -l ~/Private

  • eCryptfs 具有错误有时ecryptfs-mount-privateecryptfs-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-mountecryptfs-remote-umount作为命令。

参考文献和进一步阅读

相关内容