機密計算秘密¶
本文件描述了機密計算秘密注入如何在 EFI 驅動程式和 efi_secret 核心模組中從韌體到作業系統進行處理。
簡介¶
機密計算 (coco) 硬體,例如 AMD SEV(安全加密虛擬化),允許客戶機所有者將秘密注入到虛擬機器記憶體中,而主機/管理程式無法讀取它們。在 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])。注入的客戶機所有者秘密資料的結構應為秘密值的 GUIDed 表;二進位制格式在 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]。