AMD SEV (Secure Encrypted Virtualization)

20.0.0 版本新增:(Train)

Secure Encrypted Virtualization (SEV) 是 AMD 的一项技术,它能够使用仅对 VM 唯一的密钥对 VM 的内存进行加密。SEV 特别适用于云计算,因为它可以减少 VM 需要对主机系统的 hypervisor 和管理员的信任程度。

启用 SEV

首先,操作员需要确保满足以下先决条件

  • 目前,仅在使用 libvirt 计算驱动程序,且 libvirt.virt_typekvmqemu 时才支持 SEV。

  • 至少有一台 Nova 计算主机必须是 AMD 硬件,能够支持 SEV。计算平面完全可以由支持和不支持 SEV 的硬件混合组成,但根据 永久限制 下方的说明,同时运行的 SEV 客机的最大数量将受到可用 SEV 功能硬件的数量和质量的限制。

为了让用户能够使用 SEV,操作员需要执行以下步骤

  • 确保在 SEV 计算主机上保留足够的内存,以便主机级别的服务始终能够正常运行。这在托管启用了 SEV 的客户机时尤其重要,因为它们会将页面固定在 RAM 中,从而防止在其他计算主机上可能存在的任何内存过度提交。

    建议通过在主机上的 /machine.slice 顶级 cgroup 中配置 rlimit 来实现这一点,并将所有 VM 放置在该 cgroup 内部。(有关详细信息,请参阅 规范的此讨论。)

    另一种方法是在 nova.conf[DEFAULT] 部分中配置 reserved_host_memory_mb 选项,具体数值基于主机上同时运行的 SEV 客机的预期最大数量,以及 AMD SEV 规范早期版本 中有关内存区域大小的详细信息,这些信息涵盖了如何正确计算它。

    请参阅 AMD SEV 规范的内存锁定和会计部分之前的讨论 以获取更多详细信息。

  • 云管理员需要定义一个或多个启用了 SEV 的 flavor 如下所述,除非用户定义启用了 SEV 的镜像就足够了。

此外,云操作员应考虑以下可选步骤

  • nova.conf 中配置 libvirt.num_memory_encrypted_guests 选项,以表示 SEV 计算节点可以并发托管的具有硬件级别加密内存的客户机数量。例如

    [libvirt]
    num_memory_encrypted_guests = 15
    

    之所以存在此选项,是因为在 AMD SEV 功能硬件上,内存控制器为每个客户机保留加密密钥的固定数量的插槽。例如,在撰写本文时,较早一代的硬件只有 15 个插槽,因此可以并发运行的 SEV 客户机的数量限制为 15 个。Nova 需要跟踪可用和使用的插槽数量,以避免尝试超出硬件限制。

    自 8.0.0 版本以来,libvirt 暴露了主机可以并发运行的 SEV 客机的最大数量,因此使用此功能可以自动检测限制。因此,无需配置此选项。

    但是,如果使用旧版本的 libvirt,Nova 无法以编程方式检测正确的值,并且 Nova 不施加任何限制。因此,此配置选项充当了权宜之计,允许云操作员手动提供此值。

    此选项已被弃用,将在未来的版本中删除。

    注意

    如果使用早于 8.0.0 的 libvirt,操作员应仔细权衡收益与风险,以决定是使用默认值 None 还是手动施加限制。使用默认值的优点是 a) 立即方便,因为现在不需要执行任何操作,以及 b) 以后升级计算主机到 libvirt 的未来版本时方便,因为再次不需要执行任何操作即可施加正确的限制。但是风险是,在实现自动检测之前,用户可能会尝试在已经达到最大数量的并发运行加密内存客户机的主机上启动具有加密内存的客户机。可以通过操作员施加的其他限制来减轻此风险,例如,如果任何 flavor 的最小 RAM 占用量施加的并发运行客户机最大数量小于或等于 SEV 限制。

  • 在所有 SEV 功能计算主机上配置 ram_allocation_ratio1.0。使用 SEV 需要锁定客户机内存,这意味着无法过度提交主机内存。

    或者,您可以使用 hw:mem_page_size flavor extra spec 和等效的镜像元数据属性来显式配置实例的小页面。有关更多信息,请参阅 巨页

  • 在所有 SEV 功能计算主机上配置 libvirt.hw_machine_type,以包含 x86_64=q35,以便所有 x86_64 镜像默认使用 q35 机器类型。(目前,Nova 默认将 x86_64 架构的机器类型设置为 pc,尽管 预计未来会发生变化。)

    将默认值从 pc 更改为 q35 可以通过消除需要在希望进行 SEV 引导的每个镜像上将 hw_machine_type 属性设置为 q35 的需要,从而使用户创建和配置镜像更加方便。

    警告

    仔细考虑是否设置此选项非常重要,因为实现的一个限制是,如果用户尝试引导 SEV 客机,但此配置选项或镜像属性均未设置为选择 q35 机器类型,则用户将无法收到带有有用说明的错误消息。

    另一方面,将其设置为 q35 可能会对其他期望使用 pc 引导的其他镜像产生其他不良副作用,因此建议在一个计算节点或聚合上设置它,并在将设置推广到所有 SEV 功能计算主机之前仔细测试典型的镜像。

