libvirt驱动程序启动使用AMD SEV-ES内存加密的实例

https://blueprints.launchpad.net/nova/+spec/amd-sev-es-libvirt-support

本规范提出需要进行的工作,以扩展现有的libvirt驱动程序功能,以启动AMD SEV加密的实例,同时支持使用AMD SEV-ES,它是AMD SEV的扩展版本,作为内存加密机制。

问题描述

当前的libvirt驱动程序支持使用AMD的SEV(安全加密虚拟化)技术启动实例。但是,当前实现仅支持AMD SEV,不支持新版本。例如,SEV-ES在VM停止运行时也会加密所有CPU寄存器内容,以实现对VM数据的更全面保护,但由于此限制,用户无法利用这些功能。

注意

在撰写本文时,AMD已经发布了支持SEV-SNP的CPU,但使用SEV-SNP所需的超visor功能尚未合并到底层组件(内核、QEMU、libvirt和ovmf)中。因此,在本规范中,我们专注于SEV-ES。我们尝试使提案尽可能与SEV-SNP兼容,基于AMD发布的实现。

用例

  1. 作为云管理员,为了让我的用户对正在运行的实例的安全性更有信心,我想提供具有特定属性的镜像或具有特定额外规格的flavor,这将允许用户启动实例,以确保他们的实例在支持SEV-ES的计算主机上运行,并启用了SEV-ES加密,而不是SEV加密。

  2. 作为云用户,为了进一步降低数据泄露风险,我想能够使用SEV-ES功能启动VM实例,而不是SEV功能。

提议的变更

我们建议扩展现有实现以支持启动具有SEV功能的实例。

  • 添加对主机SEV-ES功能检测,检查以下项目。

    • libvirt virConnectGetDomainCapabilities() API调用的响应中存在的以下XML 表明QEMU和AMD安全处理器(AMD-SP)都支持SEV功能

      <domainCapabilities>
        ...
        <features>
          ...
          <sev supported='yes'/>
            ...
          </sev>
        </features>
      </domainCapabilities>
      

      此外,maxESGuests字段也应存在,并且其值应为正(非零)值。

    • /sys/module/kvm_amd/parameters/sev_es应具有值Y,以指示内核已启用SEV功能。这应该可以被任何用户读取(即,即使是非root用户)。

    • 检查QEMU版本以确定可用的QEMU二进制文件是否支持SEV-ES。

  • 在os-traits中添加新的HW_CPU_AMD_SEV_ES trait。

  • 使libvirt驱动程序更新ProviderTree对象,为SEV和SEV-ES的MEM_ENCRYPTION_CONTEXT资源类提供正确的库存。为了表示专用于SEV和SEV-ES的插槽,为每个模型创建嵌套的资源提供程序

    +------------+     +----------------------------+
    | compute RP +--+--+ SEV RP                     |
    +------------+  |  | trait:HW_CPU_AMD_SEV       |
                    |  +------------------------+---+
                    |  | MEM_ENCRYPTION_CONTEXT | N |
                    |  +------------------------+---+
                    |
                    |  +----------------------------+
                    +--+ SEV-ES RP                  |
                       | trait:HW_CPU_AMD_SEV_ES    |
                       +------------------------+---+
                       | MEM_ENCRYPTION_CONTEXT | N |
                       +------------------------+---+
    

    SEV RP命名为<nodename>_amd_sev,SEV-ES RP命名为<nodename>_amd_sev_es,以便RP名称在集群中是唯一的。

    注意

    SEV和SEV-ES具有单独的guest数量限制,因为ASID专用于ES guest和非ES guest,来自可用的总ASID。SEV(非ES)guest的最小ASID,实际上与ES guest的最大ASID相同,应在BIOS(或UEFI)中配置以使用SEV-ES。可以实现一个新的验证来检测ASID不足的情况。

    注意

    SEV-SNP默认情况下使用相同的ASID池用于ES,当未请求密文隐藏时,并且可以将新的trait(例如HW_CPU_AMD_SEV_SNP)添加到现有的SEV-ES RP中,当添加了SEV-SNP支持并使用与密文隐藏功能对应的单独的SEV-SNP RP时

    +------------+     +----------------------------+
    | compute RP +--+--+ SEV RP                     |
    +------------+  |  | trait:HW_CPU_AMD_SEV       |
                    |  +------------------------+---+
                    |  | MEM_ENCRYPTION_CONTEXT | N |
                    |  +------------------------+---+
                    |
                    |  +----------------------------+
                    +--+ SEV-ES RP                  |
                    |  | trait:HW_CPU_AMD_SEV_ES    |
                    |  | trait:HW_CPU_AMD_SEV_SNP   |
                    |  +------------------------+---+
                    |  | MEM_ENCRYPTION_CONTEXT | N |
                    |  +------------------------+---+
                    |
                    |  +-----------------------------+
                    +--+ SEV-SNP RP                  |
                       | trait:HW_CPU_AMD_SEV_SNP_CH |
                       +------------------------+----+
                       | MEM_ENCRYPTION_CONTEXT | N  |
                       +------------------------+----+
    

    请注意,SEV-SNP支持超出当前范围,并且需要在实际实现支持时进一步讨论此设计。此处描述是为了解释未来扩展RP结构的潜在计划。

  • 添加对 flavor extra specs 中新的 hw:mem_encryption_model 参数和新的 hw_mem_encryption_model 镜像属性的支持。当其中任何一个设置为 amd-sev-es 并且同时设置了启用内存加密的参数/属性时,它将被内部转换为 resources:MEM_ENCRYPTION_CONTEXT=1trait:HW_CPU_AMD_SEV_ES=required,并将其添加到 RequestSpec 对象中的 flavor extra specs 中。如果这些新的模型参数/属性不存在或设置为 amd-sev,则将被转换为 resources:MEM_ENCRYPTION_CONTEXT=1trait:HW_CPU_AMD_SEV=required。如果实例 flavor 和实例镜像请求了冲突的模型(例如,flavor 有 hw:mem_encryption_model=amd-sev 但镜像有 hw_mem_encryption_model=amd-sev-es),则请求将被拒绝。此外,当未请求内存加密但请求了内存加密模型时,请求也应被拒绝。

  • 更改libvirt驱动程序,以便在flavor额外规格中的hw:mem_encryption_model参数或镜像属性中的hw_mem_encryption_model属性存在并且设置为amd-sev-es时,在guest的domain定义中包含额外的XML。额外的XML与SEV中使用的XML大致相同,但其guest策略字段需要启用SEV-ES位(位2)。

