

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

# 中的資料保護 AWS IoT Core
<a name="data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 中的資料保護 AWS IoT Core。如此模型所述， AWS 負責保護執行所有 的 全球基礎設施 AWS 雲端。您負責維護在此基礎設施上託管內容的控制權。您也同時負責所使用 AWS 服務 的安全組態和管理任務。如需資料隱私權的詳細資訊，請參閱[資料隱私權常見問答集](https://aws.amazon.com/compliance/data-privacy-faq/)。如需有關歐洲資料保護的相關資訊，請參閱*AWS 安全性部落格*上的[AWS 共同責任模型和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

基於資料保護目的，建議您保護 AWS 帳戶 登入資料，並使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 設定個別使用者。如此一來，每個使用者都只會獲得授與完成其任務所必須的許可。我們也建議您採用下列方式保護資料：
+ 每個帳戶均要使用多重要素驗證 (MFA)。
+ 使用 SSL/TLS 與 AWS 資源通訊。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 AWS IoT 或使用主控台、API AWS CLI或其他 AWS 服務 AWS SDKs 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

如需關於資料保護的詳細資訊，請參閱 *AWS 安全部落格*上的 [AWS 共同責任模型和歐盟《一般資料保護規範》(GDPR)](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

AWS IoT 裝置會收集資料、對該資料執行一些操作，然後將該資料傳送至另一個 Web 服務。您可以選擇在裝置上短時間存放一些資料。您有責任對靜態資料提供資料保護。當您的裝置傳送資料至 時 AWS IoT，會透過本節稍後討論的 TLS 連線執行此操作。 AWS IoT 裝置可以將資料傳送至任何 AWS 服務。如需每個服務資料安全性的詳細資訊，請參閱該服務的文件。 AWS IoT 可設定為將日誌寫入 CloudWatch Logs 並記錄 AWS IoT API 呼叫 AWS CloudTrail。如需這些服務資料安全性的詳細資訊，請參閱 [Amazon CloudWatch 的身分驗證和存取控制](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/auth-and-access-control-cw.html)，以及[使用 AWS KMS 受管金鑰加密 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/encrypting-cloudtrail-log-files-with-aws-kms.html)。

## 中的資料加密 AWS IoT
<a name="data-protection-encrypt"></a>

根據預設，傳輸中和靜態的所有 AWS IoT 資料都會加密。[傳輸中的資料會使用 TLS 加密](transport-security.md)，而靜態資料會使用 AWS 擁有的金鑰加密。 AWS IoT 支援來自 AWS Key Management Service AWS KMS keys () 的客戶受管 (KMS 金鑰）AWS KMS。不過，Device Advisor 和 AWS IoT Wireless 僅使用 AWS 擁有的金鑰 來加密客戶資料。

 

# 中的傳輸安全性 AWS IoT Core
<a name="transport-security"></a>

TLS (Transport Layer Security) 是一種加密通訊協定，專為透過電腦網路進行安全通訊而設計。 AWS IoT Core Device Gateway 要求客戶在傳輸期間加密所有通訊，方法是使用 TLS 從裝置連線至 Gateway。TLS 可針對 AWS IoT Core支援的應用程式通訊協定 (MQTT、HTTP 和 WebSocket)，達到其機密性。多種程式設計語言與作業系統提供 TLS 支援。內的資料由特定 AWS 服務 AWS 加密。如需其他服務資料加密的詳細資訊 AWS ，請參閱該服務的安全文件。

**Topics**
+ [TLS 通訊協定](#tls-ssl-policy)
+ [安全政策](#tls-policy-table)
+ [中傳輸安全的重要注意事項 AWS IoT Core](#tls-ssl-core)
+ [LoRaWAN 無線裝置的傳輸安全性](#tls-lorawan)

## TLS 通訊協定
<a name="tls-ssl-policy"></a>

AWS IoT Core 支援下列版本的 TLS 通訊協定：
+ TLS 1.3 
+ TLS 1.2

使用 AWS IoT Core，您可以在網域組態中設定 TLS 設定 （適用於 [TLS 1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) 和 [TLS 1.3)。](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3)如需詳細資訊，請參閱[在網域組態中設定 TLS 設定](iot-endpoints-tls-config.md)。

## 安全政策
<a name="tls-policy-table"></a>

安全政策是 TLS 通訊協定及其密碼的組合，用來決定在用戶端與伺服器之間進行 TLS 交涉期間所支援的通訊協定和密碼。您可根據需要將裝置設定為使用預先定義的安全政策。請注意， AWS IoT Core 不支援自訂安全政策。

連線裝置時，您可以選擇其中一個預先定義的安全政策 AWS IoT Core。中最新預先定義安全政策的名稱 AWS IoT Core 包括根據發行月份和年份的版本資訊。預設的預先定義安全政策為 `IoTSecurityPolicy_TLS13_1_2_2022_10`。若要指定安全政策，您可以使用 AWS IoT 主控台或 AWS CLI。如需詳細資訊，請參閱[在網域組態中設定 TLS 設定](iot-endpoints-tls-config.md)。

下表說明 AWS IoT Core 支援的最新預先定義安全政策。已從標頭列的政策名稱移除 `IotSecurityPolicy_`，使其相符。


| **安全政策** | TLS13\$11\$13\$12022\$110 | TLS13\$11\$12\$12022\$110 | TLS12\$11\$12\$12022\$110 | TLS12\$11\$10\$12016\$101\$1 | TLS12\$11\$10\$12015\$101\$1 | 
| --- | --- | --- | --- | --- | --- | 
| TCP 連接埠 |  443/8443/8883  |  443/8443/8883  |  443/8443/8883  | 443 | 8443/8883 | 443 | 8443/8883 | 
| TLS 通訊協定 | 
| TLS 1.2 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| TLS 1.3 | ✓ | ✓ |  |  |  |  |  | 
| TLS 加密 | 
| TLS\$1AES\$1128\$1GCM\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1AES\$1256\$1GCM\$1SHA384 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1CHACHA20\$1POLY1305\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| ECDHE-RSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-SHA256 |  | ✓ | ✓ | ✓ |  | ✓ | ✓ | 
| AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| DHE-RSA-AES256-SHA |  |  |  |  |  | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 

**注意**  
`TLS12_1_0_2016_01` 僅適用於下列項目 AWS 區域：ap-east-1、ap-northeast-2、ap-south-1、ap-southeast-2、ca-central-1、cn-north-1、cn-northwest-1、eu-north-1、eu-west-2、eu-west-3、me-south-1、sa-east-1、us-east-2、us-gov-west-1、us-gov-west-2、us-west-1。  
`TLS12_1_0_2015_01` 僅適用於下列項目 AWS 區域：ap-northeast-1、ap-southeast-1、eu-central-1、eu-west-1、us-east-1、us-west-2。

## 中傳輸安全的重要注意事項 AWS IoT Core
<a name="tls-ssl-core"></a>

對於 AWS IoT Core 使用 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) 連線至 的裝置，TLS 會加密裝置與代理程式之間的連線， AWS IoT Core 並使用 TLS 用戶端身分驗證來識別裝置。如需更多資訊，請參閱[用戶端身分驗證](https://docs.aws.amazon.com//iot/latest/developerguide/client-authentication.html)。對於 AWS IoT Core 使用 [HTTP](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 連線至 的裝置，TLS 會加密裝置與代理程式之間的連線，並將身分驗證委派給 AWS Signature 第 4 版。如需詳細資訊，請參閱《AWS 一般參考》**中的[使用 Signature 第 4 版簽署請求](https://docs.aws.amazon.com//general/latest/gr/create-signed-request.html)。

當您將裝置連線到 時 AWS IoT Core，不需要傳送[伺服器名稱指示 (SNI) 擴充](https://tools.ietf.org/html/rfc3546#section-3.1)功能，但強烈建議您這麼做。若要使用[多帳戶註冊](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert)、[自訂網域](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html)、[VPC 端點](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html)和[已設定的 TLS 政策](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html)等功能，您必須使用 SNI 延伸，並在 `host_name`欄位中提供完整的端點地址。該 `host_name` 欄位必須包含您正在呼叫的端點。該端點必須是下列其中一個：
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:Data-ATS` 返回的 `endpointAddress`
+ `aws iot [describe-domain-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-domain-configuration.html) –-domain-configuration-name "domain_configuration_name"` 返回的 `domainName`

具有不正確或無效`host_name`值的裝置嘗試的連線將會失敗。 AWS IoT Core 會針對[自訂身分驗證](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)的身分驗證類型，將失敗記錄到 CloudWatch。

AWS IoT Core 不支援 [SessionTicket TLS 延伸](https://www.ietf.org/rfc/rfc5077.txt)。

## LoRaWAN 無線裝置的傳輸安全性
<a name="tls-lorawan"></a>

LoRaWAN 裝置遵循 [LoRaWAN ™ SECURITY: A White Paper Prepared for the LoRa Alliance™ by Gemalto, Actility, and Semtech](https://lora-alliance.org/sites/default/files/2019-05/lorawan_security_whitepaper.pdf) 中所述的安全實務。

如需使用 LoRaWAN 裝置傳輸安全性的詳細資訊，請參閱 [LoRaWAN 資料和傳輸安全性](https://docs.aws.amazon.com/iot-wireless/latest/developerguide/iot-lorawan-security.html)。

# 中的資料加密 AWS IoT
<a name="data-encryption"></a>

資料保護是指在傳輸中 （往返 時 AWS IoT Core) 和靜態 （存放於裝置或其他 AWS 服務時） 時保護資料。傳送到 的所有資料 AWS IoT Core 都會使用 MQTT、HTTPS 和 WebSocket 通訊協定透過 TLS 連線傳送，因此在傳輸時預設會使其安全。 會從裝置 AWS IoT Core 收集資料，然後將其傳送至其他 AWS 服務以進行進一步處理。如需有關其他 AWS 服務上資料加密的詳細資訊，請參閱該服務的安全性文件。如需詳細資訊，請參閱[靜態資料加密](encryption-at-rest.md)。

FreeRTOS 提供 PKCS\$111 程式庫，可抽象化金鑰儲存、存取密碼編譯物件和管理工作階段。您有責任使用此程式庫來加密裝置上的靜態資料。如需詳細資訊，請參閱 [FreeRTOS 公有金鑰加密標準 (PKCS) \$111 程式庫](https://docs.aws.amazon.com/freertos/latest/userguide/security-pkcs.html)。

# 中的靜態資料加密 AWS IoT Core
<a name="encryption-at-rest"></a>

根據預設，所有靜態 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 擁有的金鑰
<a name="aws-owned-keys"></a>

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

如需 AWS 擁有金鑰的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的 [AWS 擁有金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key)。

## 客戶自管金鑰
<a name="customer-managed-keys"></a>

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

如需客戶受管金鑰的詳細資訊，請參閱《*AWS Key Management Service 開發人員指南*》中的[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

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

**Topics**
+ [步驟 1：建立客戶受管金鑰](#encryption-at-rest-cmk-create)
+ [步驟 2：建立 IAM 角色以授予使用 KMS 金鑰的 AWS IoT Core 許可](#create-an-iam-role)
+ [步驟 3：選擇加入 中的客戶受管金鑰 AWS IoT Core](#opt-in-customer-managed-keys)
+ [步驟 4： AWS IoT Core 控制平面操作所需的其他許可](#cmk-control-plane-permissions)
+ [步驟 5：管理金鑰](#understanding-key-health)
+ [步驟 6：監控金鑰運作狀態](#health-status-monitoring)

### 步驟 1：建立客戶受管金鑰
<a name="encryption-at-rest-cmk-create"></a>

您可以使用 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 開發人員指南*》中的[建立對稱客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)。

#### 金鑰政策
<a name="key-policy"></a>

建立客戶受管金鑰時，您可以指定金鑰政策。金鑰政策會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策，其中包含決定誰可以使用金鑰及其使用方式的陳述式。如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

AWS IoT Core 會在您的帳戶中使用 IAM 角色來存取您的客戶受管金鑰。如果您使用的是自訂金鑰政策，請確定在此金鑰上建立的 IAM 角色具有下列許可：
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

### 步驟 2：建立 IAM 角色以授予使用 KMS 金鑰的 AWS IoT Core 許可
<a name="create-an-iam-role"></a>

若要 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 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

### 步驟 3：選擇加入 中的客戶受管金鑰 AWS IoT Core
<a name="opt-in-customer-managed-keys"></a>

完成所有先前的步驟後，請執行 `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
   ```

1. 若要 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 控制平面操作所需的其他許可
<a name="cmk-control-plane-permissions"></a>

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

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

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

#### AWS KMS 的 許可 `UpdateEncryptionConfiguration`
<a name="kms-permissions-update-encryption-configuration"></a>

`UpdateEncryptionConfiguration` API 呼叫需要 KMS 金鑰的下列 AWS KMS 許可，才能選擇加入客戶受管金鑰或修改金鑰組態：
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

#### AWS KMS 所有其他控制平面 APIs 許可
<a name="kms-permissions-control-plane-apis"></a>

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

不需要 AWS KMS 許可APIs   
`List*` 和 `Delete*` APIs 不屬於此儲存貯體。客戶隨時可以叫用任何 `List*`或 `Delete*` 控制平面 API，即使發起人沒有`kms:Decrypt`許可，這些 API 呼叫也會成功。即使您的客戶受管金鑰運作狀態不佳，`List*`且 API 不會進行任何解密，這些 `Delete*` API 呼叫仍會成功。 APIs   
+ **List\$1 APIs** – 所有列出操作 （例如，、`ListThings``ListPolicies`、`ListCertificates`)
+ **Delete\$1 APIs** – 所有刪除操作 （例如，、`DeleteThing``DeletePolicy`、`DeleteCertificate`)

### 步驟 5：管理金鑰
<a name="understanding-key-health"></a>

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

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

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

#### 可能影響金鑰運作狀態的客戶動作
<a name="customer-actions-affecting-health"></a>

數個客戶動作可能會導致金鑰運作狀態從 變更為 `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 功能不受影響。

#### 更新加密組態
<a name="key-transition"></a>

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

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

1. 依照中的步驟建立新的客戶受管金鑰[步驟 1：建立客戶受管金鑰](#encryption-at-rest-cmk-create)。

1. 更新您的 IAM 角色政策，以在更新期間同時包含舊金鑰和新金鑰的許可。

1. 更新您的加密組態以使用新的金鑰：

   ```
   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"
   ```

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

```
aws iot update-encryption-configuration --encryption-type "AWS_OWNED_KMS_KEY"
```

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

##### 常見的失敗案例和影響
<a name="failure-scenarios"></a>

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


| 案例 | 立即影響 | 長期後果 | 
| --- | --- | --- | 
|  金鑰已停用  |  所有新的加密/解密操作都會立即失敗  |  服務中斷，直到金鑰重新啟用或取代為止  | 
|  排程刪除的金鑰  |  金鑰狀態變更為待刪除，且所有加密/解密操作都將失敗  |  刪除完成時自動服務失敗  | 
|  金鑰已永久刪除  |  所有操作的立即和永久故障  |  永久資料遺失和無法復原加密的資料  | 
|  金鑰政策修改不正確  |  AWS IoT Core 失去對金鑰的存取許可  |  服務失敗，直到政策修正為止  | 
|  已刪除 IAM 角色  |  AWS IoT Core 無法擔任存取金鑰的角色  |  完成加密服務失敗  | 
|  IAM 角色修改不正確  |  AWS IoT Core 無法擔任角色或使用角色來存取金鑰  |   修正 IAM 角色之前的服務失敗  | 

##### 預防和最佳實務
<a name="prevention-best-practices"></a>

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

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

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

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

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

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

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

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

### 步驟 6：監控金鑰運作狀態
<a name="health-status-monitoring"></a>

作為定期檢查 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`層級發出。如需日誌層級的詳細資訊，請參閱[日誌層級](https://docs.aws.amazon.com/iot/latest/developerguide/configure-logging.html#log-level)。

下列範例是 發出的 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"
   ```

1. **Enable AWS IoT V2 記錄**功能可擷取詳細的運作狀態變更事件，其中包含錯誤碼和訊息。

1. **檢查組態狀態**以進行故障診斷：

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

1. 檢查 `errorCode` 欄位以**調查 UNHEALTHY 狀態**：
   + `KMS_KEY_VALIDATION_ERROR` – AWS KMS 金鑰的問題 （停用、刪除或政策問題）
   + `ROLE_VALIDATION_ERROR` – IAM 角色的問題 （已刪除、政策問題或信任問題）

#### 從不良到健康
<a name="unhealthy-to-healthy"></a>

當加密金鑰的狀態從 更新為 `UNHEALTHY` 時`HEALTHY`， 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
<a name="healthy-to-unhealthy"></a>

當加密金鑰的狀態從 更新為 `HEALTHY` 時`UNHEALTHY`， AWS IoT Core 會以下列格式發出 an 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 支援中心](https://console.aws.amazon.com/support/home#/)以取得其他協助。

#### AWS CloudTrail 事件
<a name="aws-cloudtrail-events"></a>

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

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

##### `Decrypt` 範例
<a name="decrypt"></a>

```
{
    "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"
}
```