配置 flavor 或镜像

一旦操作员完成了上述步骤,用户可以通过请求操作员将 hw:mem_encryption extra spec 设置为 True 的 flavor,或者通过使用将 hw_mem_encryption 属性设置为 True 的镜像来启动 SEV 实例。例如,要为 flavor 启用 SEV

$ openstack flavor set FLAVOR-NAME \
    --property hw:mem_encryption=true

也可以使用 SEV-ES,而不是 SEV,方法是将 hw:mem_encryption_model extra spec 设置为 amd-sev-es,或者使用将 hw_mem_encryption_model 属性设置为 amd-sev-es 的镜像。如果未设置 extra spec 和属性,或者设置为 amd-sev,则使用 SEV。

在所有情况下,SEV 实例只能从将 hw_firmware_type 属性设置为 uefi 的镜像启动,并且仅当机器类型设置为 q35 时才能启动。可以通过将镜像属性 hw_machine_type=q35 设置为 q35,或者通过操作员通过 libvirt.hw_machine_type 如上所述来设置。

限制

临时限制

以下限制可能会在硬件、固件和各种软件层获得新功能后删除

  • SEV 加密的 VM 尚未能够进行实时迁移或暂停,因此在迁移到 SEV 主机之前,需要完全关闭它们,例如,如果需要对主机进行维护。

  • SEV 加密的 VM 不能包含直接可访问的主机设备(PCI 直通)。因此,例如 mdev vGPU 支持目前无法工作。但是,基于 vhost-user 的技术应该可以正常工作。

  • SEV 加密 VM 的启动磁盘只能是 virtio。(virtio-blk 通常是 libvirt 在 x86 上的磁盘的默认值,但也可以通过例如镜像属性 hw_disk_bus=virtio 显式设置)。有效的替代磁盘包括使用 hw_disk_bus=scsihw_scsi_model=virtio-scsi,或 hw_disk_bus=sata

永久限制

预计以下限制将长期存在

非限制

为了消除任何疑问,以下操作 预计在使用 SEV 加密时受到限制

  • 冷迁移或搁置,因为它们会在关机 VM 之前进行操作,此时没有加密的内存(尽管这可能会发生变化,因为正在进行支持 PMEM 的工作)

  • 快照,因为它仅快照磁盘

  • nova evacuate(尽管名称如此,但更类似于复活而不是撤离),因为这仅在 VM 不再运行时启动

  • 附加任何卷,只要它们不需要通过 IDE 总线附加

  • 使用 spice / VNC / serial / RDP 控制台

  • VM 客体虚拟 NUMA

参考