中的靜態資料加密 AWS IoT Core - AWS IoT Core

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

中的靜態資料加密 AWS IoT Core

根據預設,所有靜態 AWS IoT Core 資料都會使用 AWS 擁有的金鑰進行加密。 AWS IoT Core 也支援來自 AWS Key Management Service (AWS KMS) 的對稱客戶受管金鑰。使用客戶受管金鑰,您可以建立、擁有和管理 AWS 帳戶中的 AWS KMS 金鑰。 AWS IoT Core 將使用 KMS 金鑰來加密靜態資料。您可以完全控制這些 KMS 金鑰,包括建立和維護其金鑰政策。您也可以為存取 的角色設定 IAM 政策, AWS KMS 以控制這些金鑰的許可。

AWS 擁有的金鑰

AWS 擁有的金鑰是 AWS 服務擁有和管理的 KMS 金鑰集合,可用於多個 AWS 帳戶。 AWS 服務可以使用 AWS 擁有的金鑰來保護您的資料。根據預設, 會使用 AWS 擁有的金鑰 AWS IoT Core 加密靜態資料。這些金鑰是由 服務管理。您無法檢視、管理或使用 AWS 擁有的金鑰。不過,您不需要採取任何動作來保護這些金鑰。

如需 AWS 擁有金鑰的詳細資訊,請參閱《 AWS Key Management Service 開發人員指南》中的 AWS 擁有金鑰

客戶受管金鑰

客戶受管金鑰是您建立、擁有和管理之 AWS 帳戶中的 KMS 金鑰。您可以完全控制這些 AWS KMS 金鑰,包括建立和維護其金鑰政策。您也可以為存取 的角色設定 IAM 政策, AWS KMS 以控制這些金鑰的許可。您可以設定 AWS IoT Core 使用客戶受管 KMS 金鑰來加密您的資料。

如需客戶受管金鑰的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的客戶受管金鑰

若要選擇加入客戶受管金鑰 AWS IoT Core,請遵循下列步驟:

步驟 1:建立客戶受管金鑰

您可以使用 AWS KMS 主控台或 CLI AWS KMS 命令來建立對稱客戶受管金鑰。keySpec 必須是 SYMMETRIC_DEFAULT,而 keyUsage必須是 ENCRYPT_DECRYPT

注意

AWS IoT Core 僅支援具有客戶受管 AWS KMS 金鑰SYMMETRIC_DEFAULT之金鑰規格和ENCRYPT_DECRYPT金鑰用量的金鑰。

以下是建立 KMS 金鑰的範例 AWS CLI 命令,可用於 AWS IoT Core 客戶受管金鑰。

aws kms create-key --key-spec SYMMETRIC_DEFAULT --key-usage ENCRYPT_DECRYPT --region us-west-2

以下是 命令的範例輸出。

{ "KeyMetadata": { "AWSAccountId": "111122223333", "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": "2024-09-19T11:45:23.982000-07:00", "Enabled": true, "Description": "", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false } }

如需詳細資訊,請參閱《 AWS Key Management Service 開發人員指南》中的建立對稱客戶受管金鑰

金鑰政策

建立客戶受管金鑰時,您可以指定金鑰政策。金鑰政策會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策,其中包含決定誰可以使用金鑰及其使用方式的陳述式。如需詳細資訊,請參閱《 AWS Key Management Service 開發人員指南》中的金鑰政策

AWS IoT Core 會在您的帳戶中使用 IAM 角色來存取您的客戶受管金鑰。如果您使用的是自訂金鑰政策,請確定在此金鑰上建立的 IAM 角色具有下列許可:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

步驟 2:建立 IAM 角色以授予使用 KMS 金鑰的 AWS IoT Core 許可

若要 AWS IoT Core 讓 使用您建立的 KMS 金鑰來加密靜態資料,您也需要在帳戶中建立 IAM 角色,其 AWS IoT Core 可擔任 以存取 KMS 金鑰。

該角色必須具有下列信任政策,以允許 AWS IoT Core 擔任該角色。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "ArnLike": { "aws:SourceArn": "arn:aws:iot:us-west-2:111122223333:*" } } } }

確保連接至 IAM 角色的 IAM 政策具有 KMS 金鑰的下列許可:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

以下是具有客戶受管金鑰所需許可的 IAM 政策範例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIoTToAccessKMSResource", "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:Decrypt", "kms:Encrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": [ "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" ], "Condition": { "StringEquals": { "kms:EncryptionContext:aws-crypto-ec:vendor": "iot.amazonaws.com" } } } ] }

如需詳細資訊,請參閱《 AWS Identity and Access Management 使用者指南》中的建立角色以將許可委派給 IAM 使用者

步驟 3:選擇加入 中的客戶受管金鑰 AWS IoT Core

