Hyper-V vTPM 设备¶
https://blueprints.launchpad.net/nova/+spec/hyper-v-vtpm-devices
Windows / Hyper-V Server 技术预览版引入了将 vTPM 设备附加到 Hyper-V 虚拟机的功能,为用户提供了增强其安全性和系统完整性的可能性。
问题描述¶
目前,Hyper-V 驱动程序不支持将 vTPM 设备添加到实例。此蓝图旨在解决此问题。
用例¶
可信平台模块 (TPM) 技术旨在提供基于硬件的安全相关功能,并包含多种安全机制以使其防篡改。使用 TPM 技术的关键优势包括
生成、存储和限制加密密钥的使用。
使用 TPM 的唯一 RSA 密钥进行平台设备身份验证,该密钥已刻录到 TPM 中。
通过获取和存储安全测量值来帮助确保平台完整性。
基于 TPM 的虚拟智能卡。
受保护的虚拟机使用 vTPM 设备。在实例的安全性至关重要的情况下,应使用受保护的虚拟机。它们已加密(BitLocker 或其他方式),确保只有指定的所有者才能访问虚拟机。[2]
受保护的虚拟机的一些特性是
无法检查磁盘。
无法检查内存。
无法检查进程。
无法将调试器附加到系统。
无法更改配置。
简而言之,即使超visor 主机的管理员受到损害,所有现有的虚拟机数据也是安全的。
有关 vTPM 的更多信息和用例,请参阅参考部分 [1]。
项目优先级¶
无
提议的变更¶
此功能在早于 Windows / Hyper-V Server 技术预览版中不可用。无法在早期版本上创建 vTPM 设备。
如果给定的实例需要 vTPM 设备,但它不包含 hw_machine_type=hyperv-gen2 镜像属性,则实例创建将失败,因为 vTPM 只能添加到第二代虚拟机。第二代虚拟机是在 Windows / Hyper-V Server 2012 R2 中引入的,并在 Kilo 版本中引入了对其的支持(请参阅依赖关系部分)。
由于并非所有客户都支持 vTPM,因此为不支持它的实例启用它是没有意义的。因此,通过将 os_vtpm 镜像属性或 os:vtpm flavor extra spec 设置为 required 来创建具有 vTPM 设备的实例。其他可能的值是:disabled 和 optional。flavor extra spec 值会覆盖镜像属性值。
镜像属性 os_vtpm_keys 包含一个逗号分隔的 UUID 列表,这些 UUID 是对 Barbican 存储的密钥的引用。由于 nova InstanceSystemMetadata 模型限制为 255 个字节,因此最多可以添加 6 个引用。这些密钥包含必须设置到 vTPM 的数据。对于受保护的虚拟机,这是强制性的。提供此镜像属性而不请求 vTPM 设备将导致异常。如果无法获取 Barbican 密钥之一,将引发异常。
调度由 ImagePropertiesFilter [5] 保证,它检查镜像属性 hypervisor_version_requires 是否满足给定主机。这是解决调度问题的初始方法。理想情况下,此问题将通过将此功能作为主机功能公开,并使 os_vtpm_device 镜像属性或 os:vtpm_device flavor extra spec 与主机功能匹配来解决。
要实现以下操作
添加 Barbican 身份验证配置选项。
使用 python-barbicanclient 和镜像属性
os_vtpm_keys(这是一个逗号分隔的 UUID 列表,是对 Barbican 密钥的引用)从 Barbican 中获取 vTPM 密钥。使用先前获取的加密密钥创建 Host Guardian Service KeyProtector,并在 Host Guardian 中注册它(如果提供了镜像属性
os_vtpm_keys)。将 vTMP 设备添加到第二代虚拟机,启用它并将先前创建的 KeyProtector 添加到它。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
用户将能够使用 vTPM,这对于控制访问控制和身份验证非常有用。这可以提高 VM 的安全性。
VM 加密密钥必须受到保护。它们必须作为密钥存储在 Barbican 中,并确保服务已正确设置。有关更多信息,请参阅参考部分 [4]。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
为了使此功能可用,必须启用 Host Guardian Service,并且主机必须受到保护(Guardian Service 密钥必须导入到本地主机)。[2]
需要 Barbican 才能正确使用此功能 [4]。它将用于将 VM 加密密钥作为密钥存储。为了能够使用它,必须在 compute 节点的 nova.conf 文件中的 [barbican] 部分设置有关 Barbican 身份验证的配置选项。将提供一个示例。(进行中)
具有 vTPM 的 VM 无法从一个 Active Directory 迁移到另一个或迁移到 Unguarded Host。为了确保调度程序不会选择当前 Active Directory 之外的主机,应将 Active Directory 中的所有 Guarded Host 添加到同一个聚合中。
此功能仅在 Windows / Hyper-V Server 技术预览版中可用,并且为了确保正确的调度,应将 hypervisor_version_requires 镜像属性设置为 >=10.0。
必须准备好镜像以用于受保护的虚拟机。例如,准备镜像的 VM 必须是第二代 VM,具有带有 Host Guardian Service KeyProtector 设置的 vTPM 设备。附加的驱动器必须使用 BitLocker 或任何加密程序进行加密 [2]。然后,密钥数据必须存储到 Barbican 作为密钥。[4]
为了创建附加了 vTPM 设备的实例,用户必须以以下方式请求它
镜像属性
os_vtpm设置为required。镜像属性
os_vtpm设置为optional并且 flavor extra specos:vtpm设置为required。
矛盾的镜像属性和 flavor extra spec 将导致实例创建失败。
任何密钥数据都应存储到 Barbican 作为密钥,并创建镜像属性 os_vtpm_keys,其中包含对密钥的逗号分隔引用(由于长度限制 - 最大 255 个字符,最多 6 个引用),否则实例将在 vTPM 中生成而没有存储任何数据。示例值:UUID1,UUID2,UUID3
如果设置了 os_vtpm_keys 镜像属性,则镜像属性 os_vtpm 或 flavor extra spec os:vtpm 必须设置为 required,否则实例将不会生成。
镜像创建示例
- glance image-create –property hypervisor_type=hyperv
–property hw_machine_type=hyperv-gen2 –property hypervisor_version_requires=’>=10.0’ –property os_vtpm=required –property os_vtpm_keys=$key_refs –name im-secure –disk-format vhd –container-format bare –file path/to/image.vhdx
或者
glance image-update –property hw_machine_type=hyperv-gen2 win-secure
glance image-update –property hypervisor_version_requires=’>=10.0’ im-secure
glance image-update –property os_vtpm=required im-secure
glance image-update –property os_vtpm_keys=$key_refs im-secure
镜像属性 os_vtpm 的可接受值是:disabled, optional, required。如果未定义该属性,则将使用 disabled 作为默认值。optional 值表示图像客户操作系统可以使用 vTPM,但需要 flavor extra spec 才能创建具有 vTPM 设备的实例。
Flavor extra spec 示例
nova flavor-key m1.your.flavor set “os:vtpm=required”
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Claudiu Belu <cbelu@cloudbasesolutions.com>
工作项¶
如“拟议的变更”部分所述。
依赖项¶
- Hyper-V VM 第 2 代 nova 规范。功能合并在 Kilo 中。
测试¶
单元测试。
该功能将由 Hyper-V CI 进行测试。
文档影响¶
必须记录新的镜像属性和 flavor extra spec。必须记录新的 Barbican 凭据配置选项。
参考资料¶
- [1] 可信平台模块技术概述
- [2] 受保护的虚拟机和 Guarded Fabric 验证指南
https://gallery.technet.microsoft.com/Shielded-VMs-and-Guarded-44176db3
- [3] 加强 Fabric:保护 Hyper-V 中的租户密钥
- [4] Barbican 存储密钥
https://github.com/cloudkeep/barbican/wiki/Barbican-Quick-Start-Guide