注意

Guest证明目前不在我们的范围内。因为现有的guest证明功能严重依赖于超visor功能,不适用于机密计算用例,在这种用例中,用户不信任超visor。我们计划在SEV-SNP普遍可用时实现guest证明功能,因为SEV-SNP提供了一种更好的guest证明机制,使用提供给guest机器的特殊设备来获取证明报告。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

最终用户将通过flavor额外规格和镜像属性中的现有资源来利用SEV-ES。

此外,AMD SEV加密guest的限制在使用SEV-ES时适用。

性能影响

预计不会对nova产生性能影响。

其他部分的性能影响与现有的SEV支持功能相同。

其他部署者影响

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

  • 将支持SEV-ES的硬件作为nova计算主机部署。

    • AMD EPYC 7xx2(Rome)或更高版本

  • 在BIOS(或UEFI)中将SEV(非ES)guest的最小ASID设置为大于0的值。

    注意

    如果SEV启用的实例已经启动在计算节点中,则应为SEV保留足够的ASID。

  • 确保他们拥有适当配置的软件堆栈,以便各个层级都已准备好SEV-ES

    • kernel >= 4.16

    • QEMU >= 6.0.0

    • libvirt >= 8.0.0

    • ovmf >= commit 7f0b28415cb4 2020-08-12

    注意

    SEV-ES启用的guest可以通过libvirt >= 4.5启动,但是通过domain capability API检测最大数量的SEV-ES guest需要libvirt >= 8.0.0。

云管理员需要定义SEV-ES启用的flavor,如上所述,除非用户定义SEV-ES启用的镜像就足够了。

[libvirt] num_memory_encrypted_guests选项仅对SEV有效,但未为SEV-ES添加新的选项。相反,需要libvirt中的检测功能才能使用SEV-ES。num_memory_encrypted_guests选项将被弃用以减少复杂性。

开发人员影响

升级影响

实现

负责人

主要负责人

kajinamit (irc: tkajinam)

其他贡献者

工作项

  1. 为os-traits添加新的HW_CPU_AMD_SEV_ES trait

  2. 添加对主机SEV-ES功能检测的检测,如上所述,并重塑现有的MEMO_ENCRYPTION_CONTEXT资源。

  3. mem_encryption_model属性添加到ImageMeta对象

  4. 更新调度器util以请求MEM_ENCRYPTION_CONTEXT资源和HW_CPU_AMD_SEV_ES trait,当mem_encryption_model属性或等效的flavor额外规格设置为amd-sev-es

  5. 更新libvirt驱动程序,以便在存在该属性时设置SEV-ES策略位。

  6. 更新glance中的镜像属性模式,以验证新的mem_encryption_model属性。

  7. 更新文档。

应根据新的逻辑添加单元测试和功能测试。

未来工作

依赖项

  • 支持SEV-ES的特殊硬件,用于开发、测试和CI。

  • 最新版本的超visor软件堆栈,所有这些都支持SEV-ES,如其他部署人员影响中所述。

测试

fakelibvirt测试驱动程序需要进行调整才能模拟支持SEV-ES的硬件。

需要扩展或添加相应的单元/功能测试,以涵盖

  • 检测支持SEV-ES的硬件和软件,例如,作为nova.tests.functional.libvirt.test_report_cpu_traits.LibvirtReportTraitsTests的扩展

  • nova.tests.unit.virt.libvirt.test_config中包含额外的SEV特定libvirt domain XML配置的trait的使用

文档影响

  • 更新功能支持矩阵中的条目,以解释现在AMD SEV-ES除了AMD SEV之外也受支持。

  • 更新现有的AMD SEV指南,以包含有关SEV-ES的信息。

还应更新其他非nova文档

参考资料

历史

修订版

发布名称

描述

2024.2 达尔马提安

引入