教學課程:使用信任平台模組 (TPM) 保護 Greengrass Nucleus - AWS IoT Greengrass

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:使用信任平台模組 (TPM) 保護 Greengrass Nucleus

注意

這些教學課程包含有關如何使用 TPM2 晶片作為硬體安全模組 (HSM) 來建立私有金鑰和 CSR 的說明。用於 建立物件憑證

這些教學課程說明如何使用 PKCS#11 介面,透過信任平台模組 (TPM) 設定 AWS IoT Greengrass Core 軟體 (Greengrass Nucleus) 來增強裝置安全性。此 TPM 整合可確保用於裝置身分和連線至 的私有金鑰和憑證 AWS IoT Core 安全地存放在防竄改硬體中,防止擷取模擬或其他惡意活動。

當您完成此整合時,您的 Greengrass 核心裝置將使用 TPM 保護的私有金鑰來進行身分和 AWS IoT 與服務的通訊。

如需 Greengrass 裝置安全性的詳細資訊,請參閱 中的安全性 AWS IoT Greengrass

先決條件

為了完成本教學,您需要以下項目:

  • 具有 TPM 2.0 硬體或韌體 TPM 2.0 的 Linux 相容裝置。

  • 本教學中的指示是針對 Ubuntu 24.04 LTS 定義。

  • 安裝 AWS CLI 並設定 的開發人員機器具有以下許可:

    • 建立和管理 AWS IoT 資源

    • 建立和管理 IAM 角色和政策

  • 安裝在您裝置上的 Java 執行期環境 (JRE) 第 8 版或更新版本。

  • 您的裝置上安裝了下列軟體套件:

    • curl

    • jq

  • 裝置上的根或 sudo 權限。

步驟 1:安裝 TPM2 工具和相依性

在此步驟中,您會安裝必要的 TPM2 軟體工具和程式庫。

  1. 執行下列命令,以更新您的套件管理員並安裝 TPM2 工具和相依性。

    sudo apt-get update && sudo apt-get install tpm2-tools \ tpm2-abrmd \ tpm2-tss-engine-tools \ gnutls-bin \ libtpm2-pkcs11-1 \ libtpm2-pkcs11-tools \ libtpm2-pkcs11-1-dev \ python3-tpm2-pkcs11-tools \ libengine-pkcs11-openssl \ libtss2-tcti-tabrmd0
  2. 在使用 OpenSSL 引擎 3 的 Ubuntu 24.04 上安裝 OpenSSL TPM2 提供者套件。

    sudo apt-get install tpm2-openssl

步驟 2:初始化 PKCS#11 存放區並建立槽

  1. 建立目錄以存放資料。

    sudo mkdir -p /etc/tpm2_pkcs11
  2. 將儲存位置設定為環境變數。如需存放階層的詳細資訊,請參閱初始化

    export TPM2_PKCS11_STORE=/etc/tpm2_store
  3. 使用主要物件初始化 TPM2 字符。

    sudo tpm2_ptool init

    可用的選項如下:

    hierarchy-auth HIERARCHY_AUTH

    將主要物件新增至階層的授權密碼。

    primary-auth PRIMARY_AUTH

    現有主索引鍵物件的授權值。

    預設是空的身分驗證值。

    primary-handle [PRIMARY_HANDLE]

    使用現有的主索引鍵物件。

    預設:0x81000001

    transient-parents

    使用指定範本的暫時性主要物件。

    值:tpm2-tools-defaulttpm2-tools-ecc-defaulttss2-engine-key

    path PATH

    存放區目錄的位置。如果指定,目錄必須存在。如果未指定,它會查看環境變數 來執行搜尋TPM2_PKCS11_STORE。如果未設定該環境變數,則會查看 /etc/tpm2_pkcs11。如果找不到或無法建立該目錄,則會預設為目前的工作目錄。

