机密计算密钥

本文档描述了从固件到操作系统,在 EFI 驱动程序和 efi_secret 内核模块中,如何处理机密计算密钥注入。

简介

诸如 AMD SEV(安全加密虚拟化)之类的机密计算 (coco) 硬件允许访客所有者将密钥注入虚拟机内存,而主机/虚拟机监控程序无法读取这些密钥。 在 SEV 中,密钥注入在虚拟机启动过程的早期执行,在访客开始运行之前。

efi_secret 内核模块允许用户空间应用程序通过 securityfs 访问这些密钥。

密钥数据流

访客固件可以为密钥注入保留指定的内存区域,并在 EFI 配置表中 LINUX_EFI_COCO_SECRET_AREA_GUID 条目 (adf956ad-e98c-484c-ae11-b51c7d336447) 下发布其位置(基地址 GPA 和长度)。 此内存区域应由固件标记为 EFI_RESERVED_TYPE,因此内核不应将其用于自身目的。

在虚拟机启动期间,虚拟机管理器可以将密钥注入到该区域。 在 AMD SEV 和 SEV-ES 中,这是使用 KVM_SEV_LAUNCH_SECRET 命令执行的(请参见 [sev])。 注入的访客所有者密钥数据的结构应为带 GUID 的密钥值表;二进制格式在 drivers/virt/coco/efi_secret/efi_secret.c 的 “EFI 密钥区域的结构” 下描述。

在内核启动时,内核的 EFI 驱动程序将密钥区域的位置(从 EFI 配置表中获取)保存在 efi.coco_secret 字段中。 稍后,它会检查密钥区域是否已填充:它会映射该区域并检查其内容是否以 EFI_SECRET_TABLE_HEADER_GUID (1e74f542-71dd-4d66-963e-ef4287ff173b) 开头。 如果密钥区域已填充,则 EFI 驱动程序将自动加载 efi_secret 内核模块,该模块通过 securityfs 将密钥暴露给用户空间应用程序。 efi_secret 文件系统接口的详细信息在 [secrets-coco-abi] 中。

应用程序使用示例

考虑一个访客对加密文件执行计算。 访客所有者使用密钥注入机制提供解密密钥(=密钥)。 访客应用程序从 efi_secret 文件系统读取密钥,并继续将文件解密到内存中,然后在内容上执行所需的计算。

在此示例中,主机无法从磁盘映像中读取文件,因为它们已加密。主机无法读取解密密钥,因为它通过密钥注入机制(=安全通道)传递。主机无法从内存中读取解密的内容,因为它是一个机密(内存加密)访客。

以下是一个简单的示例,说明如何在启动期间向其中注入了具有 4 个密钥的 EFI 密钥区域的访客中使用 efi_secret 模块

# ls -la /sys/kernel/security/secrets/coco
total 0
drwxr-xr-x 2 root root 0 Jun 28 11:54 .
drwxr-xr-x 3 root root 0 Jun 28 11:54 ..
-r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
-r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
-r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2
-r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910

# hd /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910
00000000  74 68 65 73 65 2d 61 72  65 2d 74 68 65 2d 6b 61  |these-are-the-ka|
00000010  74 61 2d 73 65 63 72 65  74 73 00 01 02 03 04 05  |ta-secrets......|
00000020  06 07                                             |..|
00000022

# rm /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910

# ls -la /sys/kernel/security/secrets/coco
total 0
drwxr-xr-x 2 root root 0 Jun 28 11:55 .
drwxr-xr-x 3 root root 0 Jun 28 11:54 ..
-r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
-r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
-r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2

参考

有关 SEV LAUNCH_SECRET 操作的更多信息,请参阅 [sev-api-spec]