完成所有先前的步驟後,請執行 update-encryption-configuration CLI 命令以選擇在 中使用客戶受管金鑰 AWS IoT Core。當您選擇使用客戶受管金鑰時, AWS 帳戶中的所有 AWS IoT Core 資源都會使用指定的 AWS KMS 金鑰加密。

  1. 若要使用 在 中選擇加入客戶受管金鑰 AWS IoT Core AWS CLI,請執行 CLI update-encryption-configuration 命令。

    aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \ --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \ --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" --region us-west-2
  2. 若要 AWS IoT Core 使用 驗證 中的客戶受管金鑰 AWS CLI,請執行 CLI describe-encryption-configuration 命令:

    aws iot describe-encryption-configuration --region us-west-2

    如果您已在 中啟用客戶受管金鑰 AWS IoT Core,輸出可能如下所示:

    { "encryptionType": "CUSTOMER_MANAGED_KMS_KEY", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "configurationDetails": { "configurationStatus": "HEALTHY" }, "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00" }

    lastModifiedDate 欄位指出上次更新加密組態的日期。

    如果您尚未啟用客戶受管金鑰,輸出可能如下所示:

    { "encryptionType": "AWS_OWNED_KMS_KEY", "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00" }

步驟 4: AWS IoT Core 控制平面操作所需的其他許可

在您選擇加入客戶受管金鑰之後,屬於您 AWS 帳戶的所有 AWS IoT Core 資源都會使用提供的 KMS 金鑰加密。除了 AWS IoT Core 資源上特定操作所需的kms:Decrypt許可之外,所有控制平面操作現在還要求發起人擁有 KMS 金鑰的許可。如果發起人沒有kms:Decrypt許可,而且他們進行需要加密或解密資料的 API 呼叫 (例如 GetPolicy),他們將收到 UnauthorizedException

例如,當您呼叫 時GetPolicy,您需要客戶受管 KMS 金鑰的 iot:GetPolicykms:Decrypt許可,才能成功呼叫 API。

注意

更新 IAM 使用者或角色以授予加密組態所用金鑰的 AWS KMS 許可時,請確定 KMS 金鑰政策也授予個別 IAM 使用者或角色所需的許可。

AWS KMS 的 許可 UpdateEncryptionConfiguration

UpdateEncryptionConfiguration API 呼叫需要 KMS 金鑰的下列 AWS KMS 許可,才能選擇加入客戶受管金鑰或修改金鑰組態:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

AWS KMS 所有其他控制平面 APIs 許可

啟用客戶受管金鑰時,大多數控制平面 APIs 都需要kms:Decrypt許可。不過,某些 APIs不需要這些額外的許可:

不需要 AWS KMS 許可APIs

List*Delete* APIs 不屬於此儲存貯體。客戶隨時可以叫用任何 List*Delete*控制平面 API,即使發起人沒有kms:Decrypt許可,這些 API 呼叫也會成功。即使您的客戶受管金鑰運作狀態不佳,List*且 API 不會進行任何解密,這些 Delete* API 呼叫仍會成功。 APIs

  • List* APIs – 所有清單操作 (例如,、ListThingsListPoliciesListCertificates)

  • Delete* APIs – 所有刪除操作 (例如,、DeleteThingDeletePolicyDeleteCertificate)

步驟 5:管理金鑰

AWS IoT Core 會定期檢查客戶受管金鑰組態,以確保加密和解密操作不會受到影響。這些運作狀態檢查每分鐘執行一次 AWS IoT Core,並確認 能夠存取和使用 AWS KMS 金鑰和相關聯的 IAM 角色來加密和解密操作。

HEALTHY (狀況良好)

AWS IoT Core 可以透過指定的 IAM 角色成功存取 AWS KMS 金鑰,並執行加密/解密操作。所有元件都能正常運作。

UNHEALTHY (狀況不良)

AWS IoT Core 無法存取或使用 AWS KMS 金鑰。這可防止新的加密操作,並可能影響服務功能。errorCode 欄位指出問題是與金鑰還是 IAM 角色有關。

可能影響金鑰運作狀態的客戶動作

數個客戶動作可能會導致金鑰運作狀態從 變更為 HEALTHY UNHEALTHY

與金鑰相關的動作
  • 刪除 AWS KMS 金鑰 – 當您排程刪除金鑰時,金鑰處於 Pending deletion 狀態且無法使用

  • 停用 AWS KMS 金鑰 – 當您停用 KMS 金鑰時,它無法再用於加密/解密操作

  • 排程刪除金鑰 – 刪除完成時,金鑰變得無法使用

  • 修改金鑰政策 – 移除 AWS IoT Core 存取的必要許可

  • 變更金鑰使用許可 – 限制必要的 AWS KMS 動作