步驟 3:建立權杖和金鑰

  1. 建立 PKCS#11 權杖。

    sudo tpm2_ptool addtoken —pid=1 —userpin=USERPIN —sopin=SOPIN —label=greengrass

    可用的選項如下:

    --pid PID

    要與此字符建立關聯的主要物件 ID。

    --sopin SOPIN

    管理員 PIN 碼。此接腳用於物件復原。

    --userpin USERPIN

    使用者 PIN 碼。此 PIN 用於物件使用的身分驗證。

    --label LABEL

    用於識別使用中設定檔的唯一標籤必須是唯一的。

    --hierarchy-auth HIERARCHY_AUTH

  2. 建立 ECC 金鑰物件。

    sudo tpm2_ptool addkey —algorithm=ecc256 —label=greengrass —userpin=****** —key-label=greenkey
    --label LABEL

    要匯入金鑰的字符標籤。

    --key-label KEY_LABEL

    匯入的金鑰標籤。預設為整數值。

    --id ID

    金鑰 ID。預設為隨機 8 個位元組的十六進位。

    --attr-always-authenticate

    將 CKA_ALWAYS_AUTHENTICATE 屬性設定為 CK_TRUE。

    --hierarchy-auth HIERARCHY_AUTH

    暫時物件所需的階層驗證。

    --sopin SOPIN

    管理員 PIN 碼。

    --userpin USERPIN

    使用者 PIN 碼。

    --algorithm

    {rsa1024,rsa2048,rsa3072,rsa4096,aes128,aes256,ecc224,ecc256,ecc384,ecc521,hmac:sha1,hmac:sha256,hmac:sha384,hmac:sha512}

    金鑰的類型。

  3. 從權杖匯出 TPM2-TSS 物件以擷取身分驗證資料。

    yaml_ecc0=$(sudo tpm2_ptool export —label="greengrass" —key-label="greenkey" —userpin="******")

    輸出範例:

    > echo $yaml_ecc0 object-auth: 706c1cad8a5238871b30149705255926 primary-object: auth: '' hierarchy: owner is_transient: false
    注意

    您也可以在執行此命令的目錄中找到名為 `greenkey.pem` 的檔案,這是 TSS2 私有金鑰。使用此選項來產生具有 tpm2 openssl 提供者的 CSR。TSS2 PRIVATE KEY 檔案受 TPM 保護,無法在其他機器上使用。如需使用 OpenSSL 的 TSS2 金鑰詳細資訊,請參閱儲存私有或公有金鑰

  4. 擷取 TSS 私有金鑰的身分驗證資料。

    auth_ecc0=$(echo "$yaml_ecc0" | grep "object-auth" | cut -d' ' -f2-)

步驟 4:產生憑證簽署請求 (CSR)

在此步驟中,您將使用 TPM2-protected私有金鑰來產生 CSR。

  1. 使用 TPM2 提供者產生 CSR。

    sudo openssl req -new -provider tpm2 -provider base -key greenkey.pem -passin "pass:$auth_ecc0" -out "$H"$HOSTNAME".csr

    出現提示時,請提供 CSR 的必要資訊,包括:

    • 國家名稱 (2 個字母代碼)

    • State or Province Name (州或省名稱)

    • Locality Name (地區名稱)

    • Organization Name (組織名稱)

    • Organizational Unit Name (組織單位名稱)

    • Common Name (通用名稱)

    • 電子郵件地址

    或者,您可以為全自動產生提供 OpenSSL 組態檔案。如需詳細資訊,請參閱 OpenSSL 文件

  2. 如果您未在相同機器上產生 CSR,請將產生的 CSR 複製到已設定 AWS 登入資料的機器。

步驟 5:建立物件憑證

建立 AWS IoT 物件憑證。如需如何建立物件憑證的詳細資訊,請參閱建立物件憑證

步驟 6:將物件憑證匯入 TPM

  1. 將物件憑證複製到裝置。

  2. 將物件憑證新增至 Greengrass 權杖。

    sudo tpm2_ptool addcert --label=greengrass --key-label=greenkey device.pem.crt

    可用的選項如下:

    --help

    顯示此說明訊息並結束。

    --label LABEL

    要移除的設定檔標籤。

    --key-label KEY_LABEL

    相關聯的私有金鑰標籤。

    --key-id KEY_ID

    十六進位中的關聯私有金鑰 ID。

    cert

    要新增的 x509 PEM 憑證。

步驟 7:擷取 PKCS#11 物件 URL

我們將使用 gnutls-bin套件p11tool提供的 來取得 PKCS#11 字符 URL 和物件 URLs。

  1. 擷取 Greengrass 字符的字符 URL。

    TOKEN=sudo p11tool --list-token-urls | grep "token=greengrass"
  2. 取得 Greengrass 權杖的物件 URLs。使用您在步驟 3 中使用的相同接腳。

    sudo p11tool --login --list-all "${TOKEN}"

    輸出範例:

    Token 'greengrass' with URL 'pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass' requires user PIN Enter PIN: WARNING: Needed CKA_VALUE but didn't find encrypted blob Object 0: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=private Type: Private key (EC/ECDSA-SECP256R1) Label: greenkey Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31 Object 1: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=public Type: Public key (EC/ECDSA-SECP256R1) Label: greenkey ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31 Object 2: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Fri Dec 31 18:59:59 2049 Label: greenkey ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31
  3. 擷取私有金鑰和憑證的物件 URL。

