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

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

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

注意

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

本教學課程說明如何使用 PKCS#11 介面,透過信任平台模組 (TPM) 設定 AWS IoT Greengrass 核心軟體來增強裝置安全性。此 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

    • jg

  • 裝置上的根或 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 碼。此 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 和 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