IAM 角色相關動作
  • 刪除 IAM 角色 – AWS IoT Core 無法擔任該角色以存取金鑰

  • 修改角色許可 – 從角色政策移除必要的 AWS KMS 許可

  • 變更信任政策 – 防止 AWS IoT Core 服務擔任該角色

  • 新增限制條件 – AWS IoT Core 防止 使用該角色的條件

帳戶層級動作
  • 跨帳戶金鑰存取變更 – 修改不同帳戶中金鑰的許可

  • 服務控制政策 SCPs) – 限制 AWS KMS 存取的組織層級政策

  • 帳戶層級 IAM 政策 – 覆寫金鑰存取或與金鑰存取衝突的政策

重要

對 使用的 AWS KMS 金鑰、IAM 角色或政策的任何變更都 AWS IoT Core 應先在開發環境中進行測試。在進行任何變更後密切監控金鑰運作狀態,以確保 AWS IoT Core 功能不受影響。

更新加密組態

在 中更新您的加密組態 AWS IoT Core ,以從一個客戶受管金鑰變更為另一個金鑰,或在 AWS 擁有的金鑰和客戶受管金鑰之間進行變更。

若要將組態變更為不同的客戶受管金鑰:

  1. 依照中的步驟建立新的客戶受管金鑰步驟 1:建立客戶受管金鑰

  2. 更新您的 IAM 角色政策,以在更新期間包含舊金鑰和新金鑰的許可。

  3. 更新您的加密組態以使用新的金鑰:

    aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \ --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \ --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/new-key-id"
重要

在加密組態更新期間,請維持對先前 IAM 角色和 KMS 金鑰的存取長達一小時。這可讓 AWS IoT Core 完成重新加密程序,同時維護不間斷的資料存取。監控 CMK.Health 指標以確認成功轉換。

若要將組態從客戶受管金鑰變更回 AWS 擁有的金鑰:

aws iot update-encryption-configuration --encryption-type "AWS_OWNED_KMS_KEY"
注意

更新新客戶受管金鑰的加密組態時,請確保舊金鑰和新金鑰都保持可存取,以便操作成功。

常見的失敗案例和影響

下表說明刪除或停用金鑰時的常見失敗案例:

案例 立即影響 長期後果

金鑰已停用

所有新的加密/解密操作都會立即失敗

服務中斷,直到金鑰重新啟用或取代為止

排程刪除的金鑰

金鑰狀態變更為待刪除,且所有加密/解密操作都將失敗

刪除完成時自動服務失敗

金鑰已永久刪除

所有操作的立即和永久故障

永久資料遺失和無法復原加密的資料

金鑰政策修改不正確

AWS IoT Core 失去對金鑰的存取許可

服務失敗,直到政策修正為止

已刪除 IAM 角色

AWS IoT Core 無法擔任存取金鑰的角色

完成加密服務失敗

IAM 角色修改不正確

AWS IoT Core 無法擔任角色或使用角色來存取金鑰

修正 IAM 角色之前的服務失敗

預防和最佳實務

若要防止意外刪除或停用金鑰,並將服務失敗的風險降至最低:

實作金鑰生命週期政策

建立明確的金鑰建立、輪換和淘汰程序。記錄哪些金鑰用於 AWS IoT Core 資源和維護作用中金鑰的清查。

使用 IAM 政策來限制金鑰刪除

建立 IAM 政策,以防止未經授權的使用者刪除或停用關鍵加密金鑰。使用條件要求金鑰刪除操作的額外核准。

啟用 CloudTrail 記錄

透過 CloudTrail 監控所有 AWS KMS 金鑰操作,以偵測未經授權或意外的金鑰管理活動。設定金鑰刪除、停用或政策變更的提醒。

測試金鑰取代程序

在非生產環境中定期測試您的金鑰取代程序,以確保您可以快速從與金鑰相關的故障中復原。

維護金鑰備份

雖然您無法匯出 AWS KMS 金鑰材料,但請保留金鑰 ARNs、政策和相關 AWS IoT Core 組態的詳細記錄,以便在需要時快速取代金鑰。

監控金鑰運作狀態

持續監控 CMK.Health 指標,並設定金鑰運作狀態變更的自動提醒。實作自動化回應,以快速解決與金鑰相關的問題。

重要

在生產環境中實作金鑰更新程序之前,請務必在開發環境中測試這些更新程序。制定有文件記錄的轉返計劃,並確保在緊急情況下可以快速執行金鑰取代程序。

步驟 6:監控金鑰運作狀態

在定期檢查 AWS IoT Core 執行過程中,會發出 CloudWatch 指標和日誌,以提供客戶受管金鑰組態運作狀態的可見性

AWS IoT Core 每分鐘至少向 CloudWatch 發出一次CMK.Health指標。此指標提供 AWS IoT Core 用來加密和解密資料之客戶受管金鑰的運作狀態相關資訊。