步驟 8:使用 TPM2 支援設定和安裝 Greengrass

  1. 設定物件憑證。如需詳細資訊,請參閱設定物件憑證

  2. 完成在 的 HSM 中使用私有金鑰和憑證安裝 AWS IoT Greengrass 核心軟體的指示安裝 AWS IoT Greengrass 核心軟體。然後,使用下列步驟來設定您的安裝,以透過 PKCS#11 介面利用 TPM2。

  3. 確認您已將 PKCS#11 提供者元件下載並儲存在 Greengrass 安裝程式位置。

  4. 使用文字編輯器來建立名為 的組態檔案config.yaml,以提供給安裝程式。例如,在以 Linux 為基礎的系統上,您可以執行下列命令來使用 GNU nano 建立 檔案。

    nano GreengrassInstaller/config.yaml
  5. 將下列 YAML 內容複製到 檔案。此部分組態檔案會指定系統參數、Greengrass 核參數和 PKCS#11 提供者參數。

    --- system: certificateFilePath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=cert" privateKeyPath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=private" rootCaPath: "/greengrass/v2/AmazonRootCA1.pem" rootpath: "/greengrass/v2" thingName: "myThing" services: aws.greengrass.Nucleus: componentType: "NUCLEUS" version: "2.14.0" configuration: awsRegion: "us-east-1" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" iotDataEndpoint: "device-data-prefix-ats.iot.us-west-2.amazonaws.com" iotCredEndpoint: "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com" aws.greengrass.crypto.Pkcs11Provider: configuration: name: "tpm2_pkcs11" library: "/usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so" slot: 1 userPin: "123456"
  6. 使用適用於您安裝的參數編輯 檔案。

    1. 使用步驟 7 中擷取的 PKCS#11 URL 更新 certificateFilePath 和 privateKeyPath,並使用更新 certificateFilePath 和 privateKeyPath。

    2. 根據您的 AWS IoT 端點更新 iotDataEndpoint 和 iotCredEndpoint。

    3. aws.greengrass.crypto.Pkcs11Provider組態中,根據您的平台更新程式庫。

      注意

      顯示的範例適用於 X86_64。ARM64 裝置的檔案路徑將相似。

  7. 完成 中的 Greengrass 安裝步驟安裝 AWS IoT Greengrass 核心軟體

步驟 9:驗證安裝

在此步驟中,您將驗證 Greengrass 透過 TPM2 整合正常執行。

  1. 檢查 Greengrass 服務狀態。

    sudo systemctl status greengrass.service
  2. 檢視 Greengrass 日誌以確保沒有錯誤。

    sudo tail -f /greengrass/v2/logs/greengrass.log
  3. 確認您的裝置在AWS IoT 主控台中顯示為已連線。

    1. 登入 AWS IoT Greengrass 主控台

    2. 管理下,展開 Greengrass 裝置,然後選擇核心裝置

    3. 確認您的裝置已連線。裝置狀態會顯示HEALTHY是否已連線。如需詳細資訊,請參閱檢查 Greengrass 核心裝置狀態

疑難排解

如果您在設定或操作TPM2-enabled 的 Greengrass 裝置期間遇到問題,請嘗試下列疑難排解步驟。

  • 檢查主要 Greengrass 日誌檔案。

    sudo tail -f /greengrass/v2/logs/greengrass.log
  • 驗證 PKCS#11 提供者組態。

    sudo cat /greengrass/v2/config/effectiveConfig.yaml
  • 確保 TPM2 服務正在執行。

    sudo systemctl status tpm2-abrmd.service
  • 確認 TPM2 金鑰可供存取。

    sudo pkcs11-tool —module /usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so -l -p 123456 —list-objects
  • 如果您的作業系統設定為使用 TPM2 儲存根金鑰的完整磁碟加密,例如 Clevis 或 systemd-cryptenroll,請確認您使用的持久性控制代碼與這些工具所使用的相同。使用相同的持久性控制代碼可能會影響您的磁碟加密機制。若要檢查所有已建立和使用的持久性控點,請執行下列命令

    sudo tpm2_getcap handles-persistent

後續步驟

現在您已成功將 Greengrass 核心裝置與 TPM2 整合,您可以:

如需 Greengrass 裝置安全性的詳細資訊,請參閱中的安全性 AWS IoT Greengrass