1*7b8a9439SShuo Zhao.. SPDX-License-Identifier: GPL-2.0 2*7b8a9439SShuo Zhao.. include:: ../../disclaimer-zh_CN.rst 3*7b8a9439SShuo Zhao 4*7b8a9439SShuo Zhao:Original: Documentation/security/secrets/coco.rst 5*7b8a9439SShuo Zhao 6*7b8a9439SShuo Zhao:翻译: 7*7b8a9439SShuo Zhao 8*7b8a9439SShuo Zhao 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> 9*7b8a9439SShuo Zhao 10*7b8a9439SShuo Zhao============ 11*7b8a9439SShuo Zhao机密计算密钥 12*7b8a9439SShuo Zhao============ 13*7b8a9439SShuo Zhao 14*7b8a9439SShuo Zhao本文档介绍了在EFI驱动程序和efi_secret内核模块中,机密计算密钥从固件 15*7b8a9439SShuo Zhao到操作系统的注入处理流程。 16*7b8a9439SShuo Zhao 17*7b8a9439SShuo Zhao简介 18*7b8a9439SShuo Zhao==== 19*7b8a9439SShuo Zhao 20*7b8a9439SShuo Zhao机密计算硬件(如AMD SEV,Secure Encrypted Virtualization)允许虚拟机 21*7b8a9439SShuo Zhao所有者将密钥注入虚拟机(VM)内存,且主机/虚拟机监控程序无法读取这些密 22*7b8a9439SShuo Zhao钥。在SEV中,密钥注入需在虚拟机启动流程的早期阶段(客户机开始运行前) 23*7b8a9439SShuo Zhao执行。 24*7b8a9439SShuo Zhao 25*7b8a9439SShuo Zhaoefi_secret内核模块允许用户空间应用程序通过securityfs(安全文件系统)访 26*7b8a9439SShuo Zhao问这些密钥。 27*7b8a9439SShuo Zhao 28*7b8a9439SShuo Zhao密钥数据流 29*7b8a9439SShuo Zhao========== 30*7b8a9439SShuo Zhao 31*7b8a9439SShuo Zhao客户机固件可能会为密钥注入预留一块指定的内存区域,并将该区域的位置(基准 32*7b8a9439SShuo Zhao客户机物理地址GPA和长度)在EFI配置表中,通过 ``LINUX_EFI_COCO_SECRET_AREA_GUID`` 33*7b8a9439SShuo Zhao条目(对应的GUID值为 ``adf956ad-e98c-484c-ae11-b51c7d336447`` )的形式发布。 34*7b8a9439SShuo Zhao固件应将此内存区域标记为 ``EFI_RESERVED_TYPE`` ,因此内核不应将其用于自身用途。 35*7b8a9439SShuo Zhao 36*7b8a9439SShuo Zhao虚拟机启动过程中,虚拟机管理器可向该区域注入密钥。在AMD SEV和SEV-ES中,此 37*7b8a9439SShuo Zhao操作通过 ``KVM_SEV_LAUNCH_SECRET`` 命令执行(参见 [sev_CN]_ )。注入的“客户机 38*7b8a9439SShuo Zhao所有者密钥数据”应采用带GUID的密钥值表结构,其二进制格式在 ``drivers/virt/ 39*7b8a9439SShuo Zhaococo/efi_secret/efi_secret.c`` 文件的EFI密钥区域结构部分中有详细描述。 40*7b8a9439SShuo Zhao 41*7b8a9439SShuo Zhao内核启动时,内核的EFI驱动程序将保存密钥区域位置(来自EFI配置表)到 ``efi.coco_secret`` 42*7b8a9439SShuo Zhao字段。随后,它会检查密钥区域是否已填充:映射该区域并检查其内容是否以 43*7b8a9439SShuo Zhao``EFI_SECRET_TABLE_HEADER_GUID`` (对应的GUID为 ``1e74f542-71dd-4d66-963e-ef4287ff173b`` ) 44*7b8a9439SShuo Zhao开头。如果密钥区域已填充,EFI驱动程序将自动加载efi_secret内核模块,并通过securityfs将密钥 45*7b8a9439SShuo Zhao暴露给用户空间应用程序。efi_secret文件系统接口的详细信息请参考 [secrets-coco-abi_CN]_ 。 46*7b8a9439SShuo Zhao 47*7b8a9439SShuo Zhao 48*7b8a9439SShuo Zhao应用使用示例 49*7b8a9439SShuo Zhao============ 50*7b8a9439SShuo Zhao 51*7b8a9439SShuo Zhao假设客户机需要对加密文件进行计算处理。客户机所有者通过密钥注入机制提供解密密钥 52*7b8a9439SShuo Zhao(即密钥)。客户机应用程序从efi_secret文件系统读取该密钥,然后将文件解密到内存中, 53*7b8a9439SShuo Zhao接着对内容进行需要的计算。 54*7b8a9439SShuo Zhao 55*7b8a9439SShuo Zhao在此示例中,主机无法从磁盘镜像中读取文件,因为文件是加密的;主机无法读取解密密钥, 56*7b8a9439SShuo Zhao因为它是通过密钥注入机制(即安全通道)传递的;主机也无法读取内存中的解密内容,因为 57*7b8a9439SShuo Zhao这是一个机密型(内存加密)客户机。 58*7b8a9439SShuo Zhao 59*7b8a9439SShuo Zhao以下是一个简单的示例,展示了在客户机中使用efi_secret模块的过程,在启动时注入了 60*7b8a9439SShuo Zhao一个包含4个密钥的EFI密钥区域:: 61*7b8a9439SShuo Zhao 62*7b8a9439SShuo Zhao # ls -la /sys/kernel/security/secrets/coco 63*7b8a9439SShuo Zhao total 0 64*7b8a9439SShuo Zhao drwxr-xr-x 2 root root 0 Jun 28 11:54 . 65*7b8a9439SShuo Zhao drwxr-xr-x 3 root root 0 Jun 28 11:54 .. 66*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b 67*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 68*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 69*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910 70*7b8a9439SShuo Zhao 71*7b8a9439SShuo Zhao # hd /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910 72*7b8a9439SShuo Zhao 00000000 74 68 65 73 65 2d 61 72 65 2d 74 68 65 2d 6b 61 |these-are-the-ka| 73*7b8a9439SShuo Zhao 00000010 74 61 2d 73 65 63 72 65 74 73 00 01 02 03 04 05 |ta-secrets......| 74*7b8a9439SShuo Zhao 00000020 06 07 |..| 75*7b8a9439SShuo Zhao 00000022 76*7b8a9439SShuo Zhao 77*7b8a9439SShuo Zhao # rm /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910 78*7b8a9439SShuo Zhao 79*7b8a9439SShuo Zhao # ls -la /sys/kernel/security/secrets/coco 80*7b8a9439SShuo Zhao total 0 81*7b8a9439SShuo Zhao drwxr-xr-x 2 root root 0 Jun 28 11:55 . 82*7b8a9439SShuo Zhao drwxr-xr-x 3 root root 0 Jun 28 11:54 .. 83*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b 84*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 85*7b8a9439SShuo Zhao -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 86*7b8a9439SShuo Zhao 87*7b8a9439SShuo Zhao 88*7b8a9439SShuo Zhao参考文献 89*7b8a9439SShuo Zhao======== 90*7b8a9439SShuo Zhao 91*7b8a9439SShuo Zhao请参见 [sev-api-spec_CN]_ 以获取有关SEV ``LAUNCH_SECRET`` 操作的更多信息。 92*7b8a9439SShuo Zhao 93*7b8a9439SShuo Zhao.. [sev_CN] Documentation/virt/kvm/x86/amd-memory-encryption.rst 94*7b8a9439SShuo Zhao.. [secrets-coco-abi_CN] Documentation/ABI/testing/securityfs-secrets-coco 95*7b8a9439SShuo Zhao.. [sev-api-spec_CN] https://www.amd.com/system/files/TechDocs/55766_SEV-KM_API_Specification.pdf 96*7b8a9439SShuo Zhao 97