CMK.Health 指標可以有下列值:

  • 值為 1: AWS IoT Core 能夠成功地使用加密金鑰來加密和解密您的資料。

  • 值為 0: AWS IoT Core 無法使用加密金鑰來加密和解密您的資料。

AWS IoT Core 當加密金鑰的運作狀態變更時, 也會發出 AWS IoT V2 日誌。這些日誌提供運作狀態更新的其他詳細資訊。若要檢視這些日誌,您必須啟用 AWS IoT V2 日誌。HEALTHY 日誌會在 INFO 層級發出,而UNHEALTHY日誌會在 ERROR層級發出。如需日誌層級的詳細資訊,請參閱日誌層級

下列範例是 發出的 CloudWatch 日誌項目 AWS IoT Core ,用於指示客戶受管金鑰的運作狀態更新。

若要有效監控和回應關鍵運作狀態變更:

  1. 設定 指標的 CloudWatch 警示CMK.Health

    aws cloudwatch put-metric-alarm --region us-west-2 \ --alarm-name "IoTCore-CMK-Health-Alert" \ --alarm-description "Alert when IoT Core CMK health is unhealthy" \ --metric-name "CMK.Health" \ --namespace "AWS/IoT" \ --statistic "Minimum" \ --period 300 \ --evaluation-periods 1 \ --threshold 1 \ --comparison-operator "LessThanThreshold" \ --alarm-actions "arn:aws:sns:us-west-2:111122223333:iot-alerts"
  2. Enable AWS IoT V2 記錄功能可擷取詳細的運作狀態變更事件,其中包含錯誤碼和訊息。

  3. 檢查組態狀態以進行故障診斷:

    aws iot describe-encryption-configuration --region us-west-2
  4. 檢查 errorCode 欄位以調查 UNHEALTHY 狀態

    • KMS_KEY_VALIDATION_ERROR – AWS KMS 金鑰的問題 (停用、刪除或政策問題)

    • ROLE_VALIDATION_ERROR – IAM 角色的問題 (已刪除、政策問題或信任問題)

從不良到健康

當加密金鑰的狀態從 更新為 UNHEALTHYHEALTHY, AWS IoT Core 會發出下列格式的 AWS IoT V2 日誌訊息。

{ "timestamp": "2017-08-10 15:37:23.476", "logLevel": "INFO", "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d", "accountId": "111122223333", "status": "SUCCESS", "cmkStatus": "HEALTHY", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "eventType": "CmkHealthCheck" }

從 HEALTHY 到 UNHEALTHY

當加密金鑰的狀態從 更新為 HEALTHYUNHEALTHY, AWS IoT Core 會發出下列格式的 AWS IoT V2 日誌訊息。

{ "timestamp": "2017-08-10 15:37:23.476", "logLevel": "ERROR", "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d", "accountId": "111122223333", "status": "FAILURE", "cmkStatus": "UNHEALTHY", "errorCode": "KMS_KEY_VALIDATION_ERROR / ROLE_VALIDATION_ERROR", "errorMessage": "Error message on why there was a failure", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "eventType": "CmkHealthCheck" }
警告

當金鑰運作狀態變成 時UNHEALTHY, AWS IoT Core 操作會立即失敗。如果發生這種情況,請檢閱您的金鑰組態、IAM 角色許可和政策。監控 CMK.Health 指標是否有狀態變更。如果檢閱您的組態後操作仍持續失敗,請聯絡您的客戶經理或AWS 支援中心以取得其他協助。

AWS CloudTrail 事件

您也可以監控 KMS 金鑰的 AWS IoT Core使用情況,以加密解密操作。 AWS IoT Core 會在您的 KMS 金鑰上建立 DescribeKeyReEncrypt、 和 DecryptGenerateDataKeyWithoutPlaintext操作,以加密/解密屬於您靜態存放 AWS 帳戶的資料。

DescribeKey、、 DecryptReEncrypt和 有 CloudTrail 事件GenerateDataKeyWithoutPlaintext。這些事件會監控 呼叫 AWS KMS 的操作 AWS IoT Core ,以存取客戶受管金鑰加密的資料。

Decrypt 範例
{ "eventVersion": "1.09", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "*********************", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "*****" }, "attributes": { "creationDate": "2024-09-16T20:23:39Z", "mfaAuthenticated": "false" } }, "invokedBy": "iot.amazonaws.com" }, "eventTime": "2024-09-16T20:32:48Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "iot.amazonaws.com", "userAgent": "iot.amazonaws.com", "requestParameters": { "encryptionContext": { "kms-arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "aws-crypto-ec:vendor": "iot.amazonaws.com", "branch-key-id": "111122223333", "type": "branch:ACTIVE" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "requestID": "1afb6d98-8388-455d-8b48-e62c9e0cf7f4", "eventID": "b59a5f16-0d98-46d8-a590-0e040a48b39b", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }