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发布的实现。
用例¶
作为云管理员,为了让我的用户对正在运行的实例的安全性更有信心,我想提供具有特定属性的镜像或具有特定额外规格的flavor,这将允许用户启动实例,以确保他们的实例在支持SEV-ES的计算主机上运行,并启用了SEV-ES加密,而不是SEV加密。
作为云用户,为了进一步降低数据泄露风险,我想能够使用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_EStrait。使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额外规格中的新
hw:mem_encryption_model参数和镜像属性中的新hw_mem_encryption_model属性的支持。当其中任何一个设置为amd-sev-es以及启用内存加密的参数/属性时,它将被内部转换为resources:MEM_ENCRYPTION_CONTEXT=1和trait:HW_CPU_AMD_SEV_ES=required,这些将被添加到RequestSpec对象中的flavor额外规格中。如果这些新的模型参数/属性不存在或设置为amd-sev,则将被转换为resources:MEM_ENCRYPTION_CONTEXT=1和trait: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)
- 其他贡献者
无
工作项¶
为os-traits添加新的
HW_CPU_AMD_SEV_EStrait添加对主机SEV-ES功能检测的检测,如上所述,并重塑现有的MEMO_ENCRYPTION_CONTEXT资源。
将
mem_encryption_model属性添加到ImageMeta对象更新调度器util以请求
MEM_ENCRYPTION_CONTEXT资源和HW_CPU_AMD_SEV_EStrait,当mem_encryption_model属性或等效的flavor额外规格设置为amd-sev-es时更新libvirt驱动程序,以便在存在该属性时设置SEV-ES策略位。
更新glance中的镜像属性模式,以验证新的
mem_encryption_model属性。更新文档。
应根据新的逻辑添加单元测试和功能测试。
未来工作¶
无
依赖项¶
支持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的使用
文档影响¶
还应更新其他非nova文档
os-traits文档应在适当的地方进行扩展。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
2024.2 达尔马提安 |
已批准 |
2025.1 Epoxy |
重新提出 |
2025.2 Flamingo |
重新提出 |