如何防止托管公司访问 VM 的加密密钥?

信息安全 加密 磁盘加密 记忆 冷启动攻击
2021-08-30 14:54:14

我想防止我的本地托管公司可能盗窃我的 Web 应用程序(源代码 + 数据库),由于某种原因我不完全信任(但别无选择,只能使用他们提供的,到目前为止,最好的延迟在这里)。

我打算用 加密一个分区cryptsetup,并将 web 目录 + 数据库文件存储在那里。

唯一的问题是我必须在每次重新启动时解锁分区(甚至是不受控制的分区),然后才能启动 Web 和数据库服务器;但我想我现在已经准备好接受它了。

然而,据我所知,加密密钥按原样存储在内存中,并且可以在对机器进行物理访问的情况下读取,甚至可以从使用冷启动攻击的专用机器上读取。在虚拟机上,我想这更简单,因为管理程序可以拍摄整个服务器状态(存储 + RAM)的快照。

据我所知,进行内存转储并随时找到加密密钥应该很容易。

有什么办法可以防止这种情况发生吗?

我知道控制虚拟机管理程序会给试图窃取数据的人带来巨大的优势,因此我并不是在这里寻找完美的解决方案。但我宁愿尽可能地让访问数据变得困难,这样花时间和资源来获取它们在经济上是不可行的。

我在这里并不乐观,因为加密密钥必须以某种形式存储在内存中以进行解密,但我希望我错过了一些东西。


编辑 - 澄清

从我下面的评论中:

我确信托管公司的管理程序不会以任何方式进行修改以执行任何恶意操作;他们的业务是托管,不是偷东西,而且公司比较值得信赖。我试图防止有人贿赂员工向他们出售数据快照。只要加密密钥无法从库存管理程序可以执行的任何快照中恢复,我认为该解决方案对于我的用例来说已经足够好了。

4个回答

你不能,简单明了。如果您不信任托管公司,则不要与他们一起托管。这是10 条不可变安全法中的第 3 条法律:

法则 3:如果坏人可以不受限制地物理访问您的计算机,那么它就不再是您的计算机了。

管理程序始终对您的虚拟机具有特权地位,您无法保护自己免受流氓管理程序的侵害。

您可以从他们的网络位置中受益但仍保持代码安全的一种方法是进行托管。在托管托管中,您将自己的机器放在其他人的数据中心中。

基本托管本身应该阻止大多数机会主义攻击者,但有针对性/确定的攻击者可能无论如何都会连接到您的机器。如果这对您来说是一个问题,您应该将您的机器放在一个防篡改/防篡改的服务器外壳中,以便与外界的唯一未解锁端口是电源线和网络电缆,并且您加密所有网络流量进/出机器。这样,您可以将您的机器放入他们的网络并从网络的低延迟中受益,并且除非他们破坏服务器的机箱,否则他们将无法从您的服务器窃取数据。

如果保护您的数据非常重要,您还需要定期审核该案例未被篡改。如果您有无限的预算,也可以设计具有各种传感器的防篡改机箱,如果它们检测到机箱已被篡改,则可以发出警报并启动关闭(丢弃所有敏感/加密密钥),但当然这些很快就会变得昂贵。

因此,花费时间和资源来获取它们在经济上是不可行的。

我不想告诉你,但你根本没那么重要。没有人知道您或您的网络应用程序。所以它在经济上已经不可行了。

考虑成本效益。对于托管公司来说,如果这种情况发生一次,他们就会大量流失客户。所以他们会有适当的日志。任何被抓到这样做的员工不仅会被解雇,还会被逮捕。所以贿赂必须是严肃的。我们说的是数百万,因为它必须补偿被监禁并且在获释后再也无法工作的员工。如果这是贿赂,那么您的公司必须至少值 10 倍。这使您的公司价值数千万,更有可能数亿。

老实说,你的公司值得吗?到目前为止,你所说的一切都表明不是。如果是这样,您没有理由不运行自己的服务器。

理论上,您应该能够使用现代 CPU 的受信任硬件功能在 CPU 的防篡改部分内运行磁盘加密,甚至整个 VM,并使用密钥对磁盘和内存中的所有数据进行加密只能在那个防篡改的可信飞地内访问。

虽然在股票管理程序上似乎不可能将英特尔的 SGX 可信计算系统暴露给虚拟机,但 AMD 有一个称为安全加密虚拟化或 SEV的功能,这听起来正是您正在寻找的:您可以在这样的环境中设置您的虚拟机一种使用只有 AMD 或愿意并能够拆卸主机 CPU 的人知道的密钥来保护它免受虚拟机管理程序影响的方法。

不幸的是,您需要使用的特定托管公司不太可能提供支持 AMD SEV 的主机或向其客户提供该功能。

Microsoft 对此有一个可能的解决方案,称为Shielded VMs,它们专门针对某些恶意行为者对管理程序具有管理访问权限的攻击媒介。这方面的一个例子是部署在云中或 colo 中的机器。

缺点是您需要在物理控制下维护 Guardian 服务器。对于您的需求,这可能是矫枉过正。