用例
我有一台 Ubuntu 服务器计算机,它被封装在包含 Web 应用程序的 VM(vmdk 文件)中。我想将此 VM 发送给某人,然后阻止他访问虚拟机的内部文件系统- 我不想让他从vmdk文件中提取机器的文件系统。
用户可以直接启动机器或者关闭机器(机器启动时会自动加载应用程序后端服务)。
解决方案?
我虽然考虑过使用硬盘加密(使用 LUKS 或 VeraCrypt 等其他解决方案的全盘加密),但我主要关心的是如何将它在基于服务器的环境中使用。
我不想让用户输入任何解密密钥或类似的东西——我看到有解决方案可以在启动时自动解密文件系统,例如这里和这里而且我似乎需要将解密密钥存储在虚拟机内部。
有没有办法通过使用远程用户登录来解密机器?(我不太担心更复杂的问题,如侧信道攻击或热虚拟机克隆)。或者任何其他可以满足用例的解决方案?
更新
在@vidarlo 回答之后,我决定采用 FDE 解决方案并了解其权衡利弊。
以下是我使用的配置说明(假设 /boot 位于 /dev/sda1 未加密分区上,而加密分区位于 /dev/sdaX 分区上)。
创建一个新的随机密码并将其存储在 luks 密钥库中:
sudo dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4
sudo chmod 0400 /boot/keyfile
sudo cryptsetup luksAddKey /dev/sdaX /boot/keyfile
运行以下命令获取 /dev/sda1 分区的 UUID:
sudo ls -l /dev/disk/by-uuid/
/etc/crypttab
使用以下内容更新文件:
sdaX_crypt UUID=<UUID_OF_SDAX> /dev/disk/by-uuid/<UUID_OF_SDA1>:/keyfile luks,keyscript=/lib/cryptsetup/scripts/passdev
更新 initramfs
sudo update-initramfs -u
重启
sudo reboot
答案1
/boot
您可以使用未加密的和 LUKS 密钥文件设置解决方案:
sudo cryptsetup luksAddKey /dev/sdx1 /boot/random_data_keyfile1
修改/etc/crypttab
以适应:
sda5_crypt UUID=DEVICE_UUID /dev/disk/by-uuid/devicewithkey:/random_data_keyfile1 luks,keyscript=/lib/cryptsetup/scripts/passdev
这并不是万无一失的。任何远程熟练的攻击者都会找到未加密的/boot
和密钥文件。你可以隐藏它以使其更难,但最终你的问题是无法解决。
您希望此人能够执行虚拟机,但无法访问它。执行需要访问。最坏的情况是什么?暂停虚拟机,并检查虚拟机的内存。任何可以控制虚拟机管理程序的人都可以完全控制虚拟机,几乎无论您做什么。