

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 中的数据保护 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 Security Blog* 上的 [AWS Shared Responsibility Model and 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）第 140-3 版》[https://aws.amazon.com/compliance/fips/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括您使用控制台、API AWS IoT 或以其他 AWS 服务 方式使用控制台 AWS CLI、API 或时 AWS SDKs。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 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 日志并记录 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 KMS keys () 中的客户托管（KMS AWS 密钥AWS KMS）。但是，Device Advisor 和 AWS IoT Wireless 仅使用 AWS 拥有的密钥 来加密客户数据。

 

# 运输安全 AWS IoT Core
<a name="transport-security"></a>

TLS（传输层安全性协议）是一种加密协议，旨在通过计算机网络进行安全通信。 AWS IoT Core 设备网关要求客户在设备与网关的连接中使用 TLS 对传输中的所有通信进行加密。TLS 用于实现所支持的应用程序协议（MQTT、HTTP 和 WebSocket）的 AWS IoT Core机密性。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\$1 SHA256 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1AES\$1256\$1GCM\$1 SHA384 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1 \$1 \$1 CHACHA20 POLY1305 SHA256 | ✓ | ✓ |  |  |  |  |  | 
| ECDHE-RSA--GCM-AES128 SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA--AES128 SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA--SHA AES128 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA--GCM-AES256 SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA--AES256 SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA--SHA AES256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-SHA256 |  | ✓ | ✓ | ✓ |  | ✓ | ✓ | 
| AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| DHE-RSA--SHA AES256 |  |  |  |  |  | ✓ | ✓ | 
| ECDHE-ECDSA--GCM-AES128 SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA--AES128 SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA--SHA AES128 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA--GCM-AES256 SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA--AES256 SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA--SHA AES256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 

**注意**  
`TLS12_1_0_2016_01`仅在以下版本中可用 AWS 区域：ap-east-1、ap-northeast-2、ap-southeast-1、ap-southeast-2、ca-central-1、cn-northeast-1、cn-northeast-1、eu-west-2、eu-west-2，eu-west-3、me-south-1、sa-east-1、us-east-2、-1、-2、us-west-1、us-west-1。 us-gov-west us-gov-west  
`TLS12_1_0_2015_01`仅在以下版本中可用 AWS 区域：ap-northeast-1、ap-southeast-1、eu-central-1、eu-west-1、us-east-1、us-east-1、us-west-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 签名版本 4。有关更多信息，请参阅《AWS 一般参考》**中的[使用签名版本 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>

LoRa广域网设备遵循[金雅拓、Actility和Semtech在LoRa广域网™ 安全：为 LoRa 联盟准备的白皮书™ 中描述的安全](https://lora-alliance.org/sites/default/files/2019-05/lorawan_security_whitepaper.pdf)实践。

有关 LoRa WAN 设备传输安全的更多信息，请参阅 [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 服务上时）的数据。发送到的所有数据都使用 MQTT、HTTPS 和 WebSocket 协议通过 TLS 连接发送，因此在传输过程中默认 AWS IoT Core 是安全的。 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 控制台或 AWS KMS CLI 命令创建对称客户托管密钥。`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，请运行 `update-encryption-configuration` CLI 命令。

   ```
   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，请运行 `describe-encryption-configuration` CLI 命令：

   ```
   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 不需要以下额外权限：

APIs 不需要 AWS KMS 权限的  
`List*`和`Delete*` APIs 不属于这个桶。客户始终可以调用任意 `List*` 或 `Delete*` 控制面板 API，即使调用者没有 `kms:Decrypt` 权限，这些 API 调用也会成功。即使您的客户托管密钥不健康`List*`且`Delete*` APIs 未进行任何解密，这些 API 调用也会成功。  
+ **列表\$1 APIs**-所有列出操作（例如、`ListThings``ListPolicies`、`ListCertificates`）
+ **删除\$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 密钥并执行 encryption/decryption 操作。所有组件功能正常。

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>

下表描述了密钥被删除或停用时的常见故障场景：


| 场景 | 直接影响 | 长期后果 | 
| --- | --- | --- | 
|  密钥已禁用  |  所有新 encryption/decryption 操作都会立即失败  |  服务中断，直到密钥被重新启用或替换  | 
|  密钥计划删除  |  密钥状态更改为待删除，所有 encryption/decryption 操作都将失败  |  删除完成后服务自动故障  | 
|  密钥已永久删除  |  所有操作立即且永久失败  |  永久数据丢失且无法恢复加密数据  | 
|  密钥策略修改不正确  |  AWS IoT Core 失去对密钥的访问权限  |  服务故障，直到策略被纠正  | 
|  IAM 角色已删除  |  AWS IoT Core 无法扮演访问密钥的角色  |  加密服务完全故障  | 
|  IAM 角色被错误修改  |  AWS IoT Core 无法扮演角色或使用角色访问密钥  |   服务故障，直到 IAM 角色被纠正  | 

##### 预防和最佳实践
<a name="prevention-best-practices"></a>

为防止意外密钥删除或停用，并最大限度地降低服务故障风险，请执行以下操作：

实施密钥生命周期策略  
建立清晰的密钥创建、轮换和停用流程。记录哪些 AWS IoT Core 资源使用了哪些密钥，并维护活动密钥清单。

使用 IAM 策略限制密钥删除  
创建 IAM 策略，防止未经授权的用户删除或禁用关键加密密钥。使用条件要求密钥删除操作需要额外审批。

启用 CloudTrail 日志记录  
监控所有 AWS KMS 密钥操作 CloudTrail ，以检测未经授权或意外的密钥管理活动。为密钥删除、禁用或策略更改设置警报。

测试密钥替换流程  
定期在非生产环境中测试密钥替换流程，以确保您能快速从密钥相关故障中恢复。

维护密钥备份  
虽然您无法导出 AWS KMS 密钥材料，但请保留密钥 ARNs、策略和相关 AWS IoT Core 配置的详细记录，以便在需要时快速更换密钥。

监控密钥运行状况  
持续监控 `CMK.Health` 指标，并为密钥运行状况变化设置自动化警报。实施自动化响应，以快速处理密钥相关问题。

**重要**  
在生产环境实施之前，始终在开发环境中测试密钥更新流程。制定文档化的回滚计划，并确保密钥替换流程在紧急情况下可以快速执行。

### 步骤 6：监控密钥运行状况
<a name="health-status-monitoring"></a>

作为定期检查的一部分，系统会发布 CloudWatch 指标和日志，以提供客户托管密钥配置的 AWS IoT Core 运行状况的可见性

AWS IoT Core 将该`CMK.Health`指标 CloudWatch 至少每分钟发出一次。该指标提供有关 AWS IoT Core 用于加密和解密数据的客户托管密钥的运行状况的信息。

`CMK.Health` 指标可能具有以下值：
+ 值 AWS IoT Core 为`1`：能够成功使用加密密钥来加密和解密您的数据。
+ 值 AWS IoT Core 为`0`：无法使用加密密钥来加密和解密您的数据。

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. 为`CMK.Health`指标@@ **设置 CloudWatch 警报**：

   ```
   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. **启用 AWS IoT V2 日志记录**以捕获包含错误代码和消息的详细运行状况更改事件。

1. **检查配置状态**以进行故障排除：

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

1. **调查 UNHEALTHY 状态**，检查 `errorCode` 字段：
   + `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"
}
```

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

当加密密钥的状态从更新`HEALTHY`为时`UNHEALTHY`， 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 支持中心](https://console.aws.amazon.com/support/home#/)以获取额外帮助。

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

您还可以监控 KMS 密钥 AWS IoT Core的使用情况，以进行加密解密操作。 AWS IoT Core 将对您的 KMS 密钥进行`DescribeKey``Decrypt``ReEncrypt`、、和`GenerateDataKeyWithoutPlaintext`操作，以加密/解密属于您的 AWS 账户的静态数据。

有针 CloudTrail 对`DescribeKey`、`Decrypt``ReEncrypt`、和的事件`GenerateDataKeyWithoutPlaintext`。这些事件监控 AWS IoT Core 为访问由您的客户托管密钥加密的数据而调用的 AWS KMS 操作。

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