共用方式為


AKS Edge Essentials 的 TPM 存取

信賴平臺模組 (TPM) 晶片是一種安全的加密處理器,其設計目的是執行密碼編譯作業。 此技術的設計目的是提供硬體式的安全性相關功能。 您可以啟用或停用 TPM 傳遞功能,讓 AKS Edge Essentials 虛擬機能夠使用 Windows 主機 OS TPM。 TPM 傳遞功能提供儲存在 TPM 內之密碼編譯密鑰的唯讀取權。

本文說明如何在 C# 中開發範例程式代碼,以讀取儲存在裝置離散 TPM 內的密碼編譯密鑰。

注意

TPM 金鑰的存取限制為唯讀。 如果您想要將金鑰寫入 TPM,您必須從 Windows 主機 OS 內執行。

必要條件

  • 具有 TPM 或 vTPM 的 Windows 主機 OS(如果您使用 Windows 主機 OS 虛擬機)。
  • 從已啟用 TPM 傳遞的 CBL-Mariner 虛擬機啟用 TPM 存取。 在 aksedge-config 檔案的 machines 區段中,將 Machine.LinuxNode.TpmPassthrough 值設定為 True。 您只能在建立新的部署時啟用或停用 TPM 存取。 設定旗標之後,除非您移除部署或節點,否則無法變更旗標。
  • 請確定非揮發性(NV) 索引 (預設 index=3001) 是以 8 個字節的數據初始化。 範例所使用的預設 AuthValue{1,2,3,4,5,6,7,8},這會對應至寫入 TPM 時,TSS.MSR 連結庫中的 NV (Windows) 範例。 所有索引初始化都必須在 Windows 主機上進行,才能從 CBL-Mariner VM 讀取。 如需 TPM 範例的詳細資訊,請參閱 TSS.MSR

警告

啟用 TPM 傳遞至虛擬機可能會增加安全性風險。

建立範例 TPM 可執行檔

下列步驟示範如何建立範例可執行檔,以從 CBL-Mariner VM 存取離散 TPM (dTPM) 索引。

  1. 開啟 Visual Studio 2019 或 2022。 選取 [建立新專案]。 在範本清單中選取 [控制台應用程式 ],然後選取 [ 下一步]:

    顯示 Visual Studio 建立新解決方案的螢幕快照。

  2. 輸入 [ 項目名稱]、 [位置 ] 和 [方案名稱] 字段,然後選取 [ 下一步]。

  3. 選擇目標架構。 建議使用最新的 .NET 6.0 長期支援 (LTS) 版本。 選擇目標架構之後,請選取 [ 建立]。 Visual Studio 會建立新的主控台應用程式解決方案。

  4. 在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後選取 [管理 NuGet 套件]

  5. 選取 [ 瀏覽 ],然後搜尋 Microsoft.TSS。 如需此套件的詳細資訊,請參閱 Microsoft.TSS從清單中選擇 Microsoft.TSS 套件,然後選取 [安裝]。

  6. 編輯Program.cs檔案,並以 tpm-read-nv 範例程式代碼取代內容 - Program.cs

  7. 選取 [建 > 置建置方案 ] 以建置專案。 確認組建成功。

  8. [方案總管] 中,以滑鼠右鍵按兩下專案,然後選取 [發佈]。

  9. 在 [發佈精靈] 中,選擇 [資料夾>資料夾]。 選取 [ 瀏覽 ],然後選擇要產生可執行文件的輸出位置。 選取 [完成]。 建立發行設定檔之後,選取 [關閉]

  10. 在 [ 發佈] 索引標籤上,選取 [ 顯示所有設定]。 變更下列設定,然後選取 [ 儲存]:

    • 目標執行階段:linux-x64
    • 部署模式:獨立式
  11. 選取 [ 發佈],然後等候建立可執行檔。

如果發佈成功,您應該會看到輸出資料夾中建立的新檔案。

複製並執行可執行檔

建立可執行檔和相依性檔案之後,請將資料夾複製到 CBL-Mariner 虛擬機。 下列步驟示範如何複製所有必要的檔案,以及如何在 CBL-Mariner 虛擬機內執行可執行檔。

  1. 開啟提升權限的 PowerShell 工作階段。

  2. 將目錄變更為包含已發行檔案的父資料夾。

    例如,如果您的已發佈檔案位於目錄 C:\Users<User> 的資料夾 TPM 底下,您可以使用下列命令來變更為父資料夾:

    cd "C:\Users\<User>"
    
  3. 修改TPMRead.runtimeconfig.json檔案,以避免Linux VM內的ICU全球化問題

    1. 開啟 TPMRead.runtimeconfig.json

    2. 在區段內 configProperties 新增下列這一行:

      "System.Globalization.Invariant": true
      
  4. 建立 tar 檔案,其中包含在先前步驟中建立的所有檔案。

    例如,如果您在 TPM 資料夾下擁有所有檔案,您可以使用下列命令來建立TPM.tar檔案:

    tar -cvzf TPM.tar ".\TPM"
    
  5. 成功建立TPM.tar檔案之後,請使用 Copy-AksEdgeNodeFile Cmdlet 將 tar 檔案複製到 CBL-Mariner VM。 例如,如果您在 C:\Users<使用者>目錄中TPM.tar tar 檔名,您可以使用下列命令複製到 CBL-Mariner VM:

    Copy-AksEdgeNodeFile -fromFile "C:\Users\<User>\TPM.tar" -toFile "/home/aksedge-user/" -pushFile
    
  6. 執行下列命令,從 tar 檔案擷取所有內容:

    Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "tar -xvzf /home/aksedge-user/TPM.tar"
    
  7. 擷取之後,將可執行文件許可權新增至主要可執行檔。 例如,如果您的專案名稱是 TPMRead,則您的主要可執行檔名稱為 TPMRead。 執行下列命令,讓它成為可執行檔:

    Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "chmod +x /home/aksedge-user/TPM/TPMRead"
    
  8. 最後一個步驟是執行可執行檔。 例如,如果您的項目名稱是 TPMRead,請執行下列命令:

    Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "/home/aksedge-user/TPM/TPMRead"
    

    您應該會看到如下輸出:

    顯示 TPM 輸出的螢幕快照。

下一步