虚拟机管理程序中虚拟机存储的静态加密正确/优雅地完成

虚拟机管理程序中虚拟机存储的静态加密正确/优雅地完成

给定一个非常简单的基础设施 - 一台运行虚拟机管理程序的单台机器(如果重要的话,是 Proxmox),我希望实现良好的数据保护,防止硬件被盗。

假设虚拟机管理程序上运行着各种虚拟机 - 其中大多数不需要加密,但对于 NAS/个人云虚拟机,我希望即使硬件被盗,数据也是安全的。

我想了解一些处理此类情况的最佳做法。我考虑了一下,想出了几种方法,但我很难选择哪种方法最合适,以及是否存在我忽略的问题/风险。

主机全盘加密

这是不可能实现的,因为硬件经常无人看管,所以它必须能够在重启时自行恢复,并且一些虚拟机(CCTV、Web 服务器等)需要在无人干预的情况下启动

加密主机上包含 VM 卷的磁盘/分区

一个简单的方法是加密保存敏感虚拟机卷的磁盘。

我喜欢这种方法,因为我可以将我需要的所有 qcow2 卷分组到启动时锁定的存储桶中,然后通过 SSH 或自定义 API 手动解锁它。

我不喜欢的是,它必须存在于 Proxmox 主机上,我想让它尽可能干净。另一个缺点是,如果没有一些可用的虚拟机磁盘,我就无法启动虚拟机(我希望它的行为就像尝试启动一台硬盘被移除的真实计算机一样)。这基本上意味着,如果没有连接敏感磁盘,我就无法启动 NAS。

有一种方法可以通过编程方式从虚拟机中分离磁盘,并在解锁时将其连接起来,但我还是想让 Proxmox 端尽可能保持清洁。

第三个潜在的缺点是备份,因为里面的实际 qcow 和 FS 未加密,所以我必须格外注意加密备份本身。

将所有加密委托给虚拟机客户机

这里很酷的事情是每个虚拟机都可以自行处理加密 - 比如我想要完全加密的虚拟机,我可以在系统驱动器上打开全盘加密,并需要通过 VNC/控制台连接以在启动时解锁它,或者,我可以在客户机端加密单个分区/虚拟机磁盘(例如,我需要安全的 NAS 存储驱动器)。

缺点是,我需要分别解锁每个虚拟机,同时这还需要维护/备份每个加密分区的 luks 标头,而且我担心如此多的存储抽象级别可能会变得脆弱 - 在这种情况下,它可能是主机的 FS,其上的 qcow2 存储,然后在内部 - 一个虚拟磁盘,然后在它之上 - luks/dm-crypt,然后是 fs 和分区本身。

最大的好处是,这与主机完全无关,因此备份将加密客户文件系统,无需修改主机,并且虚拟机具有最大的灵活性。我认为听起来这是最方便和“兼容”的方式,将虚拟机视为独立机器。我唯一担心的是这么多抽象层次——我是不是有点偏执?

加密硬盘直通

我目前正在使用这种方法,其中敏感存储是一个完全加密的单独磁盘,它被传递到 NAS 系统中。虽然这感觉最安全,因为我没有额外的抽象层,但这在自动备份方面给我带来了一些麻烦,而且 Proxmox 对传递的磁盘不是特别友好——它不将它们算作标准存储,不公开任何用于维护它们的 UI,等等。

好的一面是,它是一个完全标准的数据驱动器,我可以直接拔下它,将其放入另一台电脑并解密/读取。


因此,从优雅的角度来看,我认为我倾向于选项 3 - 将每个 VM 视为承担其加密责任的独立 PC - 无论是 VM 的整个磁盘加密,还是加密里面的单个分区/虚拟磁盘。

我有几个担忧,但我不知道它们有多大道理或合理:

  • qcow2 文件的大小是否有“安全限制”?例如,如果存储虚拟磁盘采用 qcow2 格式,大小为 1TB,会有什么缺点吗?
  • 在存储中增加这些额外的抽象级别,在隐藏数据损坏等方面是否真的有什么额外的好处?我想这种文件系统的数据恢复会非常艰难,所以可靠的备份变得更加重要?
  • 在 Linux 下运行的服务中,是否有一种“标准”方法来处理存储依赖关系?也就是说,假设我让 NAS 启动,但其备份存储未解锁。通过 NFS 依赖于此存储的单独 VM 将无法挂载它,因此如果任何服务使用第二个 VM,它将开始在挂载点中写入。我当然可以编写脚本来解决这个问题,但如果已经有了良好的做法,我不想再重新找轮子了。

欢迎任何想法或建议。

答案1

主机全盘加密

我认为您要么不了解全盘加密,要么对此没有足够的经验。

有多种方法可以完美地实现这一点 - 一种选择是使用 SED(自加密磁盘),它对磁盘控制器及其上层(操作系统、虚拟机管理程序、虚拟机)完全透明。另一种方法是让控制器管理加密 - HPe 控制器在这方面特别擅长 - 您在控制器上设置一个密钥,它会加密/解密到任何常规磁盘上 - 这对操作系统等同样是透明的。

两者都是安全的、高性能的,不需要操作系统的输入,并且允许无人值守重启。

答案2

2.29. 磁盘映像加密

Oracle VM VirtualBox 可让您透明地为客户机加密硬盘映像中存储的数据。它不依赖于要使用的特定映像格式。已加密数据的映像无法在 Oracle VM VirtualBox 和其他虚拟化软件之间移植。

Oracle VM VirtualBox 在 XTS 模式下使用 AES 算法,支持 128 位或 256 位数据加密密钥 (DEK)。DEK 以加密形式存储在介质属性中,在 VM 启动期间通过输入在加密映像时选择的密码进行解密。

由于 DEK 是作为 VM 配置文件的一部分存储的,因此确保其安全非常重要。丢失 DEK 意味着存储在磁盘映像中的数据将不可挽回地丢失。用户有责任对与 VM 相关的所有数据进行完整且最新的备份。2.29.1. 磁盘加密的局限性

用户在使用此功能时需要注意一些限制:

This feature is part of the Oracle VM VirtualBox Extension Pack, which needs to be installed. Otherwise disk encryption is unavailable.

Since encryption works only on the stored user data, it is currently not possible to check for metadata integrity of the disk image. Attackers might destroy data by removing or changing blocks of data in the image or change metadata items such as the disk size.

Exporting appliances which contain encrypted disk images is not possible because the OVF specification does not support this. All images are therefore decrypted during export.

The DEK is kept in memory while the VM is running to be able to decrypt data read and encrypt data written by the guest. While this should be obvious the user needs to be aware of this because an attacker might be able to extract the key on a compromised host and decrypt the data.

When encrypting or decrypting the images, the password is passed in clear text using the Oracle VM VirtualBox API. This needs to be kept in mind, especially when using third party API clients which make use of the webservice where the password might be transmitted over the network. The use of HTTPS is mandatory in such a case.

Encrypting images with differencing images is only possible if there are no snapshots or a linear chain of snapshots. This limitation may be addressed in a future Oracle VM VirtualBox version. 

2.29.2. 加密磁盘映像

可以使用 GUI 或 VBoxManage 加密磁盘映像。虽然 GUI 更易于使用,但它以每个 VM 为基础工作并加密连接到特定 VM 的所有磁盘映像。使用 VBoxManage 可以加密单个映像,包括所有差异映像。要使用 VBoxManage 加密未加密的介质,请使用:

VBoxManage 加密介质 uuid|文件名
--newpassword 文件名|- --cipher 密码 ID --newpasswordid "ID

要提供加密密码,请将 VBoxManage 指向存储密码的文件或指定 - 让 VBoxManage 在命令行上询问您密码。

cipher 参数指定用于加密的密码,可以是 AES-XTS128-PLAIN64 或 AES-XTS256-PLAIN64。指定的密码标识符可由用户自由选择,用于在 VM 启动期间提供多个密码时进行正确识别。

如果用户在加密多个镜像时使用相同的密码,并且使用相同的密码标识符,则用户只需在 VM 启动时提供一次密码即可。2.29.3. 使用加密镜像启动 VM

使用 GUI 启动虚拟机时,将打开一个对话框,用户需要在其中输入连接到虚拟机的所有加密映像的所有密码。如果使用 VBoxHeadless 等其他前端,则虚拟机将在客户机尝试访问加密磁盘时立即暂停。用户需要使用以下命令通过 VBoxManage 提供密码:

VBoxManage controlvm uuid|vmname addencpassword ID 密码 [--removeonsuspend yes|no]

ID 必须与加密图像时提供的密码标识符相同。password 是加密图像时使用的密码。或者,您可以指定 --removeonsuspend yes|no 来指定是否在 VM 挂起时从 VM 内存中删除密码。在恢复 VM 之前,用户需要再次提供密码。当 VM 因主机挂起事件而挂起并且用户不希望密码保留在内存中时,这很有用。2.29.4. 解密加密图像

在某些情况下,可能需要解密先前加密的图像。这可以在完整 VM 的 GUI 中完成,也可以使用以下命令使用 VBoxManage 完成:

VBoxManage 加密介质 uuid|文件名 --旧密码文件|-

唯一需要的参数是图像加密的密码。选项与加密图像相同。

相关内容