

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

# 安全性 AWS IoT
<a name="security"></a>

云安全 AWS 是重中之重。作为 AWS 客户，您可以受益于专为满足大多数安全敏感型组织的要求而构建的数据中心和网络架构。

安全是双方共同承担 AWS 的责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云*的* 安全性和云*中* 的安全性：
+ **云安全** — AWS 负责保护在 AWS 云中运行 AWS 服务的基础架构。 AWS 还为您提供可以安全使用的服务。作为 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)的一部分，第三方审核人员将定期测试和验证安全性的有效性。要了解适用的合规计划 AWS IoT，请参阅[按合规计划划分的范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云端安全**-您的责任由您使用的 AWS 服务决定。您还需要对其它因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

本文档可帮助您了解在使用时如何应用分担责任模型 AWS IoT。以下主题向您介绍如何进行配置 AWS IoT 以满足您的安全和合规性目标。您还将学习如何使用其他 AWS 服务来帮助您监控和保护您的 AWS IoT 资源。

**Topics**
+ [AWS IoT 安全](iot-security.md)
+ [身份验证](authentication.md)
+ [Authorization](iot-authorization.md)
+ [中的数据保护 AWS IoT Core](data-protection.md)
+ [的身份和访问管理 AWS IoT](security-iam.md)
+ [日志记录和监控](security-logging.md)
+ [AWS IoT 核心的合规性验证](compliance.md)
+ [AWS 物联网核心的弹性](disaster-recovery-resiliency.md)
+ [AWS IoT Core 与接口 VPC 终端节点一起使用](IoTCore-VPC.md)
+ [基础设施安全 AWS IoT](infrastructure-security.md)
+ [使用 Core 对生产车队或设备进行 AWS IoT 安全监控](security-monitoring.md)
+ [中的安全最佳实践 AWS IoT Core](security-best-practices.md)
+ [AWS 培训和认证](#iot-security-training)

# AWS IoT 安全
<a name="iot-security"></a>

每个连接的设备或客户端都必须具有与 AWS IoT进行交互所需的凭证。所有进出 AWS IoT 流量均通过传输层安全 (TLS) 安全发送。 AWS 云安全机制可在数据与其他 AWS 服务 AWS IoT 之间移动时对其进行保护。

![\[AWS IoT 安全工作流程，包括与之交互的凭据 AWS IoT、用于安全连接的传输层安全以及用于保护数据的 AWS 云安全机制。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/thunderball-overview.png)

+ 您负责管理 AWS IoT中的设备证书（X.509 证书、 AWS 凭证、Amazon Cognito Identity、联合身份或自定义身份验证令牌）和策略。您还负责将唯一身份分配给每台设备并管理每个设备或每组设备的权限。
+ 您的设备 AWS IoT 使用 X.509 证书或亚马逊 Cognito 身份通过安全的 TLS 连接进行连接。在研发期间，对于某些调用或使用 API 的应用程序 WebSockets，您还可以使用 IAM 用户和群组或自定义身份验证令牌进行身份验证。有关更多信息，请参阅 [IAM 用户、组和角色](iam-users-groups-roles.md)。
+ 使用 AWS IoT 身份验证时，消息代理负责对您的设备进行身份验证，安全地摄取设备数据，并使用策略授予或拒绝您为设备指定的访问权限。 AWS IoT 
+ 使用自定义身份验证时，自定义授权机构负责对您的设备进行身份验证，并使用 AWS IoT 或 IAM 策略授予或拒绝您为设备指定的访问权限。
+  AWS IoT 规则引擎根据您定义的规则将设备数据转发到其他设备或其他 AWS 服务。它用于 AWS Identity and Access Management 将数据安全地传输到其最终目的地。有关更多信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md)。

# 身份验证
<a name="authentication"></a>

身份验证是用于验证客户端或服务器的身份的机制。服务器身份验证是设备或其他客户端确保与实际 AWS IoT 端点通信的过程。客户端身份验证是设备或其他客户端对自己进行身份验证的过程 AWS IoT。

## X.509 证书概览
<a name="x509-certificate-overview"></a>

X.509 证书是一个数字证书，它使用 [X.509 公有密钥基础设施标准](https://en.wikipedia.org/wiki/X.509)将公有密钥与证书中包含的身份相关联。X.509 证书由一家名为证书颁发机构（CA）的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书，它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书。X.509 证书链既用于客户端进行的服务器身份验证，又用于服务器进行的客户端身份验证。

# 服务器身份验证
<a name="server-authentication"></a>

当您的设备或其他客户端尝试连接时 AWS IoT Core， AWS IoT Core 服务器将发送一个 X.509 证书，您的设备将使用该证书对服务器进行身份验证。身份验证通过验证 [X.509 证书链](x509-client-certs.md)在 TLS 层进行。这与浏览器在您访问 HTTPS URL 时使用的方法相同。如果要使用您自己的证书颁发机构提供的证书，请参阅 [管理 CA 证书](manage-your-CA-certs.md)。

当您的设备或其他客户端与 AWS IoT Core 端点建立 TLS 连接时，会 AWS IoT Core 显示一个证书链，设备使用该证书链来验证它们是否正在 AWS IoT Core 与之通信，而不是其他服务器模仿 AWS IoT Core。呈现的链取决于设备连接的端点类型和客户端在 TLS 握手期间 AWS IoT Core 协商的[密码套件](transport-security.md)的组合。

## 端点类型
<a name="endpoint-types"></a>

AWS IoT Core 支持`iot:Data-ATS`。 `iot:Data-ATS`终端节点出示由[亚马逊信任服务](https://www.amazontrust.com/repository/) CA 签署的服务器证书。

ATS 端点提供的证书由 Starfield 进行交叉签名。某些 TLS 客户端实现要求验证信任根，并要求将 Starfield CA 证书安装到客户端的信任存储中。

**警告**  
建议不要使用对整个证书（包括颁发者名称等）进行哈希处理的证书固定方法，因为这将导致证书验证失败，因为我们提供的 ATS 证书由 Starfield 进行交叉签名并具有其它颁发者名称。

**重要**  
使用 `iot:Data-ATS` 端点。赛门铁克和威瑞信证书已被弃用，不再受其支持。 AWS IoT Core

您可以使用 `describe-endpoint` 命令创建 ATS 端点。

```
aws iot describe-endpoint --endpoint-type iot:Data-ATS
```

`describe-endpoint` 命令采用以下格式返回端点。

```
account-specific-prefix.iot.your-region.amazonaws.com
```

**注意**  
首次调用 `describe-endpoint` 时，会创建一个端点。对 `describe-endpoint` 的所有后续调用将返回同一端点。

**注意**  
要在 AWS IoT Core 控制台中查看您的`iot:Data-ATS`终端节点，请选择**设置**。控制台仅显示 `iot:Data-ATS` 端点。

### `IotDataPlaneClient`使用适用于 Java 的 AWS SDK 创建
<a name="java-client"></a>

要创建使用 `iot:Data-ATS` 端点的 `IotDataPlaneClient`，您必须执行以下操作。
+ 使用 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html)API 创建`iot:Data-ATS`终端节点。
+ 在创建 `IotDataPlaneClient` 时指定该端点。

以下示例执行这两项操作。

```
public void setup() throws Exception {
        IotClient client = IotClient.builder().credentialsProvider(CREDENTIALS_PROVIDER_CHAIN).region(Region.US_EAST_1).build();
        String endpoint = client.describeEndpoint(r -> r.endpointType("iot:Data-ATS")).endpointAddress();
        iot = IotDataPlaneClient.builder()
                                .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
                                .endpointOverride(URI.create("https://" + endpoint))
                                .region(Region.US_EAST_1)
                                .build();
}
```

## 用于服务器身份验证的 CA 证书
<a name="server-authentication-certs"></a>

根据您使用的数据端点类型和协商的密码套件， AWS IoT Core 服务器身份验证证书由以下根 CA 证书之一签名：

**Amazon Trust Services 端点（首选）**

**注意**  
您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
+ RSA 2048 位密钥：[https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem)。
+ RSA 4096 位密钥：Amazon Root CA 2。留待将来使用。
+ ECC 256 位密钥：[https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem)。
+ ECC 384 位密钥：Amazon Root CA 4。留待将来使用。

这些证书都由 [ Starfield 根 CA 证书](https://www.amazontrust.com/repository/SFSRootCAG2.pem)进行交叉签名。自 2018 年 5 月 9 日在亚太 AWS IoT Core 地区（孟买）地区推出以来，所有新地区仅提供 ATS 证书。 AWS IoT Core 

**VeriSign 终端节点（旧版）**
+ RSA 2048 位密钥：[3 VeriSign 类公共主要 G5](https://www.digicert.com/kb/digicert-root-certificates.htm) 根 CA 证书

## 服务器身份验证指南
<a name="server-authentication-guidelines"></a>

有很多变量会影响设备验证 AWS IoT Core 服务器身份验证证书的能力。例如，设备的内存可能太有限，无法容纳所有可能的根 CA 证书，或者设备可能会实施非标准的证书验证方法。由于这些原因，我们建议遵循以下准则：
+ 我们建议您使用 ATS 端点并安装所有受支持的 Amazon Root CA 证书。
+ 如果您无法在设备上存储所有这些证书，并且您的设备未使用基于 ECC 的验证，则可以省略 [https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA4.pem](https://www.amazontrust.com/repository/AmazonRootCA4.pem) ECC 证书。如果您的设备未实施基于 RSA 的证书验证，则可以省略 [https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA2.pem](https://www.amazontrust.com/repository/AmazonRootCA2.pem) RSA 证书。您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
+ 如果在连接到 ATS 端点时遇到服务器证书验证问题，请尝试将相关的交叉签名的 Amazon Root CA 证书添加到您的信任存储中。您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
  + [交叉签名 Amazon Root CA 1](https://www.amazontrust.com/repository/G2-RootCA1.pem)
  + [交叉签名的 Amazon Root CA 2](https://www.amazontrust.com/repository/G2-RootCA2.pem) - 预留供将来使用。
  + [交叉签名 Amazon Root CA 3](https://www.amazontrust.com/repository/G2-RootCA3.pem)
  + [交叉签名的 Amazon Root CA 4 - 预留供将来使用。](https://www.amazontrust.com/repository/G2-RootCA4.pem)
+ 如果您遇到服务器证书验证问题，则您的设备可能需要明确信任根 CA。尝试将 [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem) 添加到您的信任存储。
+ 如果您在执行上述步骤后仍遇到问题，请联系 [AWS 开发人员支持](https://aws.amazon.com/premiumsupport/plans/developers/)。

**注意**  
CA 证书具有一个过期日期，在该日期后，这些证书将无法用于验证服务器的证书。可能必须在 CA 证书的过期日期前替换这些证书。请确保可以更新所有设备或客户端上的根 CA 证书，以确保持续的连接并保持最新的安全最佳实践。

**注意**  
在设备代码 AWS IoT Core 中连接时，请将证书传递到您用于连接的 API。您使用的 API 因 SDK 而异。有关更多信息，请参阅[AWS IoT Core 设备 SDKs](iot-sdks.md)。

# 客户端身份验证
<a name="client-authentication"></a>

AWS IoT 支持三种类型的身份主体进行设备或客户端身份验证：
+ [X.509 客户端证书](x509-client-certs.md)
+ [IAM 用户、组和角色](iam-users-groups-roles.md)
+ [Amazon Cognito Identity](cognito-identities.md)

这些身份可与设备、移动、Web 或桌面应用程序结合使用。用户甚至可以键入 AWS IoT 命令行界面 (CLI) 命令来使用它们。通常， AWS IoT 设备使用 X.509 证书，而移动应用程序使用 Amazon Cognito 身份。Web 应用程序和桌面应用程序使用 IAM 或联合身份。 AWS CLI 命令使用 IAM。有关 IAM 身份的更多信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md)。

# X.509 客户端证书
<a name="x509-client-certs"></a>

X.509 证书提供了 AWS IoT 对客户端和设备连接进行身份验证的功能。客户端必须先注册客户证书， AWS IoT 然后才能与之通信 AWS IoT。一个客户端证书可以在同一个区域的多个 AWS 账户 s 中注册 AWS 区域 ，以便于在同一区域的设备 AWS 账户之间移动设备。请参阅[在多账户注册中使用多个 AWS 账户 X.509 客户端证书](#multiple-account-cert)了解更多信息。

我们建议为每个设备或客户端提供一个唯一的证书，以便进行精细的客户端管理操作，包括证书吊销。设备和客户端还必须支持证书轮换和更换，以帮助确保在证书过期时平稳运行。

有关使用 X.509 证书支持多个设备的信息，请参阅 [设备预调配](iot-provision.md) 以查看 AWS IoT 支持的不同证书管理和预调配选项。

**AWS IoT 支持以下类型的 X.509 客户端证书：**
+  由... 生成的 X.509 证书 AWS IoT
+  由注册的 CA 签署的 X.509 证书。 AWS IoT
+  由未注册到 AWS IoT的 CA 签发的 X.509 证书。

本节介绍如何在 AWS IoT中管理 X.509 证书。您可以使用 AWS IoT 控制台或 AWS CLI 执行以下证书操作：
+ [创建 AWS IoT 客户证书](device-certs-create.md)
+ [创建您自己的客户端证书](device-certs-your-own.md)
+ [注册客户端证书](register-device-cert.md)
+ [激活或停用客户端证书](activate-or-deactivate-device-cert.md)
+ [吊销客户端证书](revoke-ca-cert.md)

有关执行这些操作的 AWS CLI 命令的更多信息，请参阅 [AWS IoT CLI 参考](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/index.html)。

## 使用 X.509 客户端证书
<a name="x509-client-cert-basics"></a>

X.509 证书对与的客户端和设备连接进行身份验证。 AWS IoT与其它身份和身份验证机制相比，X.509 证书具有多项优势。有了 X.509 证书，可以将非对称密钥用于设备。例如，您可以将私有密钥刻录到设备上的安全存储中，这样敏感的加密材料永远不会离开设备。X.509 证书可以通过用户名和密码或持有者令牌等其它方案提供更可靠的客户端身份验证，因为私有密钥永远不会离开设备。

AWS IoT 使用 TLS 协议的客户端身份验证模式对客户端证书进行身份验证。TLS 支持适用于多种编程语言和操作系统并且通常用于为数据加密。在 TLS 客户端身份验证中， AWS IoT 请求 X.509 客户端证书并根据证书注册表验证证书的状态。 AWS 账户 然后，它要求客户提供与证书中包含的公钥相对应的私钥的所有权证明。 AWS IoT 要求客户端向传输层安全 [(TLS) 协议发送服务器名称指示 (SNI) 扩展](https://tools.ietf.org/html/rfc3546#section-3.1)。有关配置 SNI 扩展的更多信息，请参阅 [运输安全 AWS IoT Core](transport-security.md)。

为了便于客户机与 AWS IoT 核心进行安全、一致的连接，X.509 客户端证书必须具备以下内容：
+ 已在 AWS IoT Core 中注册。有关更多信息，请参阅 [注册客户端证书](register-device-cert.md)。
+ 状态为 `ACTIVE`。有关更多信息，请参阅 [激活或停用客户端证书](activate-or-deactivate-device-cert.md)。
+ 尚未达到证书到期日期。

您可以创建使用 Amazon Root CA 的客户端证书，并可以使用您自己的由其它证书颁发机构（CA）签发的客户端证书。有关使用 AWS IoT 控制台创建使用 Amazon 根 CA 的证书的更多信息，请参阅[创建 AWS IoT 客户证书](device-certs-create.md)。有关使用您自己的 X.509 证书的更多信息，请参阅 [创建您自己的客户端证书](device-certs-your-own.md)。

对于 CA 证书签发的证书过期日期和时间，将在创建 CA 证书时设置。由此生成的 X.509 证书将于世界标准时间 2049 年 12 月 31 日午夜 AWS IoT 到期（2049-12-31T23：59:59 Z）。

AWS IoT Device Defender 可以对您的 AWS 账户 和支持常见物联网安全最佳实践的设备进行审计。这包括管理由您的 CA 或 Amazon Root CA 签署的 X.509 证书的到期日期。有关管理证书的到期日期的更多信息，请参阅[设备证书即将到期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-approaching-expiration.html)和 [CA 证书即将到期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-ca-cert-approaching-expiration.html)。

在官方 AWS IoT 博客上，[如何使用管理物联网设备证书轮换，深入探讨了设备证书轮换的管理和](https://aws.amazon.com/blogs/iot/how-to-manage-iot-device-certificate-rotation-using-aws-iot/)安全最佳实践 AWS IoT。

## 在多账户注册中使用多个 AWS 账户 X.509 客户端证书
<a name="multiple-account-cert"></a>

多账户注册能够在同一区域或不同区域的 AWS 账户之间移动设备。您可以在预生产账户中注册、测试和配置设备，然后在生产账户中注册并使用相同的设备和设备证书。您也可以在设备上注册客户端证书，或者在没有注册的 CA 的情况下注册设备证书 AWS IoT。有关更多信息，请参阅 [Register a client certificate signed by an unregistered CA (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)（注册由未注册的 CA 签发的客户端证书（CLI））。

**注意**  
用于多账户注册的证书在 `iot:Data-ATS`、`iot:Data`（旧式）、`iot:Jobs` 和 `iot:CredentialProvider` 端点类型中获得支持。有关 AWS IoT 设备端点的更多信息，请参阅[AWS IoT 设备数据和服务端点](iot-connect-devices.md#iot-connect-device-endpoints)。

使用多账户注册的设备必须将[服务器名称指示 (SNI) 扩展](https://tools.ietf.org/html/rfc3546#section-3.1)发送到传输层安全 (TLS) 协议，并在连接时在`host_name`字段中提供完整的端点地址。 AWS IoT AWS IoT 使用中的终端节点地址将连接路由`host_name`到正确的 AWS IoT 帐户。未发送 `host_name` 中的有效端点地址的现有设备将继续工作，但它们将无法使用需要此信息的特征。有关 SNI 扩展以及如何识别 `host_name` 字段的端点地址的更多信息，请参阅。[运输安全 AWS IoT Core](transport-security.md)

**使用多账户注册**

1. 您可以向 CA 注册设备证书。您可以在 `SNI_ONLY` 模式下在多个账户中注册签名 CA，并使用该 CA 向多个账户注册相同的客户端证书。有关更多信息，请参阅 [在 SNI\$1ONLY 模式下注册 CA 证书（CLI）- 建议](manage-your-CA-certs.md#register-CA-cert-SNI-cli)。

1. 您可以在没有 CA 的情况下注册设备证书。请参阅[注册由未注册的 CA（CLI）签发的客户端证书](manual-cert-registration.md#manual-cert-registration-noca-cli)。注册 CA 是可选的。您无需注册签署设备证书的 CA AWS IoT。

## 支持的证书签名算法 AWS IoT
<a name="x509-cert-algorithms"></a>

AWS IoT 支持以下证书签名算法：
+ SHA256WITHRSA
+ SHA384WITHRSA
+ SHA512WITHRSA
+ SHA256WITHRSAANDMGF1 (RSSASSA-PSS)
+ SHA384WITHRSAANDMGF1 (RSSASSA-PSS)
+ SHA512WITHRSAANDMGF1 (RSSASSA-PSS)
+ DSA\$1WITH\$1 SHA256
+ ECDSA-with-SHA256
+ ECDSA-with-SHA384
+ ECDSA-with-SHA512

有关证书身份验证和安全性的更多信息，请参阅[设备证书密钥质量](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-key-quality.html)。

**注意**  
证书签名请求（CSR）必须包含公有密钥。该密钥可以是长度至少为 2048 位的 RSA 密钥，或者是来自 NIST P-256、NIST P-384 或 NIST P-521 曲线的 ECC 密钥。有关更多信息，请参阅 [CreateCertificateFromCsr API 参考指南](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCertificateFromCsr.html) 中的 *AWS IoT *。

## 支持的密钥算法 AWS IoT
<a name="x509-cert-key-algorithms"></a>

下表显示了如何支持密钥算法：


****  

| 密钥算法 | 证书签名算法 | TLS 版本 | 是否支持？ 是或否 | 
| --- | --- | --- | --- | 
| 密钥大小至少为 2048 位的 RSA | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| ECC NIST P-256/P-384/P-521 | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| 密钥大小至少为 2048 位的 RSA-PSS | 全部 | TLS 1.2 | 否 | 
| 密钥大小至少为 2048 位的 RSA-PSS | 全部 | TLS 1.3 | 是 | 

要使用 [CreateCertificateFromCSR](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateFromCsr.html) 创建证书，您可以使用支持的密钥算法为您的 CSR 生成公钥。要使用[RegisterCertificate](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificate.html)或 [RegisterCertificateWithoutCA](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificateWithoutCA.html) 注册自己的证书，您可以使用支持的密钥算法为证书生成公钥。

有关更多信息，请参阅[安全策略](https://docs.aws.amazon.com//iot/latest/developerguide/transport-security.html#tls-policy-table)。

# 创建 AWS IoT 客户证书
<a name="device-certs-create"></a>

AWS IoT 提供由 Amazon 根证书颁发机构 (CA) 签署的客户证书。

本主题介绍如何创建由 Amazon Root 证书颁发机构签发的客户端证书，以及如何下载证书文件。创建客户端证书文件后，您必须在客户端上安装这些文件。

**注意**  
提供的每个 X.509 客户端证书都 AWS IoT 包含您在创建证书时设置的颁发者和主题属性。只有在创建证书后，证书属性才是不可改变的。

您可以使用 AWS IoT 控制台或创建由 Amazon 根 AWS IoT 证书颁发机构签名的证书。 AWS CLI 

## 创建 AWS IoT 证书（控制台）
<a name="device-certs-create-console"></a>

**使用 AWS IoT 控制台创建 AWS IoT 证书**

1. 登录 AWS 管理控制台 并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在导航窗格中，依次选择**安全**、**证书**和**创建**。

1. 选择**一键式创建证书（建议）**，然后选择**创建证书**。

1. 从**已创建证书**页面，将事物、公有密钥和私有密钥的客户端证书文件下载到安全位置。由 AWS IoT 生成的这些证书只能用于 AWS IoT 服务。

   如果您还需要 Amazon Root CA 证书文件，此页面也包含指向可用于下载此文件的页面的链接。

1. 此时客户端证书已创建并注册到 AWS IoT。在客户端中使用证书之前，您必须激活证书。

    要立即激活客户端证书，请选择**激活**。如果您不想立即激活证书，请参阅 [激活客户端证书（控制台）](activate-or-deactivate-device-cert.md#activate-device-cert-console) 以了解如何在以后激活证书。

   

1. 如果要将策略附加到证书，请选择 **Attach a policy**（附加策略）。

   如果您不希望立即附加策略，请选择 **Done**（完成）以完成操作。您可以在以后附加策略。

完成此流程后，在客户端上安装证书文件。

## 创建 AWS IoT 证书 (CLI)
<a name="device-certs-create-cli"></a>

 AWS CLI 提供了创建由 Amazon 根证书颁发机构签名的客户证书的**[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)**命令。但是，此命令不会下载 Amazon Root CA 证书文件。您可以从下载 Amazon Root CA 证书文件 [用于服务器身份验证的 CA 证书](server-authentication.md#server-authentication-certs)。

此命令创建私钥、公钥和 X.509 证书文件，并使用注册和激活证书。 AWS IoT

```
aws iot create-keys-and-certificate \
    --set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```

如果您不想在创建和注册证书时激活证书，则此命令会创建私有密钥、公有密钥和 X.509 证书文件并注册证书，但不会激活它。[激活客户端证书（CLI）](activate-or-deactivate-device-cert.md#activate-device-cert-cli) 介绍了以后如何激活证书。

```
aws iot create-keys-and-certificate \
    --no-set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```



在客户端上安装证书文件。

# 创建您自己的客户端证书
<a name="device-certs-your-own"></a>

AWS IoT 支持由任何根证书颁发机构或中间证书颁发机构 (CA) 签署的客户端证书。 AWS IoT 使用 CA 证书验证证书的所有权。要使用由非亚马逊 CA 的 CA 签名的设备证书，必须注册 CA 的证书， AWS IoT 这样我们才能验证设备证书的所有权。

AWS IoT 支持多种自带证书的方式 (BYOC)：
+ 首先，注册用于签署客户端证书的 CA，然后注册各个客户端证书。如果要在设备或客户端首次连接时将其注册到其客户端证书 AWS IoT （也称为[即时配置），则必须向注册签名 CA AWS IoT 并激活自动](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)注册。
+ 如果您无法注册签名 CA，则可以选择在没有 CA 的情况下注册客户端证书。对于未使用 CA 注册的设备，当您将它们连接到 AWS IoT时，您需要出示[服务器名称指示（SNI）](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)。

**注意**  
要使用 CA 注册客户端证书，必须向注册签名 CA AWS IoT，而不是向层次结构 CAs 中的任何其他证书注册。

**注意**  
在 `DEFAULT` 模式下，一个 CA 证书只能由一个区域中的一个账户注册。在 `SNI_ONLY` 模式下，一个 CA 证书可以由一个区域中的多个账户注册。

有关使用 X.509 证书支持多个设备的更多信息，请参阅 [设备预调配](iot-provision.md) 以查看 AWS IoT 支持的不同证书管理和预调配选项。

**Topics**
+ [管理 CA 证书](manage-your-CA-certs.md)
+ [使用您的 CA 证书创建客户端证书](create-device-cert.md)

# 管理 CA 证书
<a name="manage-your-CA-certs"></a>

本节介绍管理您自己的证书颁发机构（CA）证书的常见任务。

 AWS IoT 如果您使用的是由 AWS IoT 无法识别的 CA 签名的客户端证书，则可以向注册证书颁发机构 (CA)。

如果您希望客户端在首次连接 AWS IoT 时自动向其注册其客户端证书，则必须向注册签署客户端证书的 CA AWS IoT。否则，您不需要注册对客户端证书签发的 CA 证书。

**注意**  
在 `DEFAULT` 模式下，一个 CA 证书只能由一个区域中的一个账户注册。在 `SNI_ONLY` 模式下，一个 CA 证书可以由一个区域中的多个账户注册。

**Topics**
+ [创建 CA 证书](#create-your-CA-cert)
+ [注册 CA 证书](#register-CA-cert)
+ [停用 CA 证书](#deactivate-ca-cert)

## 创建 CA 证书
<a name="create-your-CA-cert"></a>

如果没有 CA 证书，则可以使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具创建一个。

**注意**  
您无法在 AWS IoT 控制台中执行此过程。

**使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具创建 CA 证书**

1. 生成密钥对。

   ```
   openssl genrsa -out root_CA_key_filename.key 2048
   ```

1. 使用密钥对中的私有密钥生成 CA 证书。

   ```
   openssl req -x509 -new -nodes \
       -key root_CA_key_filename.key \
       -sha256 -days 1024 \
       -out root_CA_cert_filename.pem
   ```

## 注册 CA 证书
<a name="register-CA-cert"></a>

这些程序描述了如何注册来自非亚马逊 CA 的证书颁发机构 (CA) 的证书。 AWS IoT Core 使用 CA 证书验证证书的所有权。要使用由非亚马逊 CA 的 CA 签名的设备证书，您必须向注册 CA 证书， AWS IoT Core 这样它才能验证设备证书的所有权。

### 注册 CA 证书（控制台）
<a name="register-CA-cert-console"></a>

**注意**  
若要在控制台中注册 CA 证书，请在控制台中的 [Register CA certificate](https://console.aws.amazon.com//iot/home#/create/cacertificate)（注册 CA 证书）处开始注册。您可以在多账户模式下注册您的 CA，而无需提供验证证书或访问私有密钥的权限。在多账户模式下，多个 AWS 账户 可以在同一个 AWS 区域中注册 CA。您可以通过提供验证证书和 CA 私有密钥的所有权证明，在单账户模式下注册您的 CA。

### 注册 CA 证书（CLI）
<a name="register-CA-cert-cli"></a>

您可以在 `DEFAULT` 模式或 `SNI_ONLY` 模式下注册 CA 证书。CA 可以一对一 AWS 账户 地在`DEFAULT`模式下注册 AWS 区域。一个 CA 可以在同一个`SNI_ONLY`模式下通过多个 AWS 账户 CA 进行注册 AWS 区域。有关 CA 证书模式的更多信息，请参阅 [certificateMode](https://docs.aws.amazon.com//iot/latest/apireference/API_CACertificateDescription.html#iot-Type-CACertificateDescription-certificateMode)。

**注意**  
我们建议您在 `SNI_ONLY` 模式下注册 CA。您无需提供验证证书或访问私钥的权限，并且可以在同一个证书 AWS 账户 中多次注册 CA AWS 区域。

#### 在 SNI\$1ONLY 模式下注册 CA 证书（CLI）- 建议
<a name="register-CA-cert-SNI-cli"></a>

**先决条件**

继续操作之前，请确保电脑满足以下条件：
+ 根 CA 的证书文件（在以下示例中引用为 `root_CA_cert_filename.pem`）
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更高版本

**要在`SNI_ONLY`模式下注册 CA 证书，请使用 AWS CLI**

1. 向注册 CA 证书 AWS IoT。使用 **register-ca-certificate** 命令，输入 CA 证书文件名。有关更多信息，请参阅《AWS CLI 命令参考》**中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --certificate-mode SNI_ONLY
   ```

   如果成功，此命令将返回*certificateId*。

1. 此时，CA 证书已注册 AWS IoT 但处于非活动状态。CA 证书必须处于活跃状态，然后您才能注册由其签发的任何客户端证书。

   此步骤将激活 CA 证书。

   要激活 CA 证书，请使用 **update-certificate** 命令，如下所示。有关更多信息，请参阅 *AWS CLI 命令参考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

要查看 CA 证书的状态，请使用 **describe-ca-certificate** 命令。有关更多信息，请参阅《AWS CLI 命令参考》**中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

#### 在 `DEFAULT` 模式下注册 CA 证书（CLI）
<a name="register-CA-cert-default-cli"></a>

**先决条件**

继续操作之前，请确保电脑满足以下条件：
+ 根 CA 的证书文件（在以下示例中引用为 `root_CA_cert_filename.pem`）
+ 根 CA 证书的私有密钥文件（在以下示例中引用为 `root_CA_key_filename.key`）
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更高版本

**要在`DEFAULT`模式下注册 CA 证书，请使用 AWS CLI**

1. 要从中获取注册码 AWS IoT，请使用**get-registration-code**。保存返回的 `registrationCode`，将其用作私有密钥验证证书的 `Common Name`。有关更多信息，请参阅《AWS CLI 命令参考》**中的 [get-registration-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/get-registration-code.html)。

   ```
   aws iot get-registration-code
   ```

1. 为私有密钥验证证书生成密钥对：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 为私有密钥验证证书创建证书签名请求（CSR）。将证书的 `Common Name` 字段设置为 **get-registration-code** 返回的 `registrationCode`。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   将提示您输入一些信息，包括证书的`Common Name`。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 使用 CSR 创建私有密钥验证证书：

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. 向注册 CA 证书 AWS IoT。将 CA 证书文件名和私有密钥验证证书文件名传递给 **register-ca-certificate** 命令，如下所示：有关更多信息，请参阅《AWS CLI 命令参考》**中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --verification-cert file://verification_cert_filename.pem
   ```

   如果成功*certificateId*，此命令将返回。

1. 此时，CA 证书已注册 AWS IoT 但未激活。CA 证书必须处于活跃状态，然后您才能注册由其签发的任何客户端证书。

   此步骤将激活 CA 证书。

   要激活 CA 证书，请使用 **update-certificate** 命令，如下所示。有关更多信息，请参阅 *AWS CLI 命令参考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

要查看 CA 证书的状态，请使用 **describe-ca-certificate** 命令。有关更多信息，请参阅《AWS CLI 命令参考》**中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

### 创建 CA 验证证书以在控制台中注册 CA 证书
<a name="create-CA-verification-cert"></a>

**注意**  
此过程仅适用于从 AWS IoT 控制台注册 CA 证书的情况。  
如果您不是从控制台进入此过程，请在 AWS IoT 控制台的 Register CA 证书上启动 [CA 证书注册](https://console.aws.amazon.com//iot/home#/create/cacertificate)过程。

继续操作之前，请确保同一台电脑满足以下条件：
+ 根 CA 的证书文件（在以下示例中引用为 `root_CA_cert_filename.pem`）
+ 根 CA 证书的私有密钥文件（在以下示例中引用为 `root_CA_key_filename.key`）
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更高版本

**使用命令行界面创建 CA 验证证书，以在控制台中注册 CA 证书**

1. 将 `verification_cert_key_filename.key` 替换为要创建的验证证书密钥文件的文件名（例如 **verification\$1cert.key**）。然后运行此命令，为私有密钥验证证书生成密钥对：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 将 `verification_cert_key_filename.key` 替换为在步骤 1 中创建的密钥文件的名称。

   将 `verification_cert_csr_filename.csr` 替换为要创建的证书签名请求（CSR）文件的名称。例如 **verification\$1cert.csr**。

   运行此命令以创建 CSR 文件。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   该命令会提示您输入其他信息（稍后说明）。

1. 在 AWS IoT 控制台的**验证证书**容器中，复制注册码。

1. **openssl** 命令提示您输入的信息显示在以下示例中。除了 `Common Name` 字段，您可以在其它字段中输入自己的值或将其留空。

   在 `Common Name` 字段中，粘贴您在上一步骤中复制的注册码。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

   完成后，命令会创建 CSR 文件。

1. 将 `verification_cert_csr_filename.csr` 替换为在上一步骤中使用的 `verification_cert_csr_filename.csr`。

   将 `root_CA_cert_filename.pem` 替换为要注册的 CA 证书的文件名。

   将 `root_CA_key_filename.key` 替换为 CA 证书的私有密钥文件的文件名。

   将 `verification_cert_filename.pem` 替换为要创建的验证证书的文件名。例如 **verification\$1cert.pem**。

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. 完成 OpenSSL 命令后，您应该准备好这些文件，以便在返回控制台时使用。
   + 您的 CA 证书文件（上一条命令中使用的 `root_CA_cert_filename.pem`）
   + 您在上一步中创建的验证证书（在上一个命令中*verification\$1cert\$1filename.pem*使用）

## 停用 CA 证书
<a name="deactivate-ca-cert"></a>

启用证书颁发机构 (CA) 证书进行自动客户端证书注册后， AWS IoT 会检查 CA 证书以确保 CA 已启用`ACTIVE`。如果 CA 证书是`INACTIVE`，则 AWS IoT 不允许注册客户端证书。

通过将 CA 证书设置为 `INACTIVE`，可防止该 CA 颁发的任何新客户端证书自动注册。

**注意**  
除非您明确吊销由受损的 CA 证书签发的每个已注册客户端证书，否则所有此类证书均将继续工作。

### 停用 CA 证书（控制台）
<a name="deactivate-ca-cert-console"></a>

**使用控制台停用 CA 证书 AWS IoT**

1. 登录 AWS 管理控制台 并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择 “**安全**”，选择**CAs**。

1. 在证书颁发机构列表中，找到要停用的证书颁发机构，然后选择省略号图标以打开选项菜单。

1. 在选项菜单上，选择**停用**。

证书颁发机构应在列表中显示为**停用**。

**注意**  
 AWS IoT 控制台不提供列出由您停用的 CA 签署的证书的方法。有关列出这些证书的 AWS CLI 选项，请参阅 [停用 CA 证书（CLI）](#deactivate-ca-cert-cli)。

### 停用 CA 证书（CLI）
<a name="deactivate-ca-cert-cli"></a>

 AWS CLI 提供了停用 CA 证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令。

```
aws iot update-ca-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html) 命令获取已由指定 CA 签名的所有已注册客户端证书的列表。对于由指定 CA 证书签名的每个客户端证书，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令吊销该客户端证书以避免使用它。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令查看 CA 证书的状态。

# 使用您的 CA 证书创建客户端证书
<a name="create-device-cert"></a>

您可以使用自己的证书颁发机构（CA）创建客户端证书。必须先注册客户证书， AWS IoT 然后才能使用。有关客户端证书的注册选项的信息，请参阅 [注册客户端证书](register-device-cert.md)。

## 创建客户端证书（CLI）
<a name="create-device-cert-cli"></a>

**注意**  
您无法在 AWS IoT 控制台中执行此过程。

**要使用创建客户证书 AWS CLI**

1. 生成密钥对。

   ```
   openssl genrsa -out device_cert_key_filename.key 2048
   ```

1. 为客户端证书创建 CSR。

   ```
   openssl req -new \
       -key device_cert_key_filename.key \
       -out device_cert_csr_filename.csr
   ```

   系统将提示您输入一些信息，如下所示：

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 从 CSR 创建客户端证书。

   ```
   openssl x509 -req \
       -in device_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out device_cert_filename.pem \
       -days 500 -sha256
   ```

 此时，客户证书已创建，但尚未在中注册 AWS IoT。有关注册客户端证书的方式和时机的信息，请参阅 [注册客户端证书](register-device-cert.md)。

# 注册客户端证书
<a name="register-device-cert"></a>

必须向注册客户端证书， AWS IoT 才能在客户端和之间进行通信 AWS IoT。您可以手动注册每个客户端证书，也可以将客户端证书配置 AWS IoT 为在客户端首次连接时自动注册。

 如果您希望客户端和设备在首次连接时注册其客户端证书，则必须在要使用的区域中拥有使用 AWS IoT 签署客户端证书所需的 [注册 CA 证书](manage-your-CA-certs.md#register-CA-cert)。Amazon Root CA 将自动向注册 AWS IoT。

客户证书可以由 AWS 账户 和地区共享。在您要使用客户端证书的每个账户和区域中，必须执行这些主题中的流程。在一个账户或区域中注册的客户端证书，不会在另一个账户或区域中自动识别。

**注意**  
使用传输层安全性（TLS）协议连接到 AWS IoT 的客户端必须支持 TLS 的[服务器名称指示（SNI）扩展](https://tools.ietf.org/html/rfc3546#section-3.1)。有关更多信息，请参阅 [运输安全 AWS IoT Core](transport-security.md)。

**Topics**
+ [手动注册客户端证书](manual-cert-registration.md)
+ [在客户端连接到注册时 AWS IoT just-in-time 注册客户端证书 (JITR)](auto-register-device-cert.md)

# 手动注册客户端证书
<a name="manual-cert-registration"></a>

您可以使用 AWS IoT 控制台和手动注册客户证书 AWS CLI。

使用的注册程序取决于证书是否将由 AWS 账户和地区共享。在一个账户或区域中注册的客户端证书，不会在另一个账户或区域中自动识别。

在您要使用客户端证书的每个账户和区域中，必须执行此主题中的流程。客户证书可以由 AWS 账户 s 和 Regions 共享。

## 注册由已注册的 CA（控制台）签发的客户端证书
<a name="manual-cert-registration-console"></a>

**注意**  
在执行此过程之前，请确保您拥有客户端证书的.pem 文件，并且该客户端证书由您[注册](manage-your-CA-certs.md#register-CA-cert)的 CA 签名。 AWS IoT

**AWS IoT 使用控制台注册现有证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在导航窗格的 **Manage**（管理）部分下，选择 **Security**（安全性），然后选择 **Certificates**（证书）。

1. 在 **Certificates**（证书）对话框的 **Certificates**（证书）页上，选择 **Add certificate**（添加证书），然后选择 **Register certificates**（注册证书）。

1. 在 **Certificates to upload**（要上载的证书）对话框的 **Register certificate**（注册证书）页上，执行以下操作：
   + 选择 **CA 注册到 AWS IoT**。
   + 从 **Choose a CA certificate**（选择 CA 证书）中，选择您的 **Certification authority**（证书颁发机构）。
     + 选择 **Register a new CA**（注册新 CA）以注册未向 AWS IoT注册的新 **Certification authority**（证书颁发机构）。
     + 如果 **Amazon Root certificate authority**（Amazon 根证书颁发机构）是您的证书颁发机构，请将 **Choose a CA certificate**（选择 CA 证书）留空。
   + 最多选择 10 个证书进行上传和注册 AWS IoT。
     + 使用您在 [创建 AWS IoT 客户证书](device-certs-create.md) 和 [使用您的 CA 证书创建客户端证书](create-device-cert.md) 中创建的证书文件。
   + 选择 **Activate**（激活）或 **Deactivate**（停用）。如果选择**停用**，[激活或停用客户端证书](activate-or-deactivate-device-cert.md) 介绍了如何在证书注册后激活证书。
   + 选择**注册**。

在 **Certificates**（证书）对话框的 **Certificates**（证书）页上，现在将显示您注册的证书。

## 注册由未注册的 CA（控制台）签发的客户端证书
<a name="manual-cert-registration-console-noca"></a>

**注意**  
在执行此流程之前，请确保您拥有客户端证书 .pem 文件。

**AWS IoT 使用控制台注册现有证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧的导航窗格中，选择**安全**，选择**证书**，然后选择**创建**。

1. 在 **Create a certificate**（创建证书）上，找到 **Use my certificate**（使用我的证书）条目，然后选择 **Get started**（入门）。

1. 在 **Select CA**（选择 CA）上，选择 **Next**（下一步）。

1.  在 **Register exsiting device certificates**（注册现有的设备证书）上，选择 **Select certificates**（选择证书），并选择最多 10 个要注册的证书文件。

1.  关闭文件对话框后，选择在注册客户端证书时是要激活还是吊销客户端证书。

   如果您在注册证书时未激活证书，[激活客户端证书（控制台）](activate-or-deactivate-device-cert.md#activate-device-cert-console) 中介绍了以后如何激活证书。

   如果证书在注册时被吊销，则以后无法激活。

   选择要注册的证书文件，选择注册后要执行的操作，然后选择 **Register certificates**（注册证书）。

成功注册的客户端证书将显示在证书列表中。

## 注册由已注册的 CA（CLI）签发的客户端证书
<a name="manual-cert-registration-cli"></a>

**注意**  
在执行此流程之前，请确保您具有证书颁发机构（CA）.pem 和客户端证书的 .pem 文件。客户端证书必须由您[注册](manage-your-CA-certs.md#register-CA-cert)的证书颁发机构 (CA) 签名 AWS IoT。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html) 命令注册客户端证书但不激活。

```
aws iot register-certificate \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

客户证书已在中注册 AWS IoT，但尚未激活。有关如何在以后激活的信息，请参阅 [激活客户端证书（CLI）](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

您也可以在使用此命令注册客户端证书时进行激活。

```
aws iot register-certificate \
    --set-as-active \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

有关激活证书以使其可用于连接的更多信息 AWS IoT，请参阅 [激活或停用客户端证书](activate-or-deactivate-device-cert.md)

## 注册由未注册的 CA（CLI）签发的客户端证书
<a name="manual-cert-registration-noca-cli"></a>

**注意**  
在执行此流程之前，请确保您拥有证书 .pem 文件。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html) 命令注册客户端证书但不激活。

```
aws iot register-certificate-without-ca \
    --certificate-pem file://device_cert_filename.pem
```

客户证书已在中注册 AWS IoT，但尚未激活。有关如何在以后激活的信息，请参阅 [激活客户端证书（CLI）](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

您也可以在使用此命令注册客户端证书时进行激活。

```
aws iot register-certificate-without-ca \
    --status ACTIVE \
    --certificate-pem file://device_cert_filename.pem
```

有关激活证书以使其可用于连接的更多信息 AWS IoT，请参阅[激活或停用客户端证书](activate-or-deactivate-device-cert.md)。

# 在客户端连接到注册时 AWS IoT just-in-time 注册客户端证书 (JITR)
<a name="auto-register-device-cert"></a>

您可以将 CA 证书配置为启用已签名的客户端证书，以便在客户端首次连接时 AWS IoT 自动注册该证书 AWS IoT。

要在客户端首次连接时注册客户端证书，必须启用 CA 证书进行自动注册，并将客户端的第一个连接配置为提供所需的证书。 AWS IoT 

## 配置 CA 证书以支持自动注册（控制台）
<a name="enable-auto-registration-console"></a>

**使用 AWS IoT 控制台配置 CA 证书以支持自动注册客户证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择 “**安全**”，选择**CAs**。

1. 在证书颁发机构列表中，找到要启用自动注册的颁发机构，然后使用省略号图标打开选项菜单。

1. 在选项菜单上，选择**启用自动注册**。

**注意**  
证书颁发机构列表中不显示自动注册状态。要查看证书颁发机构的自动注册状态，您必须打开证书颁发机构的**详细信息**页面。

## 配置 CA 证书以支持自动注册（CLI）
<a name="enable-auto-registration-cli"></a>

如果您已经向注册了 CA 证书 AWS IoT，请使用[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令将 CA 证书设置为`autoRegistrationStatus``ENABLE`。

```
aws iot update-ca-certificate \
--certificate-id caCertificateId \
--new-auto-registration-status ENABLE
```

如果您要在注册 CA 证书时启用 `autoRegistrationStatus`，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html) 命令。

```
aws iot register-ca-certificate \
--allow-auto-registration  \
--ca-certificate file://root_CA_cert_filename.pem \
--verification-cert file://verification_cert_filename.pem
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令查看 CA 证书的状态。

## 配置客户端的首次连接以进行自动注册
<a name="configure-auto-reg-first-connect"></a>

当客户端首次尝试 AWS IoT 连接时，在传输层安全 (TLS) 握手期间，由您的 CA 证书签名的客户端证书必须存在于客户端上。

当客户端连接到时 AWS IoT，使用您在创建客户端证书或[创建自己的 AWS IoT 客户端证书](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-create.html)[中创建的客户端证书](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html)。 AWS IoT 将 CA 证书识别为已注册的 CA 证书，注册客户端证书，并将其状态设置为`PENDING_ACTIVATION`。这意味着，已自动注册客户端证书，该证书正在等待激活。客户端证书的状态必须为 `ACTIVE`，然后才能将其用于连接到 AWS IoT。有关激活客户端证书的信息，请参阅 [激活或停用客户端证书](activate-or-deactivate-device-cert.md)。

**注意**  
您可以使用 AWS IoT Core just-in-time注册 (JITR) 功能配置设备，而不必在设备首次连接时发送整个信任链。 AWS IoT Core可以出示 CA 证书，但连接时设备需要发送[服务器名称指示（SNI）](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1)扩展。

当 AWS IoT 自动注册证书或客户端提供`PENDING_ACTIVATION`状态为证书时，会向以下 MQTT 主题 AWS IoT 发布一条消息：

`$aws/events/certificates/registered/caCertificateId`

其中 `caCertificateId` 是颁发客户端证书的 CA 证书的 ID。

发布到该主题的消息具有以下结构：

```
{
        "certificateId": "certificateId",
        "caCertificateId": "caCertificateId",
        "timestamp": timestamp,
        "certificateStatus": "PENDING_ACTIVATION",
        "awsAccountId": "awsAccountId",
        "certificateRegistrationTimestamp": "certificateRegistrationTimestamp"
}
```

您可以创建一项规则，以侦听此主题并执行一些操作。我们建议您创建一项 Lambda 规则，以验证客户端证书不在证书吊销列表（CRL）中，激活该证书，创建策略并将其附加到证书中。该策略将确定客户端能够访问的资源。如果您创建的策略需要来自连接设备的客户端 ID，您可以使用规则的 clientid() 函数来检索客户端 ID。规则定义示例如下所示：

```
SELECT *,
   clientid() as clientid
from $aws/events/certificates/registered/caCertificateId
```

在此示例中，规则订阅 JITR 主题 `$aws/events/certificates/registered/caCertificateID` 并使用 clientid() 函数检索客户端 ID。然后规则将客户端 ID 附加到 JITR 有效载荷。有关规则 clientid() 函数的更多信息，请参阅 [clientid()](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-clientid)。

有关如何创建监听`$aws/events/certificates/registered/caCertificateID`主题并执行这些操作的 Lambda 规则的更多信息，请参阅[just-in-time 注册客户证书](https://aws.amazon.com/blogs/iot/just-in-time-registration-of-device-certificates-on-aws-iot/)。 AWS IoT

如果在自动注册客户端证书的过程中出现任何错误或异常，则会在日志中 AWS IoT 将事件或消息发送到您的日 CloudWatch 志。有关为您的账户设置日志的更多信息，请参阅 [Amazon CloudWatch 文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/)。

# 管理客户端证书
<a name="manage-device-cert"></a>

AWS IoT 为您提供了管理客户证书的功能。

**Topics**
+ [激活或停用客户端证书](activate-or-deactivate-device-cert.md)
+ [将事物或策略附加到客户端证书](attach-to-cert.md)
+ [吊销客户端证书](revoke-ca-cert.md)
+ [将设备证书传输到其它账户。](transfer-cert.md)

# 激活或停用客户端证书
<a name="activate-or-deactivate-device-cert"></a>

AWS IoT 验证客户端证书在对连接进行身份验证时是否处于活动状态。

您可以创建和注册客户端证书但不激活，这样直到您想要使用时才让这些证书可用。您还可以停用活动的客户端证书以暂时禁用它们。最后，您可以吊销客户端证书，防止以后使用这些证书。

## 激活客户端证书（控制台）
<a name="activate-device-cert-console"></a>

**使用 AWS IoT 控制台激活客户端证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要激活的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**激活**。

证书应在证书列表中显示为**活动**。

## 停用客户端证书（控制台）
<a name="deactivate-device-cert-console"></a>

**使用控制台停用客户端证书 AWS IoT**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要停用的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**停用**。

证书应在证书列表中显示为**停用**。

## 激活客户端证书（CLI）
<a name="activate-device-cert-cli"></a>

 AWS CLI 提供了激活证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status ACTIVE
```

如果命令成功，证书的状态将为 `ACTIVE`。运行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看证书的状态。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

## 停用客户端证书（CLI）
<a name="deactivate-device-cert-cli"></a>

 AWS CLI 提供了停用证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

如果命令成功，证书的状态将为 `INACTIVE`。运行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看证书的状态。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 将事物或策略附加到客户端证书
<a name="attach-to-cert"></a>

当您创建和注册与 AWS IoT 事物分开的证书时，该证书将没有任何授权任何 AWS IoT 操作的策略，也不会与任何 AWS IoT 事物对象相关联。本节介绍如何将这些关系添加到注册的证书中。

**重要**  
要完成这些流程，您必须具有要附加到证书的已创建事物或策略。

证书用于对设备进行身份验证， AWS IoT 以便设备可以连接。将证书附加到事物资源可建立设备（通过证书的方式）与事物资源之间的关系。要授权设备执行 AWS IoT 操作（例如允许设备连接和发布消息），必须将相应的策略附加到设备的证书上。

## 将事物附加到客户端证书（控制台）
<a name="attach-to-cert-thing-console"></a>

您需要事物对象的名称才能完成此流程。

**将事物对象附加到已注册的证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要附加策略的证书，选择省略号图标以打开证书的选项菜单，然后选择**附加事物**。

1. 在弹出窗口中，找到要附加到证书的事物的名称，选中其复选框，然后选择 **Attach**（附上）。

现在，事物对象应显示在证书详细信息页面上的事物列表中。

## 将策略附加到客户端证书（控制台）
<a name="attach-to-cert-policy-console"></a>

您需要策略对象的名称才能完成此流程。

**将策略对象附加到已注册的证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要附加策略的证书，选择省略号图标以打开证书的选项菜单，然后选择**附加策略**。

1. 在弹出窗口中，找到要附加到证书的策略的名称，选中其复选框，然后选择 **Attach**（附上）。

现在，策略对象应显示在证书详细信息页面上的策略列表中。

## 将事物附加到客户端证书（CLI）
<a name="attach-to-cert-thing-cli"></a>

 AWS CLI 提供了将事物对象附加到证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html)命令。

```
aws iot attach-thing-principal \
    --principal certificateArn \
    --thing-name thingName
```

## 将策略附加到客户端证书（CLI）
<a name="attach-to-cert-policy-cli"></a>

 AWS CLI 提供了将策略对象附加到证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html)命令。

```
aws iot attach-policy \
    --target certificateArn \
    --policy-name policyName
```

# 吊销客户端证书
<a name="revoke-ca-cert"></a>

如果您在已注册的客户端证书上检测到可疑活动，则可以吊销该证书，使其无法再次使用。

**注意**  
证书一旦被吊销，就无法更改其状态。也就是说，证书状态不能更改为 `Active` 或任何其它状态。

## 吊销客户端证书（控制台）
<a name="revoke-device-cert-console"></a>

**使用控制台吊销客户端证书 AWS IoT**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要吊销的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**吊销**。

如果证书已成功吊销，它将在证书列表中显示为**已吊销**。

## 吊销客户端证书（CLI）
<a name="revoke-device-cert-cli"></a>

 AWS CLI 提供了吊销证书的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status REVOKED
```

如果命令成功，证书的状态将为 `REVOKED`。运行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看证书的状态。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 将设备证书传输到其它账户。
<a name="transfer-cert"></a>

属于一个证书的 X.509 证书 AWS 账户 可以转移到另一个证书。 AWS 账户

**将 X.509 证书从一个证书转移到另一个证书 AWS 账户**

1. [开始证书传输](#transfer-cert-init)

   在启动传输之前，必须停用证书并从所有策略和事物中分离。

1. [接受或拒绝证书传输](#transfer-cert-accept)

   接收账户必须明确接受或拒绝传输的证书。接收账户接受证书后，必须激活证书才能使用。

1. [取消证书传输](#transfer-cert-cancel)

   如果证书未被接受，原始账户可以取消传输。

## 开始证书传输
<a name="transfer-cert-init"></a>

您可以使用[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)或开始将证书转移 AWS 账户 到另一个证书 AWS CLI。

### 开始证书传输（控制台）
<a name="transfer-cert-init-console"></a>

要完成此流程，您需要提供您要传输的证书 ID。

在带有要传输证书的账户执行此流程。

**开始将证书转移到另一个证书 AWS 账户**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择您打算传输并带有 **Active**（活动）或者 **Inactive**（非活动）状态的证书并打开其详细信息页面。

1. 在证书**详细信息**页面的**操作**菜单中，如果**停用**选项可用，则选择**停用**选项来停用证书。

1. 在证书的 **Details**（详细信息）页面中，在左侧菜单中，选择 **Policies**（策略）。

1. 在证书的 **Policies**（策略）页面上，如果证书附加了任何策略，请打开策略的选项菜单，然后选择 **Detach**（分离）以分离各个证书。

   在您继续操作前，该证书不能附加有任何策略。

1. 在证书的 **Policies**（策略）页面中，在左侧菜单中，选择 **Thins**（事物）。

1. 在证书的 **Things**（事物）页面，如果证书附加了任何事物，请打开事物的选项菜单并选择 **Detach**（分离）以分离各个事物。

   在您继续操作前，该证书不能附加有任何事物。

1. 在证书的 **Things**（事物）页面中，在左侧菜单中，选择 **Details**（详细信息）。

1. 在证书**详细信息**页面的**操作**菜单中，选择**开始传输**来打开**开始传输**对话框。

1. 在 “**开始转移**” 对话框中，输入要接收证书的账户号和一条可选的短消息。 AWS 账户 

1. 选择 **Start transfer**（开始传输）以传输证书。

控制台应显示一条消息，指示传输成功或失败。如果传输开始，证书的状态将更新为 **Transferred**（已传输）。

### 开始证书传输（CLI）
<a name="transfer-cert-init-cli"></a>

要完成此过程，您需要要转移*certificateArn*的证书的*certificateId*和。

在带有要传输证书的账户执行此流程。

**开始将证书转移到另一个 AWS 账户**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令来停用证书。

   ```
   aws iot update-certificate --certificate-id certificateId --new-status INACTIVE
   ```

1. 分离所有策略。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html) 命令列出附加到该证书的策略。

      ```
      aws iot list-attached-policies --target certificateArn
      ```

   1. 对于每个附加的策略，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html) 命令予以分离。

      ```
      aws iot detach-policy --target certificateArn --policy-name policy-name
      ```

1. 分离所有事物。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html) 命令列示附加到证书上的事物。

      ```
      aws iot list-principal-things --principal certificateArn
      ```

   1. 对于每个附加的事物，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html) 命令予以分离。

      ```
      aws iot detach-thing-principal --principal certificateArn --thing-name thing-name
      ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html) 命令启动证书传输。

   ```
   aws iot transfer-certificate --certificate-id certificateId --target-aws-account account-id
   ```

## 接受或拒绝证书传输
<a name="transfer-cert-accept"></a>

您可以使用[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)或，接受或拒绝 AWS 账户 从他 AWS 账户 人转移给您的证书 AWS CLI。

### 接受或拒绝证书传输（控制台）
<a name="transfer-cert-accept-console"></a>

要完成此流程，您需要提供已转移到您的账户的证书 ID。

在接收已转移证书的账户执行此流程。

**接受或拒绝已转移到您的证书 AWS 账户**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择您想要接受或拒绝且状态为 **Pending transfer**（待转移）的证书，并打开其详细信息页面。

1. 在证书的 **Details**（详细信息）页面上，在 **Actions**（操作）菜单中，
   + 如要接受证书，请选择 **Accept transfer**（接受传输）。
   + 如不接受证书，请选择 **Reject transfer**（拒绝传输）。

### 接受或拒绝证书传输（CLI）
<a name="transfer-cert-accept-cli"></a>

要完成此过程，您需要要接受或拒绝*certificateId*的证书转移。

在接收已转移证书的账户执行此流程。

**接受或拒绝已转移到您的证书 AWS 账户**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html) 命令以接受证书。

   ```
   aws iot accept-certificate-transfer --certificate-id certificateId
   ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html) 命令以拒绝证书。

   ```
   aws iot reject-certificate-transfer --certificate-id certificateId
   ```

## 取消证书传输
<a name="transfer-cert-cancel"></a>

您可以使用 [AWS IoT 控制台](https://console.aws.amazon.com/iot/home)或 AWS CLI在证书传输被接受之前将其取消。

### 取消证书传输（控制台）
<a name="transfer-cert-cancel-console"></a>

要完成此流程，您需要提供要取消的证书传输的 ID。

在启动证书传输的账户执行此流程。

**取消证书传输**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择状态为 **Transferred**（已传输）且您想要取消传输的证书，并打开其选项菜单。

1. 在证书的选项菜单上，选择 **Revoke transfer**（撤销传输）选项来取消证书传输。
**重要**  
请谨慎处理，不要将 **Revoke transfer**（撤销传输）选项与 **Revoke**（撤销）选项混淆。  
**Revoke transfer**（撤销传输）选项用于取消证书传输，而 **Revoke**（撤销）选项使证书无法为 AWS IoT所用，且操作不可逆。

### 取消证书传输（CLI）
<a name="transfer-cert-cancel-cli"></a>

要完成此过程，您需要要取消*certificateId*的证书转移。

在启动证书传输的账户执行此流程。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html) 命令取消证书传输。

```
aws iot cancel-certificate-transfer --certificate-id certificateId
```

# 自定义客户证书验证
<a name="customize-client-auth"></a>

AWS IoT Core 支持 X.509 客户端证书的自定义客户端证书验证，这增强了客户端身份验证管理。这种证书验证方法也称为身份验证前证书检查，在这种方法中，您可以根据自己的条件（在 Lambda 函数中定义）评估客户端证书，并吊销客户端证书或证书的签名证书颁发机构（CA）证书，以防止客户端连接到 AWS IoT Core。例如，您可以创建自己的证书吊销检查，根据支持[在线证书状态协议（OCSP）](https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol)或[证书吊销列表（CRL）](https://en.wikipedia.org/wiki/Certificate_revocation_list)端点的验证机构来验证证书的状态，并防止具有已吊销证书的客户端进行连接。用于评估客户端证书的条件在 Lambda 函数（也称为身份验证前 Lambda）中定义。您必须使用在域配置中设置的端点，并且[身份验证类型](protocols.md#connection-protocol-auth-mode)必须是 X.509 证书。此外，客户端在连接到时必须提供[服务器名称指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 扩展名。 AWS IoT Core

**注意**  
 AWS GovCloud (US) 各地区不支持此功能。

**Topics**
+ [第 1 步：使用注册您的 X.509 客户端证书 AWS IoT Core](#client-auth-cert-verification)
+ [第 2 步：创建 Lambda 函数](#customize-client-auth-lambda)
+ [第 3 步：授权调用您 AWS IoT 的 Lambda 函数](#customize-client-configuration-grant-permission)
+ [步骤 4：为域设置身份验证配置](#customize-client-configuration)

## 第 1 步：使用注册您的 X.509 客户端证书 AWS IoT Core
<a name="client-auth-cert-verification"></a>

如果您尚未执行此操作，请使用注册并激活您的 [X.509 客户端证书](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)。 AWS IoT Core否则，请跳到下一步。

要使用注册和激活您的客户端证书 AWS IoT Core，请按照以下步骤操作：

1. 如果您[直接使用创建客户证书 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。这些客户证书将自动向注册 AWS IoT Core。

1. 如果您[创建自己的客户证书](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，请按照[以下说明进行注册 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)。

1. 要激活您的客户端证书，请按照[以下说明](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)进行操作。

## 第 2 步：创建 Lambda 函数
<a name="customize-client-auth-lambda"></a>

您需要创建一个 Lambda 函数，该函数将执行证书验证，并且每当客户端尝试连接到配置的端点时，都会调用该函数。创建此 Lambda 函数时，请遵循[创建您的第一个 Lambda 函数](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)中的一般性指导。此外，请确保 Lambda 函数遵循预期的请求和响应格式，如下所示：

**Lambda 函数事件示例**

```
{
	"connectionMetadata": {
		"id": "string"
	},
	"principalId": "string",
	"serverName": "string",
	"clientCertificateChain": [
		"string",
		"string"
	]
}
```

`connectionMetadata`  
与客户端连接到 AWS IoT Core相关的元数据或其他信息。

`principalId`  
在 TLS 连接中与客户端关联的主体标识符。

`serverName`  
[服务器名称指示（SNI）](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)主机名字符串。 AWS IoT Core 要求设备将 [SNI 扩展](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)发送到传输层安全性（TLS）协议，并在 `host_name` 字段中提供完整的端点地址。

`clientCertificateChain`  
代表客户端 X.509 证书链的字符串数组。

**Lambda 函数响应示例**

```
{
	"isAuthenticated": "boolean"
}
```

`isAuthenticated`  
一个布尔值，指示是否已对请求进行身份验证。

**注意**  
在 Lambda 响应中，`isAuthenticated` 必须为 `true`，才能继续进行进一步身份验证和授权。否则，会禁用物联网客户端证书，并会阻止 X.509 客户端证书进行自定义身份验证，从而无法进行进一步的身份验证和授权。

## 第 3 步：授权调用您 AWS IoT 的 Lambda 函数
<a name="customize-client-configuration-grant-permission"></a>

创建 Lambda 函数后，必须使用 add-permissi AWS IoT on CLI 命令授予调用该函数的[权限](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html)。请注意，每当尝试连接到您配置的端点时，都将调用此 Lambda 函数。有关更多信息，请参阅[授权 AWS IoT 调用您的 Lambda](custom-auth-authorize.md) 函数。

## 步骤 4：为域设置身份验证配置
<a name="customize-client-configuration"></a>

以下部分介绍如何使用 AWS CLI为自定义域设置身份验证配置。

### 为域设置客户端证书配置（CLI）
<a name="customize-client-auth-cli"></a>

如果您没有域配置，请使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) CLI 命令创建一个。如果您已有域配置，请使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) CLI 命令更新域的客户端证书配置。您必须添加您在上一步中创建的 Lambda 函数的 ARN。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config 'clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config '{"clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

`domain-configuration-name`  
域配置的名称。

`authentication-type`  
域配置的身份验证类型。有关更多信息，请参阅[选择身份验证类型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
设备用来与 AWS IoT Core进行通信的应用程序协议。有关更多信息，请参阅[选择应用程序协议](protocols.md#protocol-selection)。

`client-certificate-config`  
为域指定客户端身份验证配置的对象。

`clientCertificateCallbackArn`  
建立新连接时在 TLS 层中 AWS IoT 调用的 Lambda 函数的亚马逊资源名称 (ARN)。要自定义客户端身份验证以执行自定义客户端证书验证，您必须添加您在上一步中创建的 Lambda 函数的 ARN。

有关更多信息，请参阅 *AWS IoT API 参考[UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)*中的[CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)和。有关域配置的更多信息，请参阅[域配置](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# IAM 用户、组和角色
<a name="iam-users-groups-roles"></a>

IAM 用户、组和角色是用于在 AWS中管理身份和身份验证的标准机制。您可以使用 AWS SDK 和，使用它们连接到 AWS IoT HTTP 接口 AWS CLI。

IAM 角色还 AWS IoT 允许代表您访问您账户中的其他 AWS 资源。例如，如果您想让设备将其状态发布到 DynamoDB 表，则 IAM 角色 AWS IoT 允许与亚马逊 DynamoDB 进行交互。有关更多信息，请参阅 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)。

对于通过 HTTP 的消息代理连接，使用签名版本 4 签名过程对用户、群组和角色 AWS IoT 进行身份验证。有关信息，请参阅[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

将 AWS 签名版本 4 与一起使用时 AWS IoT，客户端必须在 TLS 实现中支持以下内容：
+ TLS 1.2
+ SHA-256 RSA 证书签名验证
+ 来自 TLS 密码套件支持部分的密码套件之一

有关信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md)。

# Amazon Cognito Identity
<a name="cognito-identities"></a>

Amazon Cognito Identity 允许您创建临时的、有限的权限 AWS 凭证，以便在移动和网络应用程序中使用。在使用 Amazon Cognito Identity 时，请创建身份池，这些身份池将为您的用户创建唯一身份并通过 Login with Amazon、Facebook 和 Google 这样的身份提供者对其进行身份验证。您还可以将 Amazon Cognito Identity 与您自己的经开发人员验证的身份结合使用。有关更多信息，请参阅 [Amazon Cognito Identity](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)。

要使用 Amazon Cognito Identity，您需要定义与 IAM 角色相关联的 Amazon Cognito Identity 池。IAM 角色与一个 IAM 策略相关联，该策略向您的身份池中的身份授予访问 AWS 资源（如调用 AWS 服务）的权限。

Amazon Cognito Identity 可创建未经身份验证的身份和经过身份验证的身份。未经身份验证的身份用于希望在不登录的情况下使用该应用程序的移动或 Web 应用程序中的访客用户。未经身份验证的用户仅授予与身份池关联的 IAM 策略中指定的权限。

当您使用经过身份验证的身份时，除了附加到身份池的 IAM 策略外，还必须将 AWS IoT 策略附加到 Amazon Cognito 身份。要附加 AWS IoT 策略，请使用 [ AttachPolicy](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachPolicy.html)API 并向 AWS IoT 应用程序的单个用户授予权限。您可以使用该 AWS IoT 策略为特定客户及其设备分配细粒度的权限。

经过身份验证和未经身份验证的用户是不同的身份类型。如果您未将 AWS IoT 策略附加到 Amazon Cognito Identity，则经过身份验证的用户将无法在中进行授权， AWS IoT 并且无法访问 AWS IoT 资源和操作。有关为 Amazon Cognito Identity 创建策略的更多信息，请参阅 [发布/订阅策略示例](pub-sub-policy.md) 和 [使用 Amazon Cognito Identity 的授权](cog-iot-policies.md)。

![\[应用程序使用 Amazon Cognito Identity 访问设备。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/device-cognito.png)


# 自定义身份验证和授权
<a name="custom-authentication"></a>

 AWS IoT Core 允许您定义自定义授权方，以便您可以管理自己的客户端身份验证和授权。当您需要使用 AWS IoT Core 原生支持的身份验证机制以外的身份验证机制时，这很有用。（有关本地支持机制的更多信息，请参阅 [客户端身份验证](client-authentication.md)）。  

 例如，如果您要将现场现有设备迁移到， AWS IoT Core 并且这些设备使用自定义不记名令牌或 MQTT 用户名和密码进行身份验证，则 AWS IoT Core 无需为其配置新身份即可将其迁移到。您可以对任何 AWS IoT Core 支持的通信协议使用自定义身份验证。有关受 AWS IoT Core 支持的协议的更多信息，请参阅 [设备通信协议](protocols.md)。

**Topics**
+ [了解自定义身份验证工作流](custom-authorizer.md)
+ [创建和管理自定义授权方（CLI）](config-custom-auth.md)
+ [使用 X.509 客户端证书进行自定义身份验证](custom-auth-509cert.md)
+ [使用自定义身份验证 AWS IoT Core 进行连接](custom-auth.md)
+ [授权方故障排除](custom-auth-troubleshooting.md)

# 了解自定义身份验证工作流
<a name="custom-authorizer"></a>

自定义身份验证使您能够定义如何通过使用[授权方资源](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html)对客户端进行身份验证和授权。  每个授权方都包含对客户托管的 Lambda 函数的引用、用于验证设备凭证的可选公有密钥以及其它配置信息。下图说明了 AWS IoT Core中自定义身份验证的授权工作流。

![\[AWS IoT Core中的自定义身份验证的自定义授权工作流。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core 自定义身份验证和授权工作流程
<a name="custom-authentication-workflow"></a>

下面的列表说明了自定义身份验证和授权工作流中的每个步骤。

1. 设备使用支持的终端连接到客户 AWS IoT Core 的数据端点[设备通信协议](protocols.md)。设备在请求的标头字段或查询参数（针对基于协议的 HTTP 发布或 MQTT），或者在 MQTT CONNECT 消息的用户名和密码字段（适用于 WebSockets 协议上的 MQTT 和 MQTT）中传递凭证。 WebSockets 

1. AWS IoT Core 检查以下两个条件之一：
   + 传入的请求指定授权方。
   + 接收请求 AWS IoT Core 的数据端点已为其配置了默认授权方。

   如果通过上述任一方式 AWS IoT Core 找到授权方，则 AWS IoT Core 会触发与授权方关联的 Lambda 函数。

1.  （可选）如果您已启用令牌签名，则在触发 Lambda 函数之前，使用存储在授权方中的公钥来 AWS IoT Core 验证请求签名。如果验证失败， AWS IoT Core 将停止请求而不调用 Lambda 函数。  

1. Lambda 函数接收请求中的凭证和连接元数据，并做出身份验证决策。

1. Lambda 函数返回身份验证决策的结果和一份指定连接中允许执行哪些操作的 AWS IoT Core 策略文档。 Lambda 函数还会返回信息，指定通过调用 Lambda 函数 AWS IoT Core 重新验证请求中的证书的频率。

1. AWS IoT Core 根据连接从 Lambda 函数收到的策略评估连接上的活动。

1. 在建立连接并首次调用您的自定义授权方 Lambda 之后，空闲连接上的下一次调用可能会延迟最多 5 分钟，且不执行任何 MQTT 操作。之后，后续调用将遵循您的自定义授权方 Lambda 中的刷新间隔。这种方法可以防止可能超过您的 Lambda 并发限制的过度调用。 AWS 账户

## 扩展注意事项
<a name="custom-authentication-scaling"></a>

 由于 Lambda 函数为您的授权方处理身份验证和授权，因此该函数受 Lambda 定价和服务限制的约束，例如并发执行率。有关 Lambda 定价的更多信息，请参阅 [Lambda 定价](https://aws.amazon.com/lambda/pricing/)。您可以通过调整 Lambda 函数响应中的 `refreshAfterInSeconds` 和 `disconnectAfterInSeconds` 参数管理您 Lambda 函数上的有效载荷。有关 Lambda 函数响应内容的更多信息，请参阅 [定义您的 Lambda 函数](custom-auth-lambda.md)。

**注意**  
如果启用签名，则可以防止无法识别的客户端过度触发 Lambda。在禁用授权方的签名之前，请考虑这一点。

**注意**  
自定义授权方的 Lambda 函数超时限制为 5 秒。

# 创建和管理自定义授权方（CLI）
<a name="config-custom-auth"></a>

AWS IoT Core 使用自定义授权方实现自定义身份验证和授权方案。自定义授权者是一种 AWS IoT Core 资源，可让您灵活地根据自己的特定要求定义和实施规则和策略。要使用 step-by-step说明创建自定义授权方，请参阅[教程：为创建自定义授权方](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html)。 AWS IoT Core

各授权方均包括以下组件：
+  *名称*：用户定义的唯一字符串，用于标识授权方。
+  *Lambda 函数 ARN*：Lambda 函数的 Amazon 资源名称（ARN），用于实现授权和身份验证逻辑。  
+  *令牌密钥名称*：用于从 HTTP 标头、查询参数或 MQTT CONNECT 用户名中提取令牌以执行签名验证的键名称。如果在授权方中启用了签名，则需要此值。
+  *签名禁用标志（可选）*：指定是否禁用凭证签名要求的布尔值。这对于签名凭证没有意义的情况非常有用，例如使用 MQTT 用户名和密码的身份验证方案。默认值为 `false`，因此默认情况下签名将处于启用状态。
+  *令牌签名公有密钥*： AWS IoT Core 用于验证令牌签名的公有密钥。其最小长度为 2048 位。如果在授权方中启用了签名，则需要此值。  

Lambda 将根据 Lambda 函数的运行次数以及函数中代码执行所需的时间向您收取费用。有关 Lambda 定价的更多信息，请参阅 [Lambda 定价](https://aws.amazon.com/lambda/pricing/)。有关创建 Lambda 函数的更多信息，请参阅 [Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/)。

**注意**  
如果启用签名，则可以防止无法识别的客户端过度触发 Lambda。在禁用授权方的签名之前，请考虑这一点。

**注意**  
自定义授权方的 Lambda 函数超时限制为 5 秒。

**Topics**
+ [定义您的 Lambda 函数](custom-auth-lambda.md)
+ [创建授权方](custom-auth-create-authorizer.md)
+ [授权调用您 AWS IoT 的 Lambda 函数](custom-auth-authorize.md)
+ [测试授权方](custom-auth-testing.md)
+ [管理自定义授权方](custom-auth-manage.md)

# 定义您的 Lambda 函数
<a name="custom-auth-lambda"></a>

 当 AWS IoT Core 调用您的授权方时，它会使用包含以下 JSON 对象的事件触发与授权方关联的 Lambda。示例 JSON 对象包含所有可能的字段。不包括与连接请求无关的任何字段。

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 Lambda 函数应使用此信息对传入连接进行身份验证，并决定允许在连接中执行哪些操作。函数应发送包含以下值的响应。
+  `isAuthenticated`：一个布尔值，指示是否已对请求进行身份验证。
+  `principalId`：字母数字字符串，它充当自定义授权请求发送的令牌的标识符。该值必须是包含至少一个字符且不超过 128 个字符的字母数字字符串，并与此正则表达式（正则表达式）模式匹配：`([a-zA-Z0-9]){1,128}`。不允许在 in `principalId` 中 AWS IoT Core使用非字母数字的特殊字符。如果允许使用非字母数字特殊字符，请参阅其他 AWS 服务的文档。`principalId`
+  `policyDocuments`：JSON 格式的 AWS IoT Core 策略文档列表有关创建 AWS IoT Core 策略的更多信息，请参阅。[AWS IoT Core 政策](iot-policies.md)策略文档的数量最多为 10 个。每个策略文档最多可以包含 2048 个字符。
+  `disconnectAfterInSeconds`：指定与 AWS IoT Core 网关的连接的最大持续时间（以秒为单位）的整数。最小值为 300 秒，最大值为 86400 秒。默认值是 86,400。
**注意**  
`disconnectAfterInSeconds` 的值（由 Lambda 函数返回）在建立连接时设置。在后续策略刷新 Lambda 调用过程中，将无法修改此值。
+  `refreshAfterInSeconds`：指定策略刷新之间间隔的整数。当此时间间隔过去时， AWS IoT Core 将调用 Lambda 函数以允许策略刷新。最小值为 300 秒，最大值为 86400 秒。

  以下 JSON 对象包含 Lambda 函数可以发送的响应示例。

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 该`policyDocument`值必须包含有效的 AWS IoT Core 策略文档。有关 AWS IoT Core 策略的更多信息，请参阅[AWS IoT Core 政策](iot-policies.md)。 在 TLS 上的 MQTT 和通过 WebSockets连接的 MQ AWS IoT Core TT 中，在字段值中指定的间隔内缓存此策略。`refreshAfterInSeconds`在 HTTP 连接的情况下，每个授权请求都会调用 Lambda 函数，除非您的设备使用 HTTP 持久连接（也称为 HTTP 保持活动状态或 HTTP 连接重用），否则您可以在配置授权方时选择启用缓存。在此间隔内， AWS IoT Core 授权在已建立的连接中针对此缓存策略执行操作，而无需再次触发您的 Lambda 函数。如果在自定义身份验证期间出现故障，则 AWS IoT Core 终止连接。 AWS IoT Core 如果连接的打开时间超过`disconnectAfterInSeconds`参数中指定的值，也会终止该连接。

 以下内容 JavaScript 包含一个 Node.js Lambda 函数示例，该函数在 MQTT Connect 消息中查找值为`test`的密码，并返回一个策略，该策略授予使用`myClientName`名为的客户端进行连接 AWS IoT Core 并发布到包含相同客户端名称的主题的权限。如果未找到预期密码，则返回拒绝这两个操作的策略。

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 上述 Lambda 函数在收到 MQTT Connect 消息中的预期密码 `test` 时返回以下 JSON。`password` 和 `principalId` 属性的值将是来自 MQTT Connect 消息的值。

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# 创建授权方
<a name="custom-auth-create-authorizer"></a>

 您可以使用 [CreateAuthorizerAP](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) I 创建授权方。 以下示例描述了该命令。

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

您可以使用 `signing-disabled` 参数选择退出适用于授权方的每次调用的签名验证。除有必要，否则我们强烈建议您不要禁用签名。签名验证可防止来自未知设备的 Lambda 函数过多调用。您无法在创建授权方后更新其 `signing-disabled` 状态。要更改此行为，您必须创建 `signing-disabled` 参数具有不同值的其它自定义授权方。

如果您已禁用签名，则 `tokenKeyName` 和 `tokenSigningPublicKeys` 参数的值是可选的。如果启用了签名，则它们是必需的值。

创建 Lambda 函数和自定义授权方后，必须明确授予 AWS IoT Core 服务权限才能代表您调用该函数。 您可以使用以下命令执行此操作。

**注意**  
默认的物联网端点可能不支持将自定义授权方与 Lambda 函数一起使用。相反，您可以使用域配置来定义新端点，然后为该自定义授权方指定该端点。

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# 授权调用您 AWS IoT 的 Lambda 函数
<a name="custom-auth-authorize"></a>

在本节中，您将为您刚创建的自定义授权方资源授予运行 Lambda 函数的权限。要授予权限，您可以使用 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 命令。

**使用授予您的 Lambda 函数的权限 AWS CLI**

1. 插入您的值后，输入以下命令。请注意，`statement-id` 值必须唯一。将 `Id-1234` 替换为您的确切值，否则，可能会出现 `ResourceConflictException` 错误。

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. 如果命令成功，则返回一个权限语句，如本示例。您可以继续到下一部分来测试自定义授权方。

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   如果命令不成功，则返回错误，如本示例。在继续操作之前，您需要查看并更正错误。

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# 测试授权方
<a name="custom-auth-testing"></a>

 您可以使用 [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API 来测试授权方的调用和返回值。 此 API 使您能够在授权方中指定协议元数据并测试签名验证。

以下选项卡显示了如何使用 AWS CLI 来测试您的授权者。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

`token-signature` 参数的值是签名令牌。要了解如何获取此值，请参阅 [签名令牌](custom-auth.md#custom-auth-token-signature)。

如果您的授权方使用了用户名和密码，您可以使用 `--mqtt-context` 参数传递此信息。以下选项卡显示如何使用 `TestInvokeAuthorizer` API 将包含用户名、密码和客户端名称的 JSON 对象发送到您的自定义授权方。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

密码必须采用 base64 编码。以下示例说明如何在类 Unix 的环境中对密码进行编码。

```
echo -n PASSWORD | base64
```

# 管理自定义授权方
<a name="custom-auth-manage"></a>

 您可以使用以下 APIs方法来管理您的授权者。
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): 显示您账户中的所有授权人。
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)：显示指定授权者的属性。这些值包括创建日期、上次修改日期和其它属性。
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html)：为您的 AWS IoT Core 数据端点指定默认授权方。 AWS IoT Core 如果设备未通过 AWS IoT Core 凭证且未指定授权方，则使用此授权方。有关使用 AWS IoT Core 证书的更多信息，请参阅[客户端身份验证](client-authentication.md)。
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html)：更改指定授权方的状态、令牌密钥名称或公钥。
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html)：删除指定的授权者。

**注意**  
 您无法更新授权方的签名要求。这意味着您无法禁用需要签名的现有授权方的中签名。您也不能在不需要签名的现有授权方中要求签名。

# 使用 X.509 客户端证书进行自定义身份验证
<a name="custom-auth-509cert"></a>

将设备连接到时 AWS IoT Core，您有多种[身份验证类型](protocols.md#connection-protocol-auth-mode)可用。您可以使用可用于对客户端和设备连接进行身份验证的 [X.509 客户端证书](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)，也可以定义[自定义授权方](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)来管理自己的客户端身份验证和授权逻辑。本主题介绍如何使用 X.509 客户端证书进行自定义身份验证。

如果您已经使用 X.509 证书对设备进行了身份验证，并且想要执行额外的验证和自定义授权，则使用 X.509 证书进行自定义身份验证会很有帮助。例如，如果您将设备的数据（例如序列号）存储在 X.509 客户端证书中，则在对 X.509 客户端证书 AWS IoT Core 进行身份验证后，您可以使用自定义授权方根据证书字段中存储的信息来识别特定设备。 CommonName 将自定义身份验证与 X.509 证书配合使用可以增强设备在连接设备时的安全管理，并为管理身份验证 AWS IoT Core 和授权逻辑提供更大的灵活性。 AWS IoT Core [https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)有关 AWS IoT Core 设备端点支持的身份验证类型和应用程序协议的更多信息，请参阅[设备通信协议](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)。

**注意**  
各区域不支持使用 X.509 客户端证书进行自定义身份验证。 AWS GovCloud (US) 

**重要**  
您必须使用通过[域配置](iot-custom-endpoints-configurable.md)创建的端点。此外，客户端在连接到时必须提供[服务器名称指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 扩展名。 AWS IoT Core

**Topics**
+ [第 1 步：使用注册您的 X.509 客户端证书 AWS IoT Core](#custom-auth-509cert-client)
+ [第 2 步：创建 Lambda 函数](#custom-auth-509cert-lambda)
+ [步骤 3：创建自定义授权方](#custom-auth-509cert-authorizer)
+ [步骤 4：在域配置中设置身份验证类型和应用程序协议](#custom-auth-509cert-domainconfig)

## 第 1 步：使用注册您的 X.509 客户端证书 AWS IoT Core
<a name="custom-auth-509cert-client"></a>

如果您尚未执行此操作，请使用注册并激活您的 [X.509 客户端证书](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)。 AWS IoT Core否则，请跳到下一步。

要使用注册和激活您的客户端证书 AWS IoT Core，请按照以下步骤操作：

1. 如果您[直接使用创建客户证书 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。这些客户证书将自动向注册 AWS IoT Core。

1. 如果您[创建自己的客户证书](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，请按照[以下说明进行注册 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)。

1. 要激活您的客户端证书，请按照[以下说明](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)进行操作。

## 第 2 步：创建 Lambda 函数
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core 使用自定义授权方来实现自定义身份验证和授权方案。自定义授权方与 Lambda 函数相关联，该函数确定设备是否经过身份验证以及允许该设备执行哪些操作。当设备连接到时，会 AWS IoT Core 检索授权方详细信息 AWS IoT Core，包括授权方名称和关联的 Lambda 函数，并调用 Lambda 函数。Lambda 函数会收到一个事件，其中包含一个 JSON 对象以及设备的 X.509 客户端证书数据。您的 Lambda 函数使用此事件 JSON 对象来评估身份验证请求、决定要采取的操作并发回响应。

### Lambda 函数事件示例
<a name="custom-auth-509cert-event"></a>

以下示例 JSON 对象包含可以包含的所有可能字段。实际的 JSON 对象将仅包含与特定连接请求相关的字段。

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
一个布尔值，用于指示在调用授权方的 Lambda 函数之前是否验证了在授权方配置的令牌签名。如果授权方配置为禁用令牌签名，则此字段将为 false。

`protocols`  
包含请求预期协议的数组。

`protocolData`  
包含连接中所使用的协议信息的对象。它提供了特定于协议的详细信息，对于身份验证、授权等非常有用。  
`tls` - 此对象包含与 TLS（传输层安全性）协议相关的信息。  
+ `serverName` - [服务器名称指示（SNI）](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)主机名字符串。 AWS IoT Core 要求设备将 [SNI 扩展](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)发送到传输层安全性（TLS）协议，并在 `host_name` 字段中提供完整的端点地址。
+ `x509CertificatePem` - PEM 格式的 X.509 证书，用于在 TLS 连接中进行客户端身份验证。
+ `principalId` - 在 TLS 连接中与客户端关联的主体标识符。
`mqtt` - 此对象保存与 MQTT 协议相关的信息。  
+ `clientId` - 只有在设备发送该值的事件中才需要包含的一个字符串。
+ `username` - MQTT Connect 数据包中提供的用户名。
+ `password` - MQTT Connect 数据包中提供的密码。

`connectionMetadata`  
连接的元数据。  
`id` - 连接 ID，可用于日志记录和故障排除。

**注意**  
在本事件 JSON 对象中，`x509CertificatePem` 和 `principalId` 是请求中的两个新字段。`principalId` 的值与 `certificateId` 的值相同。有关更多信息，请参阅[证书](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html)。

### Lambda 函数响应示例
<a name="custom-auth-509cert-response"></a>

Lambda 函数应使用来自事件 JSON 对象的信息，对传入连接进行身份验证，并决定允许在连接中执行哪些操作。

以下 JSON 对象包含 Lambda 函数可以发送的响应示例。

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

在本示例中，该函数应发送包含以下值的响应。

`isAuthenticated`  
一个布尔值，指示是否已对请求进行身份验证。

`principalId`  
一个字母数字字符串，它充当自定义授权请求发送的令牌的标识符。该值必须是包含至少一个字符且不超过 128 个字符的字母数字字符串。它在日志中标识连接。`principalId` 的值必须与事件 JSON 对象中的 `principalId` 的值相同（即 X.509 证书的 certificateId）。

`policyDocuments`  
JSON 格式的 AWS IoT Core 策略文件列表。该值是可选的，支持[事物策略变量](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html)和[证书策略变量](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)。策略文档的数量最多为 10 个。每个策略文档最多可以包含 2048 个字符。如果您的客户端证书和 Lambda 函数附加了多个策略，则该权限是所有策略的集合。有关创建 AWS IoT Core 策略的更多信息，请参阅[策略](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)。

`disconnectAfterInSeconds`  
一个整数，它指定 AWS IoT Core 网关连接的最大持续时间（以秒为单位）。最小值为 300 秒，最大值为 86400 秒。`disconnectAfterInSeconds` 在连接的生命周期内有效，连续刷新策略时不会刷新。

`refreshAfterInSeconds`  
指定策略刷新之间间隔的整数。此间隔过后， AWS IoT Core 调用 Lambda 函数以允许刷新策略。最小值为 300 秒，最大值为 86400 秒。

### 示例 Lambda 函数
<a name="custom-auth-509cert-js-example"></a>

下面是一个 Node.js Lambda 函数示例。该函数检查客户端的 X.509 证书并提取相关信息，例如序列号、指纹和主题名称。如果提取的信息与预期值相匹配，则授予客户端连接访问权限。此机制可确保只有拥有有效证书的授权客户端才能建立连接。

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

上述 Lambda 函数在收到包含预期序列号、指纹和主题的证书时返回以下 JSON。`x509CertificatePem` 的值将是 TLS 握手中提供的客户端证书。有关更多信息，请参阅[定义 Lambda 函数](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda)。

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## 步骤 3：创建自定义授权方
<a name="custom-auth-509cert-authorizer"></a>

[定义 Lambda 函数](#custom-auth-509cert-lambda)后，创建自定义授权方来管理您自己的客户端身份验证和授权逻辑。您可以按照[步骤 3：创建客户授权方资源及其授权](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer)中的详细说明进行操作。有关更多信息，请参阅[创建授权方](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)。

在创建自定义授权方的过程中，您必须授予 AWS IoT 在创建 Lambda 函数后调用该函数的权限。有关详细说明，请参阅[授权 AWS IoT 调用 Lambda](custom-auth-authorize.md) 函数。

## 步骤 4：在域配置中设置身份验证类型和应用程序协议
<a name="custom-auth-509cert-domainconfig"></a>

要结合 X.509 客户端证书使用自定义身份验证对设备进行身份验证，必须在域配置中设置身份验证类型和应用程序协议，并且必须发送 SNI 扩展。`authenticationType` 的值必须为 `CUSTOM_AUTH_X509`，`applicationProtocol` 的值可以是 `SECURE_MQTT` 或 `HTTPS`。

### 在域配置中设置身份验证类型和应用程序协议（CLI）
<a name="custom-auth-509cert-cli"></a>

如果您没有域配置，请使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) 命令创建一个。`authenticationType` 的值必须为 `CUSTOM_AUTH_X509`，`applicationProtocol` 的值可以是 `SECURE_MQTT` 或 `HTTPS`。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

如果您已经有域配置，请根据需要使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) 命令更新 `authenticationType` 和 `applicationProtocol`。请注意，您不能更改默认端点 (`iot:Data-ATS`) 上的身份验证类型或协议。

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
域配置的名称。

`authentication-type`  
域配置的身份验证类型。有关更多信息，请参阅[选择身份验证类型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
设备用来与 AWS IoT Core进行通信的应用程序协议。有关更多信息，请参阅[选择应用程序协议](protocols.md#protocol-selection)。

`--authorizer-config`  
指定域配置中的授权方配置的对象。

`defaultAuthorizerName`  
域配置的授权方的名称。

有关更多信息，请参阅 *AWS IoT API 参考[UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)*中的[CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)和。有关域配置的更多信息，请参阅[域配置](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# 使用自定义身份验证 AWS IoT Core 进行连接
<a name="custom-auth"></a>

 设备可以通过自定义身份验证与任何 AWS IoT Core 支持设备消息传递的协议进行连接。 AWS IoT Core 有关受支持的通信协议的更多信息，请参阅 [设备通信协议](protocols.md)。  您传递给授权方 Lambda 函数的连接数据取决于您使用的协议。有关创建授权方 Lambda 函数的更多信息，请参阅 [定义您的 Lambda 函数](custom-auth-lambda.md)。以下部分说明如何使用每个支持的协议连接到身份验证。

## HTTPS
<a name="custom-auth-http"></a>

使用 [HTTP 发布 API 向 AWS IoT Core 其发送数据的设备可以在其 HTTP P](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) OST 请求中通过请求标头或查询参数传递凭证。设备可以使用 `x-amz-customauthorizer-name` 标头或查询参数指定要调用的授权方。如果您在授权方中启用了令牌签名，则必须使用请求标头或查询参数传递 `token-key-name` 和 `x-amz-customauthorizer-signature`。请注意，在`token-signature`浏览器中使用 JavaScript 该值时必须经过网址编码。

**注意**  
HTTPS 协议的客户授权方仅支持发布操作。有关 HTTPS 协议的更多信息，请参阅[设备通信协议](protocols.md)。

以下示例请求显示了如何使用请求标头和查询参数传递这些参数。

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 使用 MQTT 连接连接的设备可以通过 MQTT 消息的`username`和`password`字段传递凭证。 AWS IoT Core `username` 值也可以选择将其他值（包括令牌、签名和授权方名称）传递给授权方的查询字符串包含在内。如果要使用基于令牌的身份验证方案而不是 `username` 和 `password` 值，则可以使用此查询字符串。  

**注意**  
 密码字段中的数据由 base64 编码。 AWS IoT Core您的 Lambda 函数必须对其进行解码。

 以下示例包含一个 `username` 字符串，其中带有指定令牌和签名的额外参数。  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

要调用授权方，使用 MQTT 和自定义身份验证连接的设备必须 AWS IoT Core 通过端口 443 进行连接。它们还必须通过应用层协议协商 (ALPN) TLS 扩展（值为）`mqtt`和服务器名称指示 (SNI) 扩展名及其 AWS IoT Core 数据端点的主机名。为避免潜在的错误，`x-amz-customauthorizer-signature` 的值应采用 URL 编码。我们还强烈建议 `x-amz-customauthorizer-name` 和 `token-key-name` 的值采用 URL 编码。有关这些值的更多信息，请参阅 [设备通信协议](protocols.md)。V2 [AWS IoT Device SDK、Mobile SDK 和 AWS IoT Device Client](iot-sdks.md) 可以配置这两个扩展。 

## MQTT 结束了 WebSockets
<a name="custom-auth-websockets"></a>

 使用 MQTT 连接的设备 WebSockets 可以通过以下两种方式之一传递证书。 AWS IoT Core 
+ 通过 HTTP UPGRADE 请求中的请求标头或查询参数来建立 WebSockets 连接。
+ 通过 `username` 和 `password` 字段中的 MQTT CONNECT 消息。

 如果您通过 MQTT 连接消息传递凭证，则需要使用 ALPN 和 SNI TLS 扩展。有关这些扩展的更多信息，请参阅 [MQTT](#custom-auth-mqtt)。以下示例演示如何通过 HTTP Upgrade 请求传递凭证。

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## 签名令牌
<a name="custom-auth-token-signature"></a>

必须使用 `create-authorizer` 调用中用到的公私密钥对的私有秘钥签署令牌。以下示例说明如何使用类似 Unix 的命令创建令牌签名和。 JavaScript它们使用 SHA-256 哈希算法对签名进行编码。

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# 授权方故障排除
<a name="custom-auth-troubleshooting"></a>

 本主题介绍可能导致自定义身份验证工作流中出现故障的常见问题以及解决这些问题的步骤。要最有效地解决问题，请启用 CloudWatch 日志 AWS IoT Core 并将日志级别设置为 **DEBUG**。您可以在 AWS IoT Core 控制台中启用 CloudWatch 日志（[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)）。有关启用和配置适用于 AWS IoT Core的日志的更多信息，请参阅 [配置 AWS IoT 日志](configure-logging.md)。

**注意**  
如果您将日志级别长时间保持在 **DEBUG**，则 CloudWatch 可能会存储大量的日志数据。这可能会增加您的 CloudWatch 费用。考虑使用基于资源的日志记录来增加仅针对特定事物组中设备的详细程度。有关基于资源的日志记录的更多信息，请参阅 [配置 AWS IoT 日志](configure-logging.md)。此外，当您完成故障排除时，将日志级别降到详细程度较低的级别。

在您开始故障排除之前，请查看 [了解自定义身份验证工作流](custom-authorizer.md) 获取自定义身份验证过程的高度概要视图。这有助于您了解应该在何处查找问题的根源。

本主题将讨论以下两个方面供您调查。
+ 与授权方 Lambda 函数相关的问题。
+ 与您的设备相关的问题。

## 检查授权方的 Lambda 函数中是否存在问题
<a name="custom-auth-troubleshooting-lambda"></a>

执行以下步骤以确保设备的连接尝试正在调用 Lambda 函数。

1. 验证哪个 Lambda 函数与您的授权方相关联。

   您可以通过调用 [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API 或在 AWS IoT Core 控制台的 “**安全**” 部分中单击所需的授权者来执行此操作。

1. 检查 Lambda 函数的调用指标。为此，请执行以下步骤。

   1. 打开 AWS Lambda 控制台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))，然后选择与您的授权方关联的功能。

   1. 选择**监控**选项卡并查看与您的问题相关的时间范围的指标。

1. 如果您没有看到任何调用，请验证是否 AWS IoT Core 有权调用您的 Lambda 函数。如果您看到调用，则跳到下一步。执行以下步骤以验证 Lambda 函数是否具有所需的权限。

   1. 在 AWS Lambda 控制台中为您的函数选择 “**权限**” 选项卡。

   1. 在页面底部找到**基于资源的策略**部分。如果您的 Lambda 函数具有所需的权限，则策略类似于以下示例。  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. 此政策将您的职能`InvokeFunction`权限授予 AWS IoT Core 委托人。如果您没有看到它，则必须使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API 进行添加。以下示例说明如何使用 AWS CLI执行此操作。

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 如果您看到调用，请验证没有错误。错误可能表明 Lambda 函数未正确处理 AWS IoT Core 发送给它的连接事件。

   有关在 Lambda 函数中处理事件的信息，请参阅 [定义您的 Lambda 函数](custom-auth-lambda.md)。您可以使用 AWS Lambda 控制台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) 中的测试功能对函数中的测试值进行硬编码，以确保该函数正确处理事件。

1. 如果您看到没有错误的调用，但您的设备无法连接（或发布、订阅和接收消息），则问题可能是 Lambda 函数返回的策略未授予设备尝试执行的操作的权限。执行以下步骤以确定函数返回的策略是否存在任何问题。

   1. 使用 Amazon CloudWatch Logs Insights 查询在短时间内扫描日志，以检查是否存在故障。以下示例查询按时间戳对事件进行排序并查找失败。

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. 更新您的 Lambda 函数以记录它返回的数据 AWS IoT Core 以及触发该函数的事件。您可以使用这些日志检查函数创建的策略。

1. 如果您看到调用并没有错误，但您的设备无法连接（或发布、订阅和接收消息），则另一个原因可能是 Lambda 函数超出了超时限制。自定义授权方的 Lambda 函数超时限制为 5 秒。您可以在 CloudWatch 日志或指标中查看函数持续时间。

## 调查设备问题
<a name="custom-auth-troubleshooting-investigate"></a>

如果您发现调用 Lambda 函数或函数返回的策略不存在任何问题，请查找设备连接尝试是否存在问题。格式错误的连接请求可能导致 AWS IoT Core 无法触发您的授权者。TLS 层和应用程序层均可能出现连接问题。

**TLS 层可能存在的问题：**
+ 客户必须在所有自定义身份验证请求中传递主机名标头（HTTP、MQTT WebSockets）或服务器名称指示 TLS 扩展（HTTP、MQTT over WebSockets、MQTT）。在这两种情况下，传递的值都必须与您账户 AWS IoT Core 的数据端点之一匹配。这些是执行以下 CLI 命令时返回的端点。
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`（适用于旧版 VeriSign 终端节点）
+ 在 MQTT 连接中使用自定义身份验证的设备还必须发送应用程序层协议协商（ALPN）TLS 扩展，并具有值 `mqtt`。
+ 自定义身份验证当前仅在端口 443 上可用。

**应用层可能存在的问题：**
+ 如果启用了签名（`signingDisabled` 字段在您的授权方为 false），请查找以下签名问题。
  + 请确保使用 `x-amz-customauthorizer-signature` 标头或查询字符串参数传递令牌签名。
  + 确保服务没有签署令牌以外的值。
  + 请确保使用您在授权方的 `token-key-name` 字段中指定的标头或查询参数中传递令牌。
+ 请确保您使用 `x-amz-customauthorizer-name` 标头或查询字符串参数传递的授权方名称是有效的，或者您已为您的账户定义了默认授权方。

# Authorization
<a name="iot-authorization"></a>

授权是向经过身份验证的身份授予权限的过程。您授予 AWS IoT Core 使用 AWS IoT Core 和 IAM 策略的权限。本主题介绍了 AWS IoT Core 策略。有关 IAM 策略的更多信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md) 和 [如何 AWS IoT 与 IAM 配合使用](security_iam_service-with-iam.md)。

AWS IoT Core 策略决定了经过身份验证的身份可以做什么。经身份验证的身份由设备、移动应用程序、Web 应用程序和桌面应用程序使用。经过身份验证的身份甚至可以是用户键入 AWS IoT Core CLI 命令。只有当身份拥有向其授予 AWS IoT Core 操作权限的策略时，该身份才能执行这些操作。

 AWS IoT Core 策略和 IAM 策略均 AWS IoT Core 用于控制身份（也称为*委托人*）可以执行的操作。您使用的策略类型取决于您用来进行身份验证的身份类型 AWS IoT Core。

AWS IoT Core 操作分为两组：
+ 控制面板 API 允许您执行诸如创建或更新证书、事物、规则等管理任务。
+ 数据平面 API 允许您向数据发送和接收数据 AWS IoT Core。

您使用的策略类型取决于您使用的是控制面板 API 还是数据面板 API。

下表显示了身份类型、它们使用的协议和可用于授权的策略类型。


**AWS IoT Core 数据平面 API 和策略类型**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/iot-authorization.html)


**AWS IoT Core 控制平面 API 和策略类型**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/iot-authorization.html)

AWS IoT Core 策略附加到 X.509 证书、Amazon Cognito 身份或事物组。IAM 策略附加到 IAM 用户、组或角色。如果您使用 AWS IoT 控制台或 AWS IoT Core CLI 附加策略（到证书、Amazon Cognito Identity 或事物组），则 AWS IoT Core 使用策略。否则，您将使用 IAM 策略。 AWS IoT Core 附加到事物组的策略适用于该事物组中的任何事物。要使 AWS IoT Core 策略生效，`clientId`和事物名称必须匹配。

基于策略的授权功能强大。它使您能够完全控制设备、用户或应用程序可在 AWS IoT Core中执行的操作。例如，假设使用证书连接 AWS IoT Core 的设备。您可以允许设备访问所有 MQTT 主题，也可以限制它的访问权限，只允许它访问一个主题。再举一例，假设用户在命令行中键入 CLI 命令。通过使用策略，您可以允许或拒绝用户访问任何命令或 AWS IoT Core 资源。此外，您还可以控制应用程序对 AWS IoT Core 资源的访问。

对策略所做的更改可能需要几分钟才能生效，具体取决于 AWS IoT 缓存策略文档的方式。也就是说，访问最近被授予访问权限的资源可能需要几分钟时间，并且资源可能在撤销访问权限后几分钟内仍可访问。

## AWS 培训和认证
<a name="iot-authorization-training"></a>

有关授权的信息 AWS IoT Core，请参加 AWS 培训和认证网站上的 “[深入了解 AWS IoT Core 身份验证和授权](https://www.aws.training/Details/Curriculum?id=42335)” 课程。

# AWS IoT Core 政策
<a name="iot-policies"></a>

AWS IoT Core 策略是 JSON 文档。它们遵循与 IAM 策略相同的惯例。 AWS IoT Core 支持命名策略，因此许多身份可以引用同一个策略文档。命名策略采用版本化，以便可以轻松回滚。

AWS IoT Core 策略允许您控制对 AWS IoT Core 数据平面的访问。 AWS IoT Core 数据面板由以下操作组成，允许您连接到 AWS IoT Core 消息代理，发送和接收 MQTT 消息以及获取或更新事物的 Device Shadow。

 AWS IoT Core 策略是包含一个或多个政策声明的 JSON 文档。每个语句包含：
+ `Effect`，指定是允许还是拒绝该操作。
+ `Action`，用于指定策略允许或拒绝的操作。
+ `Resource`，用于指定允许或拒绝对其执行操作的资源。

由于策略文档的 AWS IoT 缓存方式不同，对策略所做的更改可能需要 6 到 8 分钟才能生效。也就是说，访问最近被授予访问权限的资源可能需要几分钟时间，并且资源可能在撤销访问权限后几分钟内仍可访问。

AWS IoT Core 策略可以附加到 X.509 证书、Amazon Cognito 身份和事物组。附加到事物组的策略适用于该组中的任何事物。要使策略生效，`clientId` 和事物名称必须匹配。 AWS IoT Core 策略遵循与 IAM 策略相同的策略评估逻辑。默认情况下，所有策略都被隐式拒绝。任何基于身份或基于资源的策略中的显式允许将覆盖此默认行为。任何策略中的显式拒绝将覆盖任何允许。有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)。

**Topics**
+ [AWS IoT Core 政策行动](iot-policy-actions.md)
+ [AWS IoT Core 动作资源](iot-action-resources.md)
+ [AWS IoT Core 策略变量](iot-policy-variables.md)
+ [防止跨服务混淆座席](cross-service-confused-deputy-prevention.md)
+ [AWS IoT Core 策略示例](example-iot-policies.md)
+ [使用 Amazon Cognito Identity 的授权](cog-iot-policies.md)

# AWS IoT Core 政策行动
<a name="iot-policy-actions"></a>

 AWS IoT Core定义了以下策略操作：MQTT 策略操作

`iot:Connect`  
表示连接到 AWS IoT Core 消息代理的权限。每次向代理发送 `iot:Connect` 请求时，均检查 `CONNECT` 权限。消息代理禁止两个具有相同 ID 的客户端同时保持连接状态。在第二个客户端连接后，代理将关闭现有连接。`iot:Connect` 权限可用来确保仅使用特定客户端 ID 的授权客户端可以连接。

`iot:DeleteConnection`  
表示从 AWS IoT Core断开连接的 MQTT 客户端的权限。每次请求强制断开客户端连接时，都会检查 `iot:DeleteConnection` 权限。断开客户端连接时， AWS IoT Core 会关闭客户端的网络连接，并可选择清除会话状态。

`iot:GetRetainedMessage`  
代表获取保留单条消息内容的权限。保留的消息是在设置了 RETAIN 标志的情况下发布并由存储的消息 AWS IoT Core。有关获取账户所有保留消息列表的权限，请参阅 [iot:ListRetainedMessages](#action_listretainedmessages)。

`iot:ListRetainedMessages`  
表示检索有关帐户保留邮件的摘要信息（而不是邮件内容）的权限。保留的消息是在设置了 RETAIN 标志的情况下发布并由存储的消息 AWS IoT Core。为此操作指定的资源 ARN 必须为 `*`。有关获取保留单条消息内容的权限，请参阅 [iot:GetRetainedMessage](#action_getretainpublish)。

`iot:Publish`  
代表向 MQTT 主题发布内容的权限。每次向代理发送 PUBLISH 请求时，均检查该权限。您可以使用此权限让客户端发布到特定主题模式。  
要授予 `iot:Publish` 权限，还必须授予 `iot:Connect` 权限。

`iot:Receive`  
表示接收来自的消息的权限 AWS IoT Core。每次向客户端交付消息时，都确认 `iot:Receive` 权限。由于每次交付时都会检查此权限，因此，可以使用它来吊销当前已订阅某个主题的客户端的权限。

`iot:RetainPublish`  
表示使用 RETAIN 标志集发布 MQTT 消息的权限。  
要授予 `iot:RetainPublish` 权限，还必须授予 `iot:Publish` 权限。

`iot:Subscribe`  
代表订阅主题筛选条件的权限。每次向代理发送 SUBSCRIBE 请求时，均检查该权限。用此权限让客户端可以订阅与特定主题模式相符的主题。  
要授予 `iot:Subscribe` 权限，还必须授予 `iot:Connect` 权限。Device Shadow 策略操作

`iot:DeleteThingShadow`  
表示删除事物的 Device Shadow 的权限。每次提出请求删除事物的 Device Shadow 内容时，都会检查 `iot:DeleteThingShadow` 权限。

`iot:GetThingShadow`  
表示检索事物的 Device Shadow 的权限。每次请求检索 Device Shadow 的内容时，都会检查 `iot:GetThingShadow` 权限。

`iot:ListNamedShadowsForThing`  
表示列出名为 Shadows 的事物的权限。每次请求列示名为 Shadows 的事物时，都会检查 `iot:ListNamedShadowsForThing` 权限。

`iot:UpdateThingShadow`  
表示更新设备的影子的权限。每次请求更新事物的 Device Shadow 的内容时，都会检查 `iot:UpdateThingShadow` 权限。

**注意**  
任务执行策略操作仅适用于 HTTP TLS 端点。如果您使用了 MQTT 端点，则必须使用本主题中定义的 MQTT 策略操作。  
有关演示此操作的任务执行策略的示例，请参阅使用 MQTT 协议的 [基本任务策略示例](basic-jobs-example.md)。Job 执行 AWS IoT Core 策略操作

`iotjobsdata:DescribeJobExecution`  
表示为给定事物检索任务执行的权限。每次请求获取任务执行时，都会检查 `iotjobsdata:DescribeJobExecution` 权限。

`iotjobsdata:GetPendingJobExecutions`  
表示一个权限，用于为事物检索未处于最终状态的任务的列表。每次请求检索该列表时，都会检查 `iotjobsdata:GetPendingJobExecutions` 权限。

`iotjobsdata:UpdateJobExecution`  
表示更新任务执行的权限。每次请求更新任务执行的状态时，都会检查 `iotjobsdata:UpdateJobExecution` 权限。

`iotjobsdata:StartNextPendingJobExecution`  
表示一个权限，用于为事物获取和启动下一个待处理任务执行。（即，将状态为 QUEUED 的任务执行更新为状态 IN\$1PROGRESS。） 每次请求启动下一个待处理任务执行，都会检查 `iotjobsdata:StartNextPendingJobExecution` 权限。AWS IoT Core 凭证提供商政策操作

`iot:AssumeRoleWithCertificate`  
表示允许通过基于证书的身份验证调用 AWS IoT Core 凭证提供商来担任 IAM 角色。每次向 AWS IoT Core 凭证提供者提出担任角色的请求时，都会检查`iot:AssumeRoleWithCertificate`权限。

# AWS IoT Core 动作资源
<a name="iot-action-resources"></a>

要为 AWS IoT Core 策略操作指定资源，请使用该资源的 Amazon 资源名称 (ARN)。所有资源都 ARNs 遵循以下格式：

```
arn:partition:iot:region:AWS-account-ID:Resource-type/Resource-name
```

下表列出了要为每种类型的操作指定的资源：ARN 示例适用于账户 ID `123456789012`，在分区 `aws` 中，并且特定于区域 `us-east-1`。有关格式的更多信息 ARNs，请参阅 AWS Identity and Access Management 用户指南[中的 Amazon 资源名称 (ARNs)](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference-arns.html)。


| Action | 资源类型 | 资源名称 | ARN 示例 | 
| --- | --- | --- | --- | 
| iot:Connect | client |  客户端的客户端 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteConnection | client |  客户端的客户端 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteThingShadow | thing |  事物的名称和影子的名称（如适用）  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iotjobsdata:DescribeJobExecution | thing |  事物名称  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iotjobsdata:GetPendingJobExecutions | thing |  事物名称  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:GetRetainedMessage | topic |  保留的消息主题  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iot:GetThingShadow | thing |  事物的名称和影子的名称（如适用）  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:ListNamedShadowsForThing | 全部 | 全部 |  \$1 | 
| iot:ListRetainedMessages | 全部 | 全部 |  \$1 | 
| iot:Publish | topic |  主题字符串  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:Receive | topic |  主题字符串  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:RetainPublish | topic |  用 REATIN 标志集发布的主题  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iotjobsdata:StartNextPendingJobExecution | thing |  事物名称  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:Subscribe | topicfilter | 主题筛选条件字符串 | arn:aws:iot:us-east-1:123456789012:topicfilter/myTopicFilter | 
| iotjobsdata:UpdateJobExecution | thing |  事物名称  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:UpdateThingShadow | thing |  事物的名称和影子的名称（如适用）  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:AssumeRoleWithCertificate | rolealias |  指向角色 ARN 的角色别名  |  arn:aws:iot:us-east-1:123456789012:rolealias/CredentialProviderRole\$1alias | 

# AWS IoT Core 策略变量
<a name="iot-policy-variables"></a>

AWS IoT Core 定义可在`Resource`或`Condition`块中的 AWS IoT Core 策略中使用的策略变量。评估策略时，将使用实际值替换策略变量。例如，如果设备连接到客户端 ID 为 100-234-3456 的 AWS IoT Core 消息代理，则策略文档中的`iot:ClientId`策略变量将被替换为 100-234-3456。

AWS IoT Core 策略可以使用通配符并遵循与 IAM 策略类似的惯例。在字符串中插入 `*`（星号）可以被视为通配符，匹配任何字符。例如，可以使用 `*` 在策略的 `Resource` 属性中描述多个 MQTT 主题名称。字符 `+` 和 `#` 在策略中被视为文字字符串。有关显示如何使用通配符的示例策略，请参阅[在 MQTT 和策略中使用通配符 AWS IoT Core](pub-sub-policy.md#pub-sub-policy-cert)。

还可以使用具有固定值的预定义策略变量来表示字符（这些字符本身有特殊的意义）。这些特殊字符包括 `$(*)`、`$(?)` 和 `$($)`。有关策略变量和特殊字符的更多信息，请参阅 [IAM 策略元素：变量和标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)和[创建具有多个键或值的条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。

**Topics**
+ [基本 AWS IoT Core 策略变量](basic-policy-variables.md)
+ [事物策略变量](thing-policy-variables.md)
+ [X.509 证书策略变量 AWS IoT Core](cert-policy-variables.md)

# 基本 AWS IoT Core 策略变量
<a name="basic-policy-variables"></a>

AWS IoT Core 定义了以下基本策略变量：
+ `aws:SourceIp`：连接到 AWS IoT Core 消息代理的客户端的 IP 地址。
+ `iot:ClientId`：用于连接到 AWS IoT Core 消息代理的客户端 ID。
+ `iot:DomainName`：连接到的客户端的域名 AWS IoT Core。

**Topics**
+ [`ClientId` 和 `SourceIp` 策略变量示例](#basic-policy-variables-example)
+ [`iot:DomainName` 策略变量示例](#basic-policy-variables-example-domain)

## `ClientId` 和 `SourceIp` 策略变量示例
<a name="basic-policy-variables-example"></a>

以下 AWS IoT Core 策略显示了使用策略变量的策略。 `aws:SourceIp`可以在策略的条件元素中使用，以允许委托人仅在特定地址范围内发出 API 请求。有关示例，请参阅 [授权用户和云服务使用 AWS IoT 作业](iam-policy-users-jobs.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "123.45.167.89"
				}
			}
		}
	]
}
```

在这些示例中`${iot:ClientId}`，将替换为评估策略时连接到 AWS IoT Core 消息代理的客户端 ID。使用 `${iot:ClientId}` 等策略变量时，您可能会无意中开放对意外主题的访问权限。例如，如果您使用借助 `${iot:ClientId}` 来指定主题筛选条件的策略：

```
{
	"Effect": "Allow",
	"Action": [
		"iot:Subscribe"
	],
	"Resource": [
		"arn:aws:iot:us-east-1:123456789012:topicfilter/my/${iot:ClientId}/topic"
	]
}
```

客户端可使用 `+` 作为客户端 ID 来进行连接。这样，用户便可以订阅与主题筛选条件 `my/+/topic` 匹配的任何主题。要防范此类安全漏洞，请使用`iot:Connect`策略操作来控制 IDs 可以连接的客户端。例如，此策略仅允许那些客户端 ID 为 `clientid1` 的客户端建立连接：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid"
			]
		}
	]
}
```

**注意**  
不建议将策略变量 `${iot:ClientId}` 与 `Connect` 一起使用。不检查 `ClientId` 的值，因此，具有不同客户端 ID 的附加程序可以通过验证，但会导致连接断开。由于允许任何 `ClientId`，因此设置随机客户端 ID 可以绕过事物组策略。

## `iot:DomainName` 策略变量示例
<a name="basic-policy-variables-example-domain"></a>

您可以添加 `iot:DomainName` 策略变量来限制允许使用哪些域。添加 `iot:DomainName` 策略变量可以让设备仅连接到已配置的特定端点。

以下策略让设备可以连接到指定域。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "AllowConnectionsToSpecifiedDomain",
		"Effect": "Allow",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

以下策略拒绝设备连接到指定域。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "DenyConnectionsToSpecifiedDomain",
		"Effect": "Deny",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

有关策略条件运算符的信息，请参阅 [IAM JSON 策略元素：条件运算符](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)。有关域配置的更多信息，请参阅[什么是域配置？](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# 事物策略变量
<a name="thing-policy-variables"></a>

事物策略变量允许您编写基于事物名称、事物类型和事物属性值等事物属性授予或拒绝权限的 AWS IoT Core 策略。您可以使用事物策略变量来应用相同的策略来控制许多 AWS IoT Core 设备。有关设备预调配的更多信息，请参阅[设备预调配](iot-provision.html)。

如果您使用非独占事物关联，则同一证书可以附加到多个事物。为保持清晰的关联并避免潜在冲突，您必须将客户端 ID 与事物名称匹配。在这种情况下，您可以从事物连接到时发送的 MQTT `Connect` 消息中的客户端 ID 中获取事物名称。 AWS IoT Core

在 AWS IoT Core 策略中使用事物策略变量时，请记住以下事项。
+ 使用 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html)API 将证书或委托人（经过身份验证的 Amazon Cognito 身份）附加到事物。
+ 如果存在非独占事物关联，当您用事物策略变量替换事物名称时，MQTT 连接消息或 TLS 连接中的 `clientId` 值必须与事物名称完全匹配。

可用的事物策略变量如下：
+ `iot:Connection.Thing.ThingName`

  这将解析为正在评估策略的 AWS IoT Core 注册表中事物的名称。 AWS IoT Core 使用设备在进行身份验证时出示的证书来确定使用哪个东西来验证连接。只有当设备通过协议通过 MQTT 或 MQTT 进行连接时，此策略变量才可用。 WebSocket 
+ `iot:Connection.Thing.ThingTypeName`

  它解析为与要评估策略的事物关联的事物类型。MQTT/ WebSocket 连接的客户端 ID 必须与事物名称相同。仅当通过协议通过 MQTT 或 MQTT 进行连接时，此策略变量才可用。 WebSocket
+ `iot:Connection.Thing.Attributes[attributeName]`

  它解析为与要评估策略的事物关联的指定属性的值。事物最多可以具有 50 个属性。每个属性都可用作策略变量：`iot:Connection.Thing.Attributes[attributeName]`其中*attributeName*是属性的名称。 MQTT/WebSocket 连接的客户端 ID 必须与事物名称相同。此策略变量仅在通过 MQTT 或 MQTT 通过协议进行连接时可用。 WebSocket 
+ `iot:Connection.Thing.IsAttached`

  `iot:Connection.Thing.IsAttached: ["true"]`强制规定只有同时在委托人中注册 AWS IoT 并关联到委托人的设备才能访问策略内的权限。 AWS IoT Core 如果设备提供的证书未附加到注册表中的物联网事物，则可以使用此变量来阻止其连接 AWS IoT Core 。此变量具有值`true`，`false`表示连接对象已使用 API 附加到注册表中的证书或 Amazon Cognito 身份。[AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html)事物名称被视为客户端 ID。

如果您的客户端 ID 与事物名称匹配，或者如果您将证书独占附加到事物，则在策略定义中使用策略变量可以简化策略管理。您可以使用事物策略变量定义单个策略，而不是为每个物联网事物创建单独的策略。此策略可以动态应用于所有设备。以下是一个示例策略来说明其工作原理。有关更多信息，请参阅 [将 AWS IoT 事物关联到 MQTT 客户端连接](exclusive-thing.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Condition": {
				"StringLike": {
					"iot:ClientId": "*${iot:Connection.Thing.Attributes[envType]}"
				}
			},
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/*"
		}
	]
}
```

 AWS IoT Core 如果事物的客户端 ID 以其`envType`属性的值结尾，则此策略示例允许它们进行连接。只有具有匹配客户端 ID 模式的事物才被允许连接。

# X.509 证书策略变量 AWS IoT Core
<a name="cert-policy-variables"></a>

X.509 证书策略变量有助于编写策略。 AWS IoT Core 这些策略根据 X.509 证书属性授予权限。以下部分介绍如何使用这些证书策略变量。

**重要**  
如果您的 X.509 证书不包含特定的证书属性，但在策略文档中使用了相应的证书策略变量，则策略评估可能会导致意外行为。

## CertificateId
<a name="cert-policy-variables-certid"></a>

在 [RegisterCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCertificate.html)API 中，`certificateId`显示在响应正文中。要获取有关您的证书的信息，请使用`certificateId`中的[DescribeCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeCertificate.html)。

## 颁发者属性
<a name="issuer-attributes"></a>

以下 AWS IoT Core 策略变量根据证书颁发者设置的证书属性支持允许或拒绝权限。
+ `iot:Certificate.Issuer.DistinguishedNameQualifier`
+ `iot:Certificate.Issuer.Country`
+ `iot:Certificate.Issuer.Organization`
+ `iot:Certificate.Issuer.OrganizationalUnit`
+ `iot:Certificate.Issuer.State`
+ `iot:Certificate.Issuer.CommonName`
+ `iot:Certificate.Issuer.SerialNumber`
+ `iot:Certificate.Issuer.Title`
+ `iot:Certificate.Issuer.Surname`
+ `iot:Certificate.Issuer.GivenName`
+ `iot:Certificate.Issuer.Initials`
+ `iot:Certificate.Issuer.Pseudonym`
+ `iot:Certificate.Issuer.GenerationQualifier` 

## 使用者属性
<a name="subject-attributes"></a>

以下 AWS IoT Core 策略变量支持根据证书颁发者设置的证书主题属性授予或拒绝权限。
+ `iot:Certificate.Subject.DistinguishedNameQualifier`
+ `iot:Certificate.Subject.Country`
+ `iot:Certificate.Subject.Organization`
+ `iot:Certificate.Subject.OrganizationalUnit`
+ `iot:Certificate.Subject.State`
+ `iot:Certificate.Subject.CommonName`
+ `iot:Certificate.Subject.SerialNumber`
+ `iot:Certificate.Subject.Title`
+ `iot:Certificate.Subject.Surname`
+ `iot:Certificate.Subject.GivenName`
+ `iot:Certificate.Subject.Initials`
+ `iot:Certificate.Subject.Pseudonym`
+ `iot:Certificate.Subject.GenerationQualifier` 

X.509 证书为这些属性提供了包含一个或多个值的选项。默认情况下，每个多值属性的策略变量会返回第一个值。例如，`Certificate.Subject.Country` 属性可能包含国家/地区名称列表，但在策略中进行评估时，`iot:Certificate.Subject.Country` 会替换为第一个国家/地区名称。

您可以使用从 1 开始的索引请求第一个值以外的特定属性值。例如，`iot:Certificate.Subject.Country.1` 由 `Certificate.Subject.Country` 属性中第二个国家/地区名称替换。如果您指定不存在的索引值（例如，如果您在只有两个值分配到属性时请求第三个值），则不会执行替换功能，并且授权将失败。您可以在策略变量名称中使用 `.List` 后缀指定属性的所有值。

## 颁发者备用名称属性
<a name="issuer-alternate-name-attributes"></a>

以下 AWS IoT Core 策略变量支持根据证书颁发者设置的颁发者备用名称属性授予或拒绝权限。
+ `iot:Certificate.Issuer.AlternativeName.RFC822Name`
+ `iot:Certificate.Issuer.AlternativeName.DNSName`
+ `iot:Certificate.Issuer.AlternativeName.DirectoryName`
+ `iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Issuer.AlternativeName.IPAddress`

## 使用者备用名称属性
<a name="subject-alternate-name-attributes"></a>

以下 AWS IoT Core 策略变量支持根据证书颁发者设置的主题备用名称属性授予或拒绝权限。
+ `iot:Certificate.Subject.AlternativeName.RFC822Name`
+ `iot:Certificate.Subject.AlternativeName.DNSName`
+ `iot:Certificate.Subject.AlternativeName.DirectoryName`
+ `iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Subject.AlternativeName.IPAddress`

## 其它属性
<a name="other-attributes"></a>

根据证书`iot:Certificate.SerialNumber`的序列号，您可以使用来允许或拒绝对 AWS IoT Core 资源的访问。`iot:Certificate.AvailableKeys` 策略变量包含具有值的所有证书策略变量的名称。

# 使用 X.509 证书策略变量
<a name="use-policy-variables"></a>

本主题提供有关如何使用证书策略变量的详细信息。X.509 证书策略变量对于您根据 X.509 证书属性创建授予权限的 AWS IoT Core 策略至关重要。如果您的 X.509 证书不包含特定的证书属性，但在策略文档中使用了相应的证书策略变量，则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。

**Topics**
+ [X.509 证书示例](#certificate-example)
+ [使用证书颁发者属性作为证书策略变量](#issuer-attributes-policy)
+ [使用证书主题属性作为证书策略变量](#subject-attributes-policy)
+ [使用证书颁发者备用名称属性作为证书策略变量](#issuer-alternate-name-attributes-policy)
+ [使用证书主题备用名称属性作为证书策略变量](#subject-alternate-name-attributes-policy)
+ [使用其他证书属性作为证书策略变量](#other-attributes-policy)
+ [X.509 证书策略变量限制](#policy-limits)
+ [使用证书策略变量的策略示例](#example-attributes-policy)

## X.509 证书示例
<a name="certificate-example"></a>

典型的 X.509 证书可能如下所示。此示例证书包括证书属性。在评估 AWS IoT Core 策略期间，以下证书属性将填充为证书策略变量：`Serial Number`、`Issuer`、`Subject`、`X509v3 Issuer Alternative Name`、和 `X509v3 Subject Alternative Name`。

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            92:12:85:cb:b7:a5:e0:86
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=IoT Devices, OU=SmartHome, ST=WA, CN=IoT Devices Primary CA, 
				GN=Primary CA1/initials=XY/dnQualifier=Example corp,
				SN=SmartHome/ title=CA1/pseudonym=Primary_CA/generationQualifier=2/serialNumber=987		
        Validity
            Not Before: Mar 26 03:25:40 2024 GMT
            Not After : Apr 28 03:25:40 2025 GMT
        Subject: C=US, O=IoT Devices, OU=LightBulb, ST=NY, CN=LightBulb Device Cert, 
				GN=Bulb/initials=ZZ/dnQualifier=Bulb001, 
				SN=Multi Color/title=RGB/pseudonym=RGB Device/generationQualifier=4/serialNumber=123
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    << REDACTED >>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:example.com, IP Address:1.2.3.4, URI:ResourceIdentifier001, email:device1@example.com, DirName:/C=US/O=IoT/OU=SmartHome/CN=LightBulbCert
            X509v3 Issuer Alternative Name: 
                DNS:issuer.com, IP Address:5.6.7.8, URI:PrimarySignerCA, email:primary@issuer.com, DirName:/C=US/O=Issuer/OU=IoT Devices/CN=Primary Issuer CA
    Signature Algorithm: sha256WithRSAEncryption
         << REDACTED >>
```

## 使用证书颁发者属性作为证书策略变量
<a name="issuer-attributes-policy"></a>

下表详细说明了如何在 AWS IoT Core 策略中填充证书颁发者属性。


**要在策略中填充的颁发者属性**  

| 证书颁发者属性 | 证书策略变量 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书主题属性作为证书策略变量
<a name="subject-attributes-policy"></a>

下表详细说明了如何在 AWS IoT Core 策略中填充证书主题属性。


**要在策略中填充的主题属性**  

| 证书主题属性 | 证书策略变量 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书颁发者备用名称属性作为证书策略变量
<a name="issuer-alternate-name-attributes-policy"></a>

下表详细说明了如何在 AWS IoT Core 策略中填充证书颁发者备用名称属性。


**要在策略中填充的颁发者备用名称属性**  

| X509v3 颁发者备用名称 | 策略中的属性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书主题备用名称属性作为证书策略变量
<a name="subject-alternate-name-attributes-policy"></a>

下表详细说明了如何在 AWS IoT Core 策略中填充证书主题备用名称属性。


**要在策略中填充的主题备用名称属性**  

| X509v3 主题备用名称 | 策略中的属性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用其他证书属性作为证书策略变量
<a name="other-attributes-policy"></a>

下表详细介绍了如何在 AWS IoT Core 策略中填充其他证书属性。


**要在策略中填充的其他属性**  

| 其他证书属性 | 证书策略变量 | 
| --- | --- | 
|  `Serial Number: 92:12:85:cb:b7:a5:e0:86`  |  `iot:Certificate.SerialNumber = 10525622389124227206`  | 

## X.509 证书策略变量限制
<a name="policy-limits"></a>

以下限制适用于 X.509 证书策略变量：

缺少的策略变量  
如果您的 X.509 证书不包含特定的证书属性，但在策略文档中使用了相应的证书策略变量，则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。

证书 SerialNumber 格式  
AWS IoT Core 将证书序列号视为十进制整数的字符串表示形式。例如，如果策略只允许使用与证书序列号匹配的客户端 ID 进行连接，则客户端 ID 必须是十进制格式的序列号。

通配符  
如果证书属性中有通配符，则策略变量不会由证书属性值替换。这将会在策略文档中保留 `${policy-variable}` 文本。这可能会导致授权失败。可以使用以下通配符：`*`、`$`、`+`、`?` 和 `#`。

数组字段  
包含数组的证书属性限制为五项。其它的项将被忽略。

字符串长度  
所有字符串值的长度限制为 1024 个字符。如果证书属性包含超过 1024 个字符的字符串，则策略变量不会由证书属性值替换。这将会在策略文档中保留 `${policy-variable}`。这可能会导致授权失败。

特殊字符  
在策略变量中使用时，任何特殊字符（例如 `,`、`"`、`\`、`+`、`=`、`<`、`>` 和 `;`）都必须使用反斜杠 (`\`) 作为前缀。例如，`Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US` 改为 `Amazon Web Service O\=Amazon.com Inc. L\=Seattle ST\=Washington C\=US`。

## 使用证书策略变量的策略示例
<a name="example-attributes-policy"></a>

以下策略文档允许使用与证书序列号匹配的客户端 ID 进行连接，并允许发布到与下列模式匹配的主题：`${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*`。

**重要**  
如果您的 X.509 证书不包含特定的证书属性，但在策略文档中使用了相应的证书策略变量，则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。例如，如果您将以下策略文档附加到不包含 `iot:Certificate.Subject.Organization` 属性的证书，则在策略评估期间将不会填充 `iot:Certificate.Subject.Organization` 证书策略变量。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Certificate.SerialNumber}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*"
			]
		}
	]
}
```

您也可以使用 [Null 条件运算符](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)来确保在策略评估期间填充策略中所用的证书策略变量。以下策略文档仅在存在证书序列号和证书主题公用名属性时才允许在证书中使用 `iot:Connect`。

所有证书策略变量都具有字符串值，因此支持所有[字符串条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/*"
			],
			"Condition": {
				"Null": {
					"iot:Certificate.SerialNumber": "false",
					"iot:Certificate.Subject.CommonName": "false"
				}
			}
		}
	]
}
```

# 防止跨服务混淆座席
<a name="cross-service-confused-deputy-prevention"></a>

*混淆代理问题*是一个安全问题，即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。在中 AWS，跨服务模仿可能会导致混乱的副手问题。一个服务（*呼叫服务*) 调用另一项服务（*所谓的服务*)时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为了防止这种情况， AWS 提供可帮助您保护所有服务的服务委托人数据的工具，这些服务委托人有权限访问账户中的资源。

要限制为资源 AWS IoT 提供其他服务的权限，我们建议在资源策略中使用[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)和[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)全局条件上下文密钥。如果使用两个全局条件上下文键，在同一策略语句中使用时，`aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户必须使用相同的账户 ID。

防止混淆代理问题最有效的方法是使用具有资源完整 Amazon 资源名称（ARN）的 `aws:SourceArn` 全局条件上下文键。对于 AWS IoT，您`aws:SourceArn`必须遵守以下格式：`arn:aws:iot:region:account-id:resource-type/resource-id`资源特定权限或`arn:aws:iot:region:account-id:*`。resource-id 可以是允许资源的名称或 ID，也可以是允许资源的通配符语句。 IDs确保*region*与您的 AWS IoT 地区相匹配，并且与您的客户账户 ID *account-id* 相匹配。

以下示例说明如何通过在 AWS IoT 角色信任策略中使用`aws:SourceArn`和`aws:SourceAccount`全局条件上下文密钥来防止出现混淆的代理问题。有关更多示例，请参阅[混淆代理问题防范详细示例](#cross-service-confused-deputy-prevention-examples)。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:*"
        }
         }
      }
   ]
}
```

**注意**  
如果您遇到拒绝访问错误，可能是因为与 AWS 安全令牌服务（STS）的服务集成不支持 `aws:SourceArn` 和 `aws:SourceAccount` 上下文键。

## 混淆代理问题防范详细示例
<a name="cross-service-confused-deputy-prevention-examples"></a>

**本节提供了详细的示例，说明如何通过在 AWS IoT 角色信任策略中使用`aws:SourceArn`和`aws:SourceAccount`全局条件上下文密钥来防止混淆副手问题。**
+ [实例集预置](#cross-service-confused-deputy-prevention-fleet-provision)
+ [JITP](#cross-service-confused-deputy-prevention-JITP)
+ [凭证提供者](#cross-service-confused-deputy-prevention-credential-provider)

### 实例集预置
<a name="cross-service-confused-deputy-prevention-fleet-provision"></a>

您可以使用预调配模板资源配置[实例集预调配](https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html)。当预调配模板引用预调配角色时，该角色的信任策略可以包括 `aws:SourceArn` 和 `aws:SourceAccount` 条件键。这些键限制了配置可以调用 `sts:AssumeRole` 请求的资源。

使用以下信任策略的角色只能由 `SourceArn` 中指定的预调配模板的物联网主体 (`iot.amazonaws.com`) 担任。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:provisioningtemplate/example_template"
        }
         }
      }
   ]
}
```

### JITP
<a name="cross-service-confused-deputy-prevention-JITP"></a>

在[just-in-time 配置 (JITP)](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html) 中，您可以将配置模板用作独立于 CA 的资源，也可以将模板主体和角色定义为 CA 证书配置的一部分。 AWS IoT 角色信任策略`aws:SourceArn`中的值取决于您如何定义配置模板。

#### 将预调配模板定义为单独的资源
<a name="cross-service-confused-deputy-prevention-JITP-template"></a>

如果您将预调配模板定义为单独的资源，则 `aws:SourceArn` 的值可以是 `"arn:aws:iot:region:account-id:provisioningtemplate/example_template"`。您可以使用 [实例集预置](#cross-service-confused-deputy-prevention-fleet-provision) 中的示例策略。

#### 在 CA 证书中定义预调配模板
<a name="cross-service-confused-deputy-prevention-JITP-CA"></a>

如果您在 CA 证书资源中定义预调配模板，则 `aws:SourceArn` 的值可以为 `"arn:aws:iot:region:account-id:cacert/cert_id"` 或 `"arn:aws:iot:region:account-id:cacert/*"`。如果资源标识符（例如 CA 证书的 ID）在创建时未知，您可以使用通配符。

使用以下信任策略的角色只能由 `SourceArn` 中指定的 CA 证书的物联网主体 (`iot.amazonaws.com`) 担任。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:cacert/8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
        }
         }
      }
   ]
}
```

创建 CA 证书时，可以在注册配置中引用预调配角色。预调配角色的信任策略可使用 `aws:SourceArn` 来限制该角色可以担任的资源。[但是，在最初的 Register CACertificate 调用以注册 CA 证书期间，您无法在条件中指定 CA 证书的 ARN。](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) `aws:SourceArn`

要解决此问题，即为注册的特定 CA 证书指定配置角色信任策略 AWS IoT Core，您可以执行以下操作：
+ 首先，在CACertificate不提供`RegistrationConfig`参数的情况下调用 [Re](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) gister。
+ 注册 CA 证书后 AWS IoT Core，对其调用 [Up CACertificate date](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html)。

  在更新CACertificate 调用中，提供`RegistrationConfig`包含配置角色信任策略的，`aws:SourceArn`设置为新注册的 CA 证书的 ARN。

### 凭证提供者
<a name="cross-service-confused-deputy-prevention-credential-provider"></a>

对于[AWS IoT Core 凭证提供者](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)，请使用 AWS 账户 您在中创建角色别名的相同语句`aws:SourceAccount`，并指定与中角色别名资源类型的资源 ARN 相匹配的语句。`aws:SourceArn`创建供 AWS IoT Core 凭证提供商使用的 IAM 角色时，您必须在`aws:SourceArn`条件中包含可能需要担任该角色的任何角色别名，从而授权跨服务请求。 ARNs `sts:AssumeRole`

使用以下信任策略的角色只能由 `SourceArn` 中指定角色别名的 AWS IoT Core 凭证提供者主体 (`credentials.iot.amazonaws.com`) 担任。如果主体尝试检索 `aws:SourceArn` 条件中未指定的角色别名的凭证，则即使其他角色别名引用相同的 IAM 角色，该请求也会被拒绝。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "credentials.iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:iot:us-east-1:123456789012:rolealias/example_rolealias"
        }
      }
    }
  ]
}
```

# AWS IoT Core 策略示例
<a name="example-iot-policies"></a>

本节中的策略示例说明了用于完成 AWS IoT Core中常见任务的策略文档。为解决方案创建策略时，您可以将其作为启动示例。<a name="example-iot-policies-elements"></a>

本节中的示例使用以下策略元素：
+ [AWS IoT Core 政策行动](iot-policy-actions.md)
+ [AWS IoT Core 动作资源](iot-action-resources.md)
+ [AWS IoT 基于身份的策略示例](security_iam_id-based-policy-examples.md)
+ [基本 AWS IoT Core 策略变量](basic-policy-variables.md)
+ [X.509 证书策略变量 AWS IoT Core](cert-policy-variables.md)

**Topics**
+ [连接策略示例](connect-policy.md)
+ [发布/订阅策略示例](pub-sub-policy.md)
+ [连接和发布策略示例](connect-and-pub.md)
+ [保留的消息策略示例](retained-message-policy-examples.md)
+ [证书策略示例](certificate-policy-examples.md)
+ [事物策略示例](thing-policy-examples.md)
+ [基本任务策略示例](basic-jobs-example.md)

# 连接策略示例
<a name="connect-policy"></a>

以下策略拒绝对客户端 IDs `client1`和连接`client2`的权限 AWS IoT Core，同时允许设备使用客户端 ID 进行连接。客户端 ID 与在注册表中 AWS IoT Core 注册并附加到用于连接的主体上的事物的名称相匹配：

**注意**  
对于注册的设备，我们建议您将[事物策略变量](thing-policy-variables.md)用于 `Connect` 操作，并将事物附加到用于连接的主体。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1",
				"arn:aws:iot:us-east-1:123456789012:client/client2"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		}
	]
}
```

以下策略授予 AWS IoT Core 使用客户端 ID 进行连接的权限`client1`。此策略示例适用于未注册的设备。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1"
			]
		}
	]
}
```

## MQTT 持久会话策略示例
<a name="persistent-sessions-examples"></a>

`connectAttributes` 允许您在 IAM policy 中指定要在连接消息中使用的属性，如 `PersistentConnect` 和 `LastWill`。有关更多信息，请参阅 [使用 ConnectAttributes](mqtt.md#connect-attribute)。

以下策略允许连接 `PersistentConnect` 特征：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

以下策略不允许 `PersistentConnect`，但允许使用其它特征：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringNotEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

上述策略也可以使用 `StringEquals` 表达，但允许使用包括新特征在内的任何其它特征：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

以下策略允许通过 `PersistentConnect` 和 `LastWill` 连接，但不允许使用任何其它新特征：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		}
	]
}
```

以下策略允许客户端进行干净连接，无论是否具有 `LastWill`，但不允许使用其它特征：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "iot:Connect"
        ],
        "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
        "Condition": {
            "StringEquals": {
                "iot:ConnectAttributes": "LastWill"
        }
        }
    }]
}
```

以下策略仅允许使用默认特征进行连接：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

以下策略仅允许使用 `PersistentConnect` 连接，但只要连接使用 `PersistentConnect`，则允许使用任何新特征：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

以下策略规定连接必须同时使用 `PersistentConnect` 和 `LastWill`，而不允许使用新特征：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

以下策略不能拥有 `PersistentConnect`，但可以有 `LastWill`，不允许使用任何其它新特征：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "iot:ConnectAttributes": [
                        "LastWill"
                    ]
            }
        }
        }
    ]
}
```

以下策略仅允许包括带有主题 `"my/lastwill/topicName"` 的 `LastWill` 客户端连接，同时允许任何使用 `LastWill` 主题的特征:

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        }
    ]
}
```

以下策略仅允许使用特定 `LastWillTopic` 的干净连接，同时允许任何使用 `LastWillTopic` 的特征：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

# 发布/订阅策略示例
<a name="pub-sub-policy"></a>

您使用的策略取决于您的连接方式 AWS IoT Core。您可以使用 MQTT 客户端、HTTP 或 WebSocket。 AWS IoT Core 通过 MQTT 客户端连接时，将使用 X.509 证书进行身份验证。当你通过 HTTP 或 WebSocket 协议连接时，你就是在使用签名版本 4 和 Amazon Cognito 进行身份验证。

**注意**  
对于注册的设备，我们建议您将[事物策略变量](thing-policy-variables.md)用于 `Connect` 操作，并将事物附加到用于连接的主体。

**Topics**
+ [在 MQTT 和策略中使用通配符 AWS IoT Core](#pub-sub-policy-cert)
+ [发布、订阅和接收消息的政策（ to/from 特定主题）](#pub-sub-specific-topic)
+ [发布、订阅和接收带有特定前缀的消息 to/from 主题的政策](#pub-sub-policy-specific-topic-prefix)
+ [发布、订阅和接收特定于每台设备的消息 to/from 主题的政策](#pub-sub-specific-topic-device)
+ [发布、订阅和接收消息 to/from 主题的策略，主题名称中包含事物属性的主题](#pub-sub-topic-attribute)
+ [拒绝向主题名称的子主题发布消息的策略](#pub-sub-deny-publish)
+ [拒绝接收来自主题名称的子主题的消息的策略](#pub-sub-deny-receive)
+ [使用 MQTT 通配符订阅主题的策略](#pub-sub-topic-wildcard)
+ [适用于 HTTP 和 WebSocket 客户端的策略](#pub-sub-policy-cognito)

## 在 MQTT 和策略中使用通配符 AWS IoT Core
<a name="pub-sub-policy-cert"></a>

MQTT 和 AWS IoT Core 策略具有不同的通配符，您应在仔细考虑后选择它们。在 MQTT 中，在 M [QTT 主题过滤器中使用通配符`+`和`#`来订阅多个主题](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#topicfilters)名称。 AWS IoT Core 策略使用`*`和`?`作为通配符并遵守 [IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html#policies-grammar-json)的惯例。在策略文档中，`*` 表示字符的任意组合，问号 `?` 表示任何单个字符。在策略文档中，MQTT 通配符 `+` 和 `#` 被视为没有特殊意义的字符。要在策略的 `resource` 属性中描述多个主题名称和主题筛选条件，请使用 `*` 和 `?` 通配符代替 MQTT 通配符。

如果选择要在策略文档中使用的通配符，请考虑 `*` 字符不限于单个主题级别。在 MQTT 主题筛选器中，`+` 角色仅限于单个主题级别。为了帮助将通配符规范限制为单个 MQTT 主题筛选条件级别，请考虑使用多个 `?` 字符。有关在策略资源中使用通配符的更多信息以及通配符匹配内容的更多示例，请参阅在资源[中使用通配符](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_resource.html#reference_policies_elements_resource_wildcards)。 ARNs

下表显示了 MQTT 和 MQTT 客户端的 AWS IoT Core 策略中使用的不同通配符。


| 通配符 | 是 MQTT 通配符 | MQTT 中的示例 | 是 AWS IoT Core 策略通配符吗 | MQTT AWS IoT Core 客户端策略中的示例 | 
| --- | --- | --- | --- | --- | 
| \$1 | 是 | some/\$1 | 否 | 不适用 | 
| \$1 | 是 | some/\$1/topic | 否 | 不适用 | 
| \$1 | 否 | 不适用 | 是 | `topicfilter/some/*/topic` `topicfilter/some/sensor*/topic`  | 
| ? | 否 | 不适用 | 是 |  `topic/some/?????/topic` `topicfilter/some/sensor???/topic`  | 

## 发布、订阅和接收消息的政策（ to/from 特定主题）
<a name="pub-sub-specific-topic"></a>

以下是注册和未注册设备发布、订阅和接收名为 “some\$1specific\$1topic” 主题 to/from 的消息的示例。这些示例还强调了 `Publish` 和 `Receive` 使用“主题”作为资源，`Subscribe` 使用“主题筛选器”作为资源。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。它还为名为“some\$1specific\$1topic”的主题提供 `Publish`、`Subscribe` 和 `Receive` 权限。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。它还为名为“some\$1specific\$1topic”的主题提供 `Publish`、`Subscribe` 和 `Receive` 权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        }
    ]
}
```

------

## 发布、订阅和接收带有特定前缀的消息 to/from 主题的政策
<a name="pub-sub-policy-specific-topic-prefix"></a>

以下是注册和未注册设备发布、订阅和接收以 “topic\$1prefix” 为前缀的消息 to/from 主题的示例。

**注意**  
请注意此示例中通配符 `*` 的使用。尽管 `*` 对于在单个语句中为多个主题名称提供权限很有用，但它给设备提供的权限可能比所需权限更多，从而导致意想不到的后果。因此，我们建议您要经过深思熟虑后再使用通配符 `*`。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。它还会为具有前缀“topic\$1prefix”的主题提供 `Publish`、`Subscribe` 和 `Receive` 权限。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。它还会为具有前缀“topic\$1prefix”的主题提供 `Publish`、`Subscribe` 和 `Receive` 权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish",
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
            ]
        }
    ]
}
```

------

## 发布、订阅和接收特定于每台设备的消息 to/from 主题的政策
<a name="pub-sub-specific-topic-device"></a>

以下是已注册和未注册设备发布、订阅和接收特定于给定设备的消息 to/from 主题的示例。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。它提供向特定事物主题 (`sensor/device/${iot:Connection.Thing.ThingName}`) 发布内容的权限，还提供订阅特定事物主题 (`command/device/${iot:Connection.Thing.ThingName}`) 和从特定事物主题接收内容的权限。如果注册表中的事物名称为 “thing1”，则设备将能够发布到主题 “sensor/device/thing1". The device will also be able to subscribe to and receive from the topic "command/device/thing1”。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。它提供发布到客户特定主题 (`sensor/device/${iot:ClientId}`) 的权限，还提供订阅客户特定主题 (`command/device/${iot:ClientId}`) 和从此客户特定主题接收内容的权限。如果设备以 clientId1 的身份与 clientId 连接，则它将能够发布到主题 “1”。sensor/device/clientId该设备还将能够订阅和接收 `device/clientId1/command` 主题的内容。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

------

## 发布、订阅和接收消息 to/from 主题的策略，主题名称中包含事物属性的主题
<a name="pub-sub-topic-attribute"></a>

下面显示了注册设备发布、订阅和接收名称包含事物属性的消息 to/from 主题的示例。

**注意**  
仅在 AWS IoT Core 注册表中注册的设备存在事物属性。对于未注册的设备，没有相应的示例。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。它提供发布到主题 (`sensor/${iot:Connection.Thing.Attributes[version]}`)，以及订阅主题名称中包含事物属性的主题 (`command/${iot:Connection.Thing.Attributes[location]}`) 和从该主题接收内容的权限。如果注册表中的事物名称`version=v1`包含和`location=Seattle`，则设备将能够发布到主题 “sensor/v1", and subscribe to and receive from the topic "command/Seattle”。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/${iot:Connection.Thing.Attributes[version]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/${iot:Connection.Thing.Attributes[location]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/${iot:Connection.Thing.Attributes[location]}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

由于仅在 AWS IoT Core 注册表中注册的设备存在事物属性，因此未注册的事物没有相应的示例。

------

## 拒绝向主题名称的子主题发布消息的策略
<a name="pub-sub-deny-publish"></a>

以下显示的是已注册和未注册的设备向除某些子主题之外的所有主题发布消息的示例。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。它允许发布到所有以“department/”为前缀的主题，但不允许发布到“department/admins”子主题。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/*"
			]
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/admins"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。它允许发布到所有以“department/”为前缀的主题，但不允许发布到“department/admins”子主题。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/admins"
            ]
        }
    ]
}
```

------

## 拒绝接收来自主题名称的子主题的消息的策略
<a name="pub-sub-deny-receive"></a>

以下显示的是已注册和未注册的设备订阅除某些子主题之外具有特定前缀的主题，以及从此类主题接收消息的示例。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。此策略允许设备订阅任何具有前缀“topic\$1prefix”的主题。通过`NotResource`在的语句中使用`iot:Receive`，我们允许设备接收来自设备已订阅的所有主题的消息，但以 “to prefix/restricted". For example, with this policy, devices can subscribe to "topic\$1prefix/topic1" and even "topic\$1prefix/restricted", however, they will only receive messages from the topic "topic\$1prefix/topic1" and no messages from the topic "topic\$1prefix/restricted pic\$1” 为前缀的主题除外。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。此策略允许设备订阅任何具有前缀“topic\$1prefix”的主题。通过`NotResource`在的语句中使用`iot:Receive`，我们允许设备接收来自设备已订阅的所有主题的消息，但前缀为 “to prefix/restricted". For example, with this policy, devices can subscribe to "topic\$1prefix/topic1" and even "topic\$1prefix/restricted". However, they will only receive messages from the topic "topic\$1prefix/topic1" and no messages from the topic "topic\$1prefix/restricted pic\$1” 的主题除外。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
        }
    ]
}
```

------

## 使用 MQTT 通配符订阅主题的策略
<a name="pub-sub-topic-wildcard"></a>

MQTT 通配符 \$1 和 \$1 被视为文字字符串，但在策略中使用时不会将其视为通配符。 AWS IoT Core 在 MQTT 中，\$1 和 \$1 仅在订阅主题筛选器时被视为通配符，但在所有其他上下文中均被视为文字字符串。我们建议您仅在仔细考虑后才将这些 MQTT 通配符用作 AWS IoT Core 策略的一部分。

以下显示了在策略中使用 MQTT 通配符的已注册和未注册事物的示例。 AWS IoT Core 这些通配符被视为文字字符串。

------
#### [ Registered devices ]

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用与注册表中事物名称匹配的 ClientID 进行连接。此策略允许设备订阅主题“部门/\$1/员工”和“位置/\$1”。由于 \$1 和 \$1 在 AWS IoT Core 策略中被视为文字字符串，因此设备可以订阅主题 “部门/\$1/员工”，但也不能订阅主题 “”。department/engineering/employees". Similarly, devices can subscribe to the topic "location/\$1" but not to the topic "location/Seattle". However, once the device subscribes to the topic "department/\$1/employees", the policy will allow them to receive messages from the topic "department/engineering/employees". Similarly, once the device subscribes to the topic "location/\$1", they will receive messages from the topic "location/Seattle

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用 clientID1、clientID2 或 clientID3 进行连接。此策略允许设备订阅主题“部门/\$1/员工”和“位置/\$1”。由于 \$1 和 \$1 在 AWS IoT Core 策略中被视为文字字符串，因此设备可以订阅主题 “部门/\$1/员工”，但也不能订阅主题 “”。department/engineering/employees". Similarly, devices can subscribe to the topic "location/\$1" but not "location/Seattle". However, once the device subscribes to the topic "department/\$1/employees", the policy will allow them to receive messages from the topic "department/engineering/employees". Similarly, once the device subscribes to the topic "location/\$1", they will receive messages from the topic "location/Seattle

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
        }
    ]
}
```

------

## 适用于 HTTP 和 WebSocket 客户端的策略
<a name="pub-sub-policy-cognito"></a>

当你通过 HTTP 或 WebSocket 协议连接时，你就是在使用签名版本 4 和 Amazon Cognito 进行身份验证。Amazon Cognito Identity 可以是经过身份验证的，也可以是未经身份验证的。经过身份验证的身份属于已通过任何受支持的身份提供商进行身份验证的用户。未经身份验证的身份通常属于未使用身份提供商进行身份验证的来宾用户。Amazon Cognito 提供了唯一标识符和 AWS 凭证来支持未经身份验证的身份。有关更多信息，请参阅 [使用 Amazon Cognito Identity 的授权](cog-iot-policies.md)。

对于以下操作， AWS IoT Core 使用通过 API 附加到 Amazon Cognito 身份的 AWS IoT Core `AttachPolicy`策略。这将缩小附加到由经过身份验证的身份组成的 Amazon Cognito Identity 池的权限范围。
+ `iot:Connect`
+ `iot:Publish`
+ `iot:Subscribe`
+ `iot:Receive`
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

这就表示，Amazon Cognito Identity 需要从 IAM 角色策略和 AWS IoT Core 策略获得权限。您可以通过 API 将 IAM 角色策略附加到池中，将 AWS IoT Core 策略附加到 Amazon Cognito 身份。 AWS IoT Core `AttachPolicy`

经过身份验证和未经身份验证的用户是不同的身份类型。如果您未将 AWS IoT 策略附加到 Amazon Cognito Identity，则经过身份验证的用户将无法在中进行授权， AWS IoT 并且无法访问 AWS IoT 资源和操作。

**注意**  
对于其他 AWS IoT Core 操作或未经身份验证的身份， AWS IoT Core 不会缩小附加到 Amazon Cognito 身份池角色的权限范围。无论是对于经过身份验证的身份还是未经过身份验证的身份，这都是我们建议附加到 Amazon Cognito 池角色的最宽松的策略。

**HTTP**

要允许未经过身份验证的 Amazon Cognito Identity 通过 HTTP 向特定于 Amazon Cognito Identity 的主题发布消息，请将以下 IAM 策略附加到 Amazon Cognito Identity 池角色：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"
            ]
        }
    ]
}
```

要允许经过身份验证的用户，请使用 API 将上述策略附加到 Amazon Cognito 身份池角色和亚马逊 Cognito 身份。 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html)

**注意**  
在授权 Amazon Cognito 身份时 AWS IoT Core ，会考虑这两个策略并授予指定的最低权限。仅当两个策略都允许请求的操作时，才允许操作。如果任一策略不允许某项操作，则该操作未经授权。

**MQTT**

要允许未经身份验证的 Amazon Cognito 身份发布有关您账户中特定 WebSocket 于亚马逊 Cognito 身份的主题的 MQTT 消息，请将以下 IAM 策略附加到 Amazon Cognito 身份池角色：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-identity.amazonaws.com:sub}"]
        }
    ]
}
```

要允许经过身份验证的用户，请使用 API 将上述策略附加到 Amazon Cognito 身份池角色和亚马逊 Cognito 身份。 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html)

**注意**  
在授权 Amazon Cognito 身份时 AWS IoT Core ，会同时考虑两者并授予指定的最低权限。仅当两个策略都允许请求的操作时，才允许操作。如果任一策略不允许某项操作，则该操作未经授权。

# 连接和发布策略示例
<a name="connect-and-pub"></a>

对于在注册 AWS IoT Core 表中注册为事物的设备，以下策略授予 AWS IoT Core 使用与事物名称匹配的客户端 ID 进行连接的权限，并限制设备只能在客户端 ID 或事物名称特定的 MQTT 主题上发布。要成功连接，必须在注册 AWS IoT Core 表中注册事物名称，并使用附加到事物的身份或委托人进行身份验证：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
      ]
    }
  ]
}
```

对于未在注册 AWS IoT Core 表中注册为事物的设备，以下策略授予 AWS IoT Core 使用客户端 ID 连接的权限，`client1`并限制设备只能在特定于客户的 MQTT 主题上发布：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/client1"
      ]
    }
  ]
}
```

# 保留的消息策略示例
<a name="retained-message-policy-examples"></a>

使用[保留的消息](mqtt.md#mqtt-retain)需要具体策略。保留的消息是在设置了 RETAIN 标志并由 AWS IoT Core存储的情况下发布的 MQTT 消息。本节介绍了允许常见使用保留消息的策略示例。

**Topics**
+ [连接和发布保留消息的策略](#retained-message-policy-examples-publish)
+ [连接和发布保留的 Will 消息的策略](#retained-message-policy-examples-publish-lwt)
+ [列出和获取保留消息的策略](#retained-message-policy-examples-list-get)

## 连接和发布保留消息的策略
<a name="retained-message-policy-examples-publish"></a>

对于要发布保留消息的设备，设备必须能够连接、发布（任何 MQTT 消息）和发布 MQTT 保留的消息。以下策略为主题授予了这些权限：`device/sample/configuration` 到客户端 **device1**。有关授予连接权限的另一个示例，请参阅 [连接和发布策略示例](connect-and-pub.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/device/sample/configuration"
			]
		}
	]
}
```

## 连接和发布保留的 Will 消息的策略
<a name="retained-message-policy-examples-publish-lwt"></a>

客户端可以配置一条消息，该消息 AWS IoT Core 将在客户端意外断开连接时发布。MQTT 称这样的消息为 [*Will*消息](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Will_Flag)。客户端必须在连接权限中添加附加条件才能包含这些条件。

以下策略文档授予所有客户端连接和发布由主题、`will` 标识的 Will 消息的权限， AWS IoT Core 也将保留。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			],
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/will"
			]
		}
	]
}
```

## 列出和获取保留消息的策略
<a name="retained-message-policy-examples-list-get"></a>

服务和应用程序可以通过调用 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html) 和 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html) 来访问保留的消息，而无需支持 MQTT 客户端。调用这些操作的服务和应用程序必须使用如下示例的策略进行授权。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:ListRetainedMessages"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/device1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetRetainedMessage"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/foo"
            ]
        }
    ]
}
```

# 证书策略示例
<a name="certificate-policy-examples"></a>

对于在注册 AWS IoT Core 表中注册的设备，以下策略授予 AWS IoT Core 使用与事物名称匹配的客户端 ID 进行连接的权限，以及向名称等于该设备用于进行自我身份验证`certificateId`的证书的主题发布的权限：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

对于未在注册 AWS IoT Core 表中注册的设备，以下策略授予使用客户端 IDs、`client1``client2`、`client3`和 AWS IoT Core 进行连接的权限，以及发布到名称等于设备用于进行自我身份验证`certificateId`的证书的主题的权限：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

对于在注册 AWS IoT Core 表中注册的设备，以下策略授予 AWS IoT Core 使用与事物名称匹配的客户端 ID 进行连接的权限，以及向名称等于该设备进行身份验证的证书主题`CommonName`字段的主题发布权限：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

**注意**  
在此示例中，证书的使用者公用名用作主题标识符，并假设使用者公用名对于每个已注册的证书都是唯一的。如果证书在多个设备之间共享，则共享此证书的所有设备的使用者公用名将相同，因而允许从多个设备向同一主题发布权限（不推荐）。

对于未在注册 AWS IoT Core 表中注册的设备，以下策略授予 AWS IoT Core 与客户端 IDs、`client1``client2`、`client3`和进行连接的权限，以及向名称等于设备用于进行身份验证的证书主题`CommonName`字段的主题发布的权限：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

**注意**  
在此示例中，证书的使用者公用名用作主题标识符，并假设使用者公用名对于每个已注册的证书都是唯一的。如果证书在多个设备之间共享，则共享此证书的所有设备的使用者公用名将相同，因而允许从多个设备向同一主题发布权限（不推荐）。

对于在注册 AWS IoT Core 表中注册的设备，以下策略授予使用 AWS IoT Core 与事物名称匹配的客户端 ID 进行连接的权限，以及在用于对设备进行身份验证的证书的`Subject.CommonName.2`字段设置为`Administrator`：`admin/`

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

对于未在注册 AWS IoT Core 表中注册的设备，当用于对设备进行身份验证的证书的`Subject.CommonName.2`字段设置为`admin/`时 IDs `client1`，以下策略授予 AWS IoT Core 与客户端`client2`、`client3`和发布到名称前缀为的主题的权限：`Administrator`

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用其事物名称发布特定主题，该主题包括用于对设备进行身份验证的证书`ThingName`何时将其任何一个`Subject.CommonName`字段设置为`Administrator`：`admin/`

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/${iot:Connection.Thing.ThingName}"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

对于未在注册 AWS IoT Core 表中注册的设备，以下策略授予在用于对 AWS IoT Core 设备进行身份验证的证书的任意一个`Subject.CommonName`字段设置为`admin`时连接到客户端 IDs `client1``client2`、`client3`和向主题发布的权限`Administrator`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

# 事物策略示例
<a name="thing-policy-examples"></a>

如果用于进行身份验证的证书附加到正在评估策略的 AWS IoT Core 对象，则以下策略允许设备进行连接：

****  

```
{  
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {  
            "Effect":"Allow",
            "Action":["iot:Connect"],
            "Resource":[ "*" ],
            "Condition": {
                "Bool": {
                    "iot:Connection.Thing.IsAttached": ["true"]
            }
        }
        }
    ]
}
```

如果证书附加到具有特定事物类型的事物，并且该事物具有值为 `attributeValue` 的 `attributeName` 属性，则以下策略允许设备进行发布。有关事物策略变量的更多信息，请参阅[事物策略变量](thing-policy-variables.md)。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/device/stats",
      "Condition": {
        "StringEquals": {
          "iot:Connection.Thing.Attributes[attributeName]": "attributeValue",
          "iot:Connection.Thing.ThingTypeName": "Thing_Type_Name"
        },
        "Bool": {
          "iot:Connection.Thing.IsAttached": "true"
        }
      }
    }
  ]
}
```

以下策略允许设备发布到以事物的属性开头的主题。如果设备证书与事物不关联，则将无法解析此变量，并将导致访问被拒绝错误。有关事物策略变量的更多信息，请参阅[事物策略变量](thing-policy-variables.md)。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.Attributes[attributeName]}/*"
    }
  ]
}
```

# 基本任务策略示例
<a name="basic-jobs-example"></a>

此示例说明了任务目标所需的策略状态，任务目标是接收任务请求并与 AWS IoT通信任务执行状态的单个设备。

*us-west-2:57EXAMPLE833*替换为你的 AWS 区域、冒号字符 (:) 和你的 12 位 AWS 账户 数字，然后*uniqueThingName*替换为代表设备的事物资源的名称。 AWS IoT

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iotjobsdata:DescribeJobExecution",
                "iotjobsdata:GetPendingJobExecutions",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
            ]
        }
    ]
}
```

# 使用 Amazon Cognito Identity 的授权
<a name="cog-iot-policies"></a>

存在两种类型的 Amazon Cognito Identity：经过身份验证的身份和未经身份验证的身份。当您的应用程序支持未经身份验证的 Amazon Cognito Identity 时，将不会执行身份验证，因此您不知道用户的身份。

**未经身份验证的身份：**对于未经身份验证的 Amazon Cognito Identity，您可以通过将 IAM 角色附加到未经身份验证的身份池来授予权限。我们建议您仅授予对希望可供未知用户使用的那些资源的访问权限。

**重要**  
对于连接 AWS IoT Core至的未经身份验证的 Amazon Cognito 用户，我们建议您在 IAM 策略中允许访问非常有限的资源。

**经过身份验证的身份：**对于经过身份验证的 Amazon Cognito Identity，您需要在两个位置指定权限：
+ 将 IAM 策略附加到经过身份验证的 Amazon Cognito Identity 池和
+ 将 AWS IoT Core 策略附加到 Amazon Cognito 身份（经过身份验证的用户）。

## 未经身份验证和身份验证的 Amazon Cognito 用户连接到的策略示例 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

以下示例显示了 Amazon Cognito Identity 的 IAM 策略和物联网策略中的权限。经过身份验证的用户想要发布到设备特定的主题（例如device/DEVICE\$1ID/status）。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/Client_ID"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status"
            ]
        }
    ]
}
```

以下示例显示了 Amazon Cognito 未经身份验证角色的 IAM 策略中的权限。未经身份验证的用户希望发布到不需要身份验证的非设备特定主题。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic"
            ]
        }
    ]
}
```

## GitHub 例子
<a name="cog-iot-policies-github"></a>

以下示例 Web 应用程序 GitHub 展示了如何将对经过身份验证的用户的策略附件纳入用户注册和身份验证流程。
+ [MQTT publish/subscribe React Web 应用程序使用 AWS Amplify 和 AWS IoT Device SDK for JavaScript](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp)
+ [使用 AWS Amplify、和 Lambda 函数的 MQTT publish/subscribe React Web 应用程序 AWS IoT Device SDK for JavaScript](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify 是一组工具和服务，可帮助您构建与 AWS 服务集成的网络和移动应用程序。有关 Amplify 的更多信息，请参阅 [Amplify Framework Documentation](https://docs.amplify.aws/)。

这两个示例都执行了以下步骤。

1. 用户注册账户时，应用程序会创建 Amazon Cognito 用户池和身份。

1. 用户进行身份验证时，应用程序将创建策略并将其附加到身份。这授予用户发布和订阅的权限。

1. 用户可以使用应用程序发布和订阅 MQTT 主题。

第一个示例直接在身份验证操作中使用 `AttachPolicy` API 操作。以下示例演示如何在使用 Amplify 和 AWS IoT Device SDK for JavaScript的反应 Web 应用程序中实现此 API。

```
function attachPolicy(id, policyName) {
    var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint});
    var params = {policyName: policyName, target: id};

    console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id);
    Iot.attachPolicy(params, function(err, data) {
         if (err) {
               if (err.code !== 'ResourceAlreadyExistsException') {
                  console.log(err);
               }
          }
         else  {
            console.log("Successfully attached policy with the identity", data);
         }
     });
}
```

此代码出现在 [AuthDisplay.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp/blob/d1c307b36357be934db9dda020140fa337709cd9/src/AuthDisplay.js#L45) 文件中。

第二个示例在 Lambda 函数中实现 `AttachPolicy` API 操作。以下示例说明 Lambda 如何使用此 API 调用。

```
iot.attachPolicy(params, function(err, data) {
     if (err) {
           if (err.code !== 'ResourceAlreadyExistsException') {
              console.log(err);
              res.json({error: err, url: req.url, body: req.body});
           }
      }
     else  {
        console.log(data);
        res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body});
     }
 });
```

此代码出现在[app.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda/blob/e493039581d2aff0faa3949086deead20a2c5385/amplify/backend/function/amplifyiotlambda/src/app.js#L50)文件的 `iot.GetPolicy` 函数中。

**注意**  
当您使用通过 Amazon Cognito 身份池获得的 AWS 证书调用该函数时，您的 Lambda 函数中的上下文对象包含的值为。`context.cognito_identity_id`有关更多信息，请参阅下列内容。  
[AWS Lambda Node.js 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html)
[AWS Lambda Python 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/python-context.html)
[AWS Lambda Ruby 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html)
[AWS Lambda Java 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/java-context.html)
[AWS Lambda Go 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/golang-context.html)
[AWS Lambda C\$1 中的上下文对象](https://docs.aws.amazon.com/lambda/latest/dg/csharp-context.html)
[AWS Lambda 中的上下文对象 PowerShell](https://docs.aws.amazon.com/lambda/latest/dg/powershell-context.html)

# 使用 AWS IoT Core 凭证提供者授权直接调用 AWS 服务
<a name="authorizing-direct-aws"></a>

设备可以使用 X.509 证书通过 TLS 双向身份验证协议 AWS IoT Core 进行连接。其他 AWS 服务不支持基于证书的身份验证，但可以使用[AWS 签名版本 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 格式的 AWS 凭据进行调用。[签名版本 4 算法](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)通常要求呼叫者拥有访问密钥 ID 和私有访问密钥。 AWS IoT Core 具有凭据提供程序，允许您使用内置的 [X.509 证书](x509-client-certs.html)作为对请求进行身份验证的唯一设备身份。 AWS 这样就不再需要将访问密钥 ID 和私有访问密钥存储在您的设备上。

凭证提供程序使用 X.509 证书对调用方进行身份验证并颁发具有有限权限的临时安全令牌。该令牌可用于对任何 AWS 请求进行签名和身份验证。这种验证 AWS 请求的方式要求您创建和配置一个 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html)并将相应的 IAM 策略附加到该角色，以便证书提供者可以代表您担任该角色。有关 AWS IoT Core 和 IAM 的更多信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md)。

 AWS IoT 要求设备将[服务器名称指示 (SNI) 扩展](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)发送到传输层安全 (TLS) 协议，并在`host_name`字段中提供完整的端点地址。`host_name` 字段必须包含您调用的端点，并且必须是：
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:CredentialProvider` 返回的 `endpointAddress`。

没有正确 `host_name` 值的设备尝试的连接将失败。

下图说明了凭证提供程序工作流程。

![\[AWS IoT Core 凭证提供者工作流程。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/credentials-provider-diagram.png)


1.  AWS IoT Core 设备向凭证提供者发出 HTTPS 请求以获取安全令牌。该请求包括用于身份验证的设备 X.509 证书。

1. 凭证提供者将请求转发到 AWS IoT Core 身份验证和授权模块，以验证证书并验证设备是否有权请求安全令牌。

1. 如果证书有效且有权请求安全令牌，则 AWS IoT Core 身份验证和授权模块将返回成功。否则，它会向设备发送异常。

1. 成功验证证书之后，凭证提供程序将调用 [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) 来代入您为它创建的 IAM 角色。

1. AWS STS 向凭证提供者返回临时的有限权限安全令牌。

1. 凭证提供程序将该安全令牌返回给设备。

1. 设备使用安全令牌对签 AWS 名版本 4 的 AWS 请求进行签名。

1. 请求的服务调用 IAM 来验证签名并根据附加到您为凭证提供程序创建的 IAM 角色的访问策略授权请求。

1. 如果 IAM 成功验证签名并授权请求，则请求成功。否则，IAM 将发送异常。

下一节介绍如何使用证书来获取安全令牌。编写此内容时，假定您已[注册了设备](register-device.html)并为它[创建并激活了您自己的证书](device-certs-your-own.html)。

## 如何使用证书来获取安全令牌
<a name="authorizing-direct-aws.walkthrough"></a>

1. 配置凭证提供程序代表您的设备代入的 IAM 角色。将以下信任策略附加到该角色。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Service": "credentials.iot.amazonaws.com"},
           "Action": "sts:AssumeRole"
       }
   }
   ```

   对于您要调用的每项 AWS 服务，请为该角色附加访问策略。凭证提供程序支持以下策略变量：
   + `credentials-iot:ThingName`
   + `credentials-iot:ThingTypeName`
   + `credentials-iot:AwsCertificateId`

   当设备在向 AWS 服务发出的请求中提供了事物名称时，凭证提供程序会将 `credentials-iot:ThingName` 和 `credentials-iot:ThingTypeName` 作为上下文变量添加到安全令牌。如果设备没有在请求中提供事物名称，则凭证提供程序将提供 `credentials-iot:AwsCertificateId` 作为上下文变量。您将事物名称作为 `x-amzn-iot-thingname` HTTP 请求标头的值进行传递。

   这三个变量仅适用于 IAM 策略，而不适用于 AWS IoT Core 策略。

1. 确保执行下一步（创建角色别名）的用户有权将新创建的角色传递给 AWS IoT Core。以下策略向 AWS 用户同时授`iam:PassRole`予`iam:GetRole`和权限。`iam:GetRole` 权限可让用户获取有关您刚创建的角色的信息。该`iam:PassRole`权限允许用户将角色传递给其他 AWS 服务。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "iam:GetRole",
               "iam:PassRole"
           ],
           "Resource": "arn:aws:iam::123456789012:role/your role name"
       }
   }
   ```

1. 创建 AWS IoT Core 角色别名。要直接呼叫 AWS 服务的设备必须知道在连接时要使用哪个角色 ARN。 AWS IoT Core对角色 ARN 进行硬编码并不是一个很好的解决方案，因为它需要您在角色 ARN 发生更改时更新设备。更好的解决方案是使用 `CreateRoleAlias` API 创建一个指向角色 ARN 的角色别名。如果角色 ARN 发生更改，您只需更新角色别名。无需在设备上进行任何更改。此 API 接受以下参数：  
`roleAlias`  
必需。一个标识角色别名的任意字符串。它充当角色别名数据模型中的主键。它包含 1-128 个字符，并且必须仅包含字母数字字符以及 =、@ 和 - 符号。允许大写和小写字母字符。角色别名名称区分大小写。  
`roleArn`  
必需。角色别名所指向的角色的 ARN。  
`credentialDurationSeconds`  
可选。凭证有效的时间长度（以秒为单位）。最小值为 900 秒（15 分钟）。最大值为 43200 秒（12 小时）。默认值为 3600 秒（1 小时）。  
 AWS IoT Core 凭证提供者可以颁发最长有效期为 43,200 秒（12 小时）的证书。凭证的有效期长达 12 小时，有助于通过将凭证缓存更长时间来减少对凭证提供程序的调用次数。  
`credentialDurationSeconds` 值必须小于或等于角色别名引用的 IAM 角色的最长会话持续时间。有关更多信息，请参阅《Identity [and Access Managem AWS ent 用户指南》中的修改角色最长会话时长 (AWS API)](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-api.html#roles-modify_max-session-duration-api)。

   相关此 API 的更多信息，请参阅 [CreateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateRoleAlias.html)。

1. 将策略附加到设备证书。附加到设备证书的策略必须向设备授予代入角色的权限。您可以通过授予对角色别名执行 `iot:AssumeRoleWithCertificate` 操作的权限来做到这一点，如以下示例所示。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:AssumeRoleWithCertificate",
               "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias"
           }
       ]
   }
   ```

1. 向凭证提供程序发出 HTTPS 请求来获取安全令牌。提供以下信息：
   + *Certificate*：由于这是使用 TLS 双向身份验证的 HTTP 请求，因此，您在发出请求时必须向客户端提供证书和私有密钥。使用与注册证书时相同的证书和私钥 AWS IoT Core。

     要确保您的设备正在与之通信 AWS IoT Core （而不是模拟它的服务），请参阅[服务器身份验证](x509-client-certs.html#server-authentication)，点击链接下载相应的 CA 证书，然后将其复制到您的设备上。
   + *RoleAlias*：您为证书提供者创建的角色别名的名称。角色别名区分大小写，并且必须与中创建的角色别名相匹配 AWS IoT Core。
   + *ThingName*: 您在注册事物时创建 AWS IoT Core 的事物名称。这作为 `x-amzn-iot-thingname` HTTP 标头的值进行传递。仅当您在 AWS IoT Core 或 IAM 策略中使用事物属性作为策略变量时，才需要此值。
**注意**  
您在*ThingName*中提供的`x-amzn-iot-thingname`必须与分配给证书的 Thin AWS IoT g 资源的名称相匹配。如果不匹配，则返回 403 错误。

   在中运行以下命令 AWS CLI 以获取您的凭据提供程序终端节点 AWS 账户。相关此 API 的更多信息，请参阅 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html)。有关启用 FIPS 的端点，请参阅 [AWS IoT Core- 凭证提供者端点](iot-connect-fips.md#iot-connect-fips-credential)。

   ```
   aws iot describe-endpoint --endpoint-type iot:CredentialProvider
   ```

   以下 JSON 对象是 **describe-endpoint** 命令的示例输出。它包含您用于请求安全令牌的 `endpointAddress`。

   ```
   {
       "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com"
   }
   ```

   使用端点向凭证提供程序发出 HTTPS 请求以返回安全令牌。以下示例命令使用 `curl`，但您可以使用任何 HTTP 客户端。
**注意**  
Ro *leAlias* 名称区分大小写，并且必须与中创建的角色别名相匹配。 AWS IoT

   ```
   curl --cert your certificate --key your private key -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials
   ```

   此命令返回包含 `accessKeyId`、`secretAccessKey`、`sessionToken` 和过期的安全令牌对象。以下 JSON 对象是 `curl` 命令的示例输出。

   ```
       {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}
   ```

   然后，您可以使用`accessKeyId``secretAccessKey`、和`sessionToken`值对 AWS 服务请求进行签名。有关演 end-to-end示，请参阅*AWS 安全*博客上的 [“如何使用 AWS 凭据提供者博客文章来消除设备中对硬编码 AWS IoT 凭据的需求](https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/)”。

# 通过 IAM 跨账户访问
<a name="cross-account-access"></a>

AWS IoT Core 允许您允许委托人发布或订阅 AWS 账户 未归委托人所有的主题中定义的主题。您可以通过创建 IAM 策略和 IAM 角色并将策略附加到角色来配置跨账户访问。

首先，创建一个客户托管 IAM 策略（如[创建 IAM 策略](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html)中所述），就像您在 AWS 账户中为其他用户和证书创建策略一样。

对于在注册 AWS IoT Core 表中注册的设备，以下策略允许设备 AWS IoT Core 使用与设备的事物名称相匹配的客户端 ID 进行连接并发布到设备事物名称`my/topic/thing-name `所在的位置*thing-name*：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

对于未在注册 AWS IoT Core 表中注册的设备，以下策略允许设备使用在您的账户 (123456789012) `client1` 注册 AWS IoT Core 表中注册的事物名称来连接 AWS IoT Core 并发布到名称前缀为的客户端 ID 专用主题：`my/topic/`

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
            ]
        }
    ]
}
```

接下来，按照[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)中的步骤操作。输入要与之共享访问权限的 AWS 账户 的账户 ID。接下来是最后一步，请将您刚刚创建的策略附加到角色。如果您稍后需要修改要向其授予权限的 AWS ID，可使用以下信任策略格式执行操作：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::567890123456:user/MyUser"
        },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# 中的数据保护 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"
}
```

# 的身份和访问管理 AWS IoT
<a name="security-iam"></a>

AWS Identity and Access Management (IAM) AWS 服务 可帮助管理员安全地控制对 AWS 资源的访问权限。IAM 管理员控制谁可以*进行身份验证*（登录）和*授权*（拥有权限）使用 AWS IoT 资源。您可以使用 IAM AWS 服务 ，无需支付额外费用。

**Topics**
+ [受众](#security_iam_audience)
+ [使用 IAM 身份进行身份验证](#security_iam_authentication)
+ [使用策略管理访问](#security_iam_access-manage)
+ [如何 AWS IoT 与 IAM 配合使用](security_iam_service-with-iam.md)
+ [AWS IoT 基于身份的策略示例](security_iam_id-based-policy-examples.md)
+ [AWS 的托管策略 AWS IoT](security-iam-awsmanpol.md)
+ [对 AWS IoT 身份和访问进行故障排除](security_iam_troubleshoot.md)

## 受众
<a name="security_iam_audience"></a>

您的使用方式 AWS Identity and Access Management (IAM) 因您的角色而异：
+ **服务用户**：如果您无法访问功能，请从管理员处请求权限（请参阅[对 AWS IoT 身份和访问进行故障排除](security_iam_troubleshoot.md)）
+ **服务管理员**：确定用户访问权限并提交权限请求（请参阅[如何 AWS IoT 与 IAM 配合使用](security_iam_service-with-iam.md)）
+ **IAM 管理员**：编写策略以管理访问权限（请参阅 [AWS IoT 基于身份的策略示例](security_iam_id-based-policy-examples.md)）

## 使用 IAM 身份进行身份验证
<a name="security_iam_authentication"></a>

 AWS IoT 身份中可以是设备 (X.509) 证书、Amazon Cognito 身份或 IAM 用户或群组。本主题仅讨论 IAM 身份。有关 AWS IoT 支持的其他身份的更多信息，请参阅[客户端身份验证](client-authentication.md)。

身份验证是您 AWS 使用身份凭证登录的方式。您必须以 IAM 用户身份进行身份验证 AWS 账户根用户，或者通过担任 IAM 角色进行身份验证。

您可以使用来自身份源的证书 AWS IAM Identity Center （例如（IAM Identity Center）、单点登录身份验证或 Google/Facebook 证书，以联合身份登录。有关登录的更多信息，请参阅《AWS 登录 用户指南》**中的[如何登录您的 AWS 账户](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

对于编程访问， AWS 提供 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 账户 root 用户
<a name="security_iam_authentication-rootuser"></a>

 创建时 AWS 账户，首先会有一个名为 AWS 账户 *root 用户的*登录身份，该身份可以完全访问所有资源 AWS 服务 和资源。我们强烈建议不要使用根用户进行日常任务。有关要求根用户凭证的任务，请参阅*《IAM 用户指南》*中的[需要根用户凭证的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅 *IAM 用户指南*[中的要求人类用户使用身份提供商的联合身份验证才能 AWS 使用临时证书进行访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 AWS CLI 或 AWS API 操作来代入角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问
<a name="security_iam_access-manage"></a>

您可以 AWS 通过创建策略并将其附加到 AWS 身份或资源来控制中的访问权限。策略定义了与身份或资源关联时的权限。 AWS 在委托人提出请求时评估这些政策。大多数策略都以 JSON 文档的 AWS 形式存储在中。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略
<a name="security_iam_access-manage-id-based-policies"></a>

基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略
<a name="security_iam_access-manage-resource-based-policies"></a>

基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用 IAM 中的 AWS 托管策略。

### 访问控制列表 (ACLs)
<a name="security_iam_access-manage-acl"></a>

访问控制列表 (ACLs) 控制哪些委托人（账户成员、用户或角色）有权访问资源。 ACLs 与基于资源的策略类似，尽管它们不使用 JSON 策略文档格式。

Amazon S3 和 Amazon VPC 就是支持的服务示例 ACLs。 AWS WAF要了解更多信息 ACLs，请参阅《*亚马逊简单存储服务开发者指南*》中的[访问控制列表 (ACL) 概述](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)。

### 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 AWS Organizations。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*AWS Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型
<a name="security_iam_access-manage-multiple-policies"></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 AWS 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# 如何 AWS IoT 与 IAM 配合使用
<a name="security_iam_service-with-iam"></a>

在使用 IAM 管理访问权限之前 AWS IoT，您应该了解哪些 IAM 功能可供使用 AWS IoT。要全面了解如何 AWS IoT 和其他 AWS 服务与 IAM 配合使用，请参阅 IAM *用户指南中的与 IAM* [配合使用的AWS 服务](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_aws-services-that-work-with-iam.html)。

**Topics**
+ [AWS IoT 基于身份的策略](#security_iam_service-with-iam-id-based-policies)
+ [AWS IoT 基于资源的政策](#security_iam_service-with-iam-resource-based-policies)
+ [基于 AWS IoT 标签的授权](#security_iam_service-with-iam-tags)
+ [AWS IoT IAM 角色](#security_iam_service-with-iam-roles)

## AWS IoT 基于身份的策略
<a name="security_iam_service-with-iam-id-based-policies"></a>

使用 IAM 基于身份的策略，您可以指定允许或拒绝的操作和资源，以及指定在什么条件下允许或拒绝操作。 AWS IoT 支持特定操作、资源和条件键。要了解在 JSON 策略中使用的所有元素，请参阅《IAM 用户指南》** 中的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements.html)。

### 操作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

JSON 策略的 `Action` 元素描述可用于在策略中允许或拒绝访问的操作。在策略中包含操作以授予执行关联操作的权限。

下表列出了 IAM 物联网操作、关联 AWS IoT 的 API 以及该操作所操纵的资源。


****  

| 策略操作 | AWS IoT API | 资源 | 
| --- | --- | --- | 
| 物联网：AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 账户 指定的必须是证书要转移到的账户。   | 
| 物联网：AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：AssociateTargetsWithJob | AssociateTargetsWithJob | none  | 
| 物联网：AttachPolicy | AttachPolicy |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或者 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：AttachSecurityProfile | AttachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 账户 指定的必须是证书要转移到的账户。   | 
| 物联网：CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ClearDefaultAuthorizer | ClearDefaultAuthorizer | 无 | 
| 物联网：CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| 物联网：CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| 物联网：CreateDimension | CreateDimension | `arn:aws:iot:region:account-id:dimension/dimension-name` | 
| 物联网：CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| 物联网：CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| 物联网：CreatePolicyVersion | CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  这必须是 AWS IoT 策略，而不是 IAM 策略。   | 
| 物联网：CreateRoleAlias | CreateRoleAlias |  (参数：roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：CreateSecurityProfile | CreateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 针对要创建的组和父组 (如果使用)  | 
| 物联网：CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| 物联网:删除 CACertificate | 删除 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DeleteDimension | DeleteDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| 物联网：DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| 物联网：DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：DeleteSecurityProfile | DeleteSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网:deletev2 LoggingLevel | deleteV2 LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (参数：authorizerName) none  | 
| 物联网:描述 CACertificate | 描述 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 无  | 
| 物联网：DescribeEndpoint | DescribeEndpoint | \$1 | 
| 物联网：DescribeEventConfigurations | DescribeEventConfigurations | none  | 
| 物联网：DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| 物联网：DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：DescribeJobExecution | DescribeJobExecution | 无 | 
| 物联网：DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| 物联网：DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DescribeThingRegistrationTask | DescribeThingRegistrationTask | 无 | 
| 物联网：DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 或者 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DetachSecurityProfile | DetachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：GetIndexingConfiguration | GetIndexingConfiguration | 无 | 
| 物联网：GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：GetLoggingOptions | GetLoggingOptions | \$1 | 
| 物联网：GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：GetRegistrationCode | GetRegistrationCode | \$1 | 
| 物联网：GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或者 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListAuthorizers | ListAuthorizers | 无 | 
| 物联网:列表 CACertificates | 名单 CACertificates | \$1 | 
| 物联网：ListCertificates | ListCertificates | \$1 | 
| 物联网：ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| 物联网：ListIndices | ListIndices | 无 | 
| 物联网：ListJobExecutionsForJob | ListJobExecutionsForJob | 无 | 
| 物联网：ListJobExecutionsForThing | ListJobExecutionsForThing | 无 | 
| 物联网：ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 如果使用 thingGroupName 参数  | 
| 物联网：ListJobTemplates | ListJobs | 无 | 
| 物联网：ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| 物联网：ListPolicies | ListPolicies | \$1 | 
| 物联网：ListPolicyPrincipals | ListPolicyPrincipals | \$1 | 
| 物联网：ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListRoleAliases | ListRoleAliases | 无 | 
| 物联网：ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：ListThingGroups | ListThingGroups | 无 | 
| 物联网：ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 无 | 
| 物联网：ListThingRegistrationTasks | ListThingRegistrationTasks | 无 | 
| 物联网：ListThingTypes | ListThingTypes | \$1 | 
| 物联网：ListThings | ListThings | \$1 | 
| 物联网：ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：ListTopicRules | ListTopicRules | \$1 | 
| IoT: listv2 LoggingLevels | Listv2 LoggingLevels | 无 | 
| 物联网:注册 CACertificate | 注册 CACertificate | \$1 | 
| 物联网：RegisterCertificate | RegisterCertificate | \$1 | 
| 物联网：RegisterThing | RegisterThing | 无 | 
| 物联网：RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| 物联网：SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| 物联网：SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：SetLoggingOptions | SetLoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| IoT: setv2 LoggingLevel | setv2 LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| IoT: setv2 LoggingOptions | setv2 LoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| 物联网：StartThingRegistrationTask | StartThingRegistrationTask | 无 | 
| 物联网：StopThingRegistrationTask | StopThingRegistrationTask | 无 | 
| 物联网：TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：TestInvokeAuthorizer | TestInvokeAuthorizer | 无 | 
| 物联网：TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| 物联网:更新 CACertificate | 更新 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：UpdateDimension | UpdateDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：UpdateEventConfigurations | UpdateEventConfigurations | 无 | 
| 物联网：UpdateIndexingConfiguration | UpdateIndexingConfiguration | 无 | 
| 物联网：UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：UpdateSecurityProfile | UpdateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| 物联网：UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 

正在执行的策略操作在操作前 AWS IoT 使用以下前缀:`iot:`. 例如，要授予某人列出他们 AWS 账户 在 `ListThings` API 中注册的所有物联网事物的权限，您需要将该`iot:ListThings`操作包含在他们的策略中。策略声明必须包含`Action`或`NotAction`元素。 AWS IoT 定义了自己的一组操作，这些操作描述了您可以使用此服务执行的任务。

要在单个语句中指定多项操作，请使用逗号将它们隔开，如下所示：

```
"Action": [
      "ec2:action1",
      "ec2:action2"
```

您也可以使用通配符 （\$1) 指定多个操作。例如，要指定以单词 `Describe` 开头的所有操作，包括以下操作：

```
"Action": "iot:Describe*"
```

要查看 AWS IoT 操作列表，请参阅 *IAM 用户指南 AWS IoT*中的[定义操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

#### Device Advisor 操作
<a name="security_iam_service-actions-device-advisor"></a>

下表列出了 IAM物联网Device Advisor 操作、关联的 AWS IoT Device Advisor API 以及操作处理的资源。


****  

| 策略操作 | AWS IoT API | 资源 | 
| --- | --- | --- | 
| iotdeviceAdvisor：CreateSuiteDefinition | CreateSuiteDefinition |  无  | 
| iotdeviceAdvisor：DeleteSuiteDefinition | DeleteSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceAdvisor：GetSuiteDefinition | GetSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceAdvisor：GetSuiteRun | GetSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-run-id`  | 
| iotdeviceAdvisor：GetSuiteRunReport | GetSuiteRunReport |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceAdvisor：ListSuiteDefinitions | ListSuiteDefinitions | 无 | 
| iotdeviceAdvisor：ListSuiteRuns | ListSuiteRuns |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceAdvisor：ListTagsForResource | ListTagsForResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceAdvisor：StartSuiteRun | StartSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceAdvisor：TagResource | TagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceAdvisor：UntagResource | UntagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceAdvisor：UpdateSuiteDefinition | UpdateSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceAdvisor：StopSuiteRun | StopSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 

 AWS IoT 设备顾问中的策略操作在操作前使用以下前缀:`iotdeviceadvisor:`. 例如，要授予某人列出他们在 ListSuiteDefinitions API 中注册的所有套件定义 AWS 账户 的权限，您需要将该`iotdeviceadvisor:ListSuiteDefinitions`操作包含在他们的策略中。

### 资源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Resource` JSON 策略元素指定要向其应用操作的一个或多个对象。作为最佳实践，请使用其 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)指定资源。对于不支持资源级权限的操作，请使用通配符 (\$1) 指示语句应用于所有资源。

```
"Resource": "*"
```


**AWS IoT 资源**  

| 策略操作 | AWS IoT API | 资源 | 
| --- | --- | --- | 
| 物联网：AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 账户 指定的必须是证书要转移到的账户。   | 
| 物联网：AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：AssociateTargetsWithJob | AssociateTargetsWithJob | 无  | 
| 物联网：AttachPolicy | AttachPolicy | `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或者 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 账户 指定的必须是证书要转移到的账户。   | 
| 物联网：CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ClearDefaultAuthorizer | ClearDefaultAuthorizer | 无 | 
| 物联网：CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| 物联网：CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| 物联网：CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| 物联网：CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| CreatePolicyVersion | 物联网：CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  这必须是 AWS IoT 策略，而不是 IAM 策略。   | 
| 物联网：CreateRoleAlias | CreateRoleAlias |  (参数：roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 针对要创建的组和父组 (如果使用)  | 
| 物联网：CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| 物联网:删除 CACertificate | 删除 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| 物联网：DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网:deletev2 LoggingLevel | deleteV2 LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (参数：authorizerName) none  | 
| 物联网:描述 CACertificate | 描述 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 无  | 
| 物联网：DescribeEndpoint | DescribeEndpoint | \$1 | 
| 物联网：DescribeEventConfigurations | DescribeEventConfigurations | none  | 
| 物联网：DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| 物联网：DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：DescribeJobExecution | DescribeJobExecution | 无 | 
| 物联网：DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| 物联网：DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DescribeThingRegistrationTask | DescribeThingRegistrationTask | 无 | 
| 物联网：DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| 物联网：DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 或者 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：GetIndexingConfiguration | GetIndexingConfiguration | 无 | 
| 物联网：GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| 物联网：GetLoggingOptions | GetLoggingOptions | \$1 | 
| 物联网：GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：GetRegistrationCode | GetRegistrationCode | \$1 | 
| 物联网：GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或者 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListAuthorizers | ListAuthorizers | 无 | 
| 物联网:列表 CACertificates | 名单 CACertificates | \$1 | 
| 物联网：ListCertificates | ListCertificates | \$1 | 
| 物联网：ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| 物联网：ListIndices | ListIndices | 无 | 
| 物联网：ListJobExecutionsForJob | ListJobExecutionsForJob | 无 | 
| 物联网：ListJobExecutionsForThing | ListJobExecutionsForThing | 无 | 
| 物联网：ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 如果使用 thingGroupName 参数  | 
| 物联网：ListJobTemplates | ListJobTemplates | 无 | 
| 物联网：ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| 物联网：ListPolicies | ListPolicies | \$1 | 
| 物联网：ListPolicyPrincipals | ListPolicyPrincipals |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：ListRoleAliases | ListRoleAliases | 无 | 
| 物联网：ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：ListThingGroups | ListThingGroups | 无 | 
| 物联网：ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 无 | 
| 物联网：ListThingRegistrationTasks | ListThingRegistrationTasks | 无 | 
| 物联网：ListThingTypes | ListThingTypes | \$1 | 
| 物联网：ListThings | ListThings | \$1 | 
| 物联网：ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：ListTopicRules | ListTopicRules | \$1 | 
| IoT: listv2 LoggingLevels | Listv2 LoggingLevels | 无 | 
| 物联网:注册 CACertificate | 注册 CACertificate | \$1 | 
| 物联网：RegisterCertificate | RegisterCertificate | \$1 | 
| 物联网：RegisterThing | RegisterThing | 无 | 
| 物联网：RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| 物联网：SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| 物联网：SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| 物联网：SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| 物联网：SetLoggingOptions | SetLoggingOptions | \$1 | 
| IoT: setv2 LoggingLevel | setv2 LoggingLevel | \$1 | 
| IoT: setv2 LoggingOptions | setv2 LoggingOptions | \$1 | 
| 物联网：StartThingRegistrationTask | StartThingRegistrationTask | 无 | 
| 物联网：StopThingRegistrationTask | StopThingRegistrationTask | 无 | 
| 物联网：TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：TestInvokeAuthorizer | TestInvokeAuthorizer | 无 | 
| 物联网：TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| 物联网:更新 CACertificate | 更新 CACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| 物联网：UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| 物联网：UpdateEventConfigurations | UpdateEventConfigurations | 无 | 
| 物联网：UpdateIndexingConfiguration | UpdateIndexingConfiguration | 无 | 
| 物联网：UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| 物联网：UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| 物联网：UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| 物联网：UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 

有关格式的更多信息 ARNs，请参阅 [Amazon 资源名称 (ARNs) 和 AWS 服务命名空间](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

某些 AWS IoT 操作（例如创建资源的操作）无法对特定资源执行。在这些情况下，您必须使用通配符（\$1)。

```
"Resource": "*"
```

要查看 AWS IoT 资源类型及其列表 ARNs，请参阅 *IAM 用户指南 AWS IoT*中的[由定义的资源](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-resources-for-iam-policies)。要了解您可以在哪些操作中指定每个资源的 ARN，请参阅 [AWS IoT定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

#### Device Advisor 资源
<a name="security_iam_service-device-advisor-resources"></a>

要为 Device Advisor IAM 策略定义资源级限制，请使用以下资源 ARN 格式来定义套件和套件运行。 AWS IoT 

套件定义资源 ARN 格式  
`arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`

套件运行资源 ARN 格式  
`arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`

### 条件键
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Condition` 元素根据定义的条件指定语句何时执行。您可以创建使用[条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)（例如，等于或小于）的条件表达式，以使策略中的条件与请求中的值相匹配。要查看所有 AWS 全局条件键，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

AWS IoT 定义自己的条件键集，还支持使用一些全局条件键。要查看所有 AWS 全局条件键，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_condition-keys.html)。


**AWS IoT 条件键**  

| AWS IoT 条件键 | 描述 | Type | 
| --- | --- | --- | 
| aws:RequestTag/\$1\$1tag-key\$1 | 用户向 AWS IoT发出的请求中包含的标签键。 | 字符串 | 
| aws:ResourceTag/\$1\$1tag-key\$1 | 附加到 AWS IoT 资源的标签的标签密钥组件。 | 字符串 | 
| aws:TagKeys | 与请求中的资源关联的所有标签键名称的列表。 | 字符串 | 

要查看 AWS IoT 条件键列表，请参阅 *IAM 用户指南 AWS IoT*中的[条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-policy-keys)。要了解您可以使用条件键的操作和资源，请参阅[操作定义者 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

### 示例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



要查看 AWS IoT 基于身份的策略的示例，请参阅。[AWS IoT 基于身份的策略示例](security_iam_id-based-policy-examples.md)

## AWS IoT 基于资源的政策
<a name="security_iam_service-with-iam-resource-based-policies"></a>

基于资源的策略是 JSON 策略文档，用于指定委托人可以在哪些条件下对 AWS IoT 资源执行哪些操作。

AWS IoT 不支持基于 IAM 资源的策略。但是，它确实支持 AWS IoT 基于资源的政策。有关更多信息，请参阅 [AWS IoT Core 政策](iot-policies.md)。

## 基于 AWS IoT 标签的授权
<a name="security_iam_service-with-iam-tags"></a>

您可以为 AWS IoT 资源附加标签或在请求中传递标签 AWS IoT。要基于标签控制访问，您需要使用 `iot:ResourceTag/key-name``aws:RequestTag/key-name` 或 `aws:TagKeys` 条件键在策略的[条件元素](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements_condition.html)中提供标签信息。有关更多信息，请参阅 [在 IAM 策略中使用标签](tagging-iot-iam.md)。有关为 AWS IoT 资源添加标签的更多信息，请参阅[为资源添加 AWS IoT 标签](tagging-iot.md)。

要查看基于身份的策略（用于根据资源上的标签来限制对该资源的访问）的示例，请参阅[根据标签查看 AWS IoT 资源](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-view-thing-tags)。

## AWS IoT IAM 角色
<a name="security_iam_service-with-iam-roles"></a>

I [AM 角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html)是您内部具有特定权限 AWS 账户 的实体。

### 将临时凭证与 AWS IoT
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

可以使用临时凭证进行联合身份验证登录，分派 IAM 角色或分派跨账户角色。您可以通过调用[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)或之类的 AWS STS API 操作来获取临时安全证书[GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html)。

AWS IoT 支持使用临时证书。

### 服务关联角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

[服务相关角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles_terms-and-concepts.html#iam-term-service-linked-role)允许 AWS 服务访问其他服务中的资源以代表您完成操作。服务关联角色显示在 IAM 账户中，并归该服务所有。IAM 管理员可以查看但不能编辑服务关联角色的权限。

AWS IoT 不支持服务相关角色。

### 服务角色
<a name="security_iam_service-with-iam-roles-service"></a>

此功能允许服务代表您担任[服务角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles_terms-and-concepts.html#iam-term-service-role)。此角色允许服务访问其他服务中的资源以代表您完成操作。服务角色显示在 IAM 账户中，并归该账户所有。这意味着，IAM 管理员可以更改该角色的权限。但是，这样做可能会中断服务的功能。

# AWS IoT 基于身份的策略示例
<a name="security_iam_id-based-policy-examples"></a>

默认情况下，IAM 用户和角色没有创建或修改 AWS IoT 资源的权限。他们也无法使用 AWS 管理控制台 AWS CLI、或 AWS API 执行任务。IAM 管理员必须创建 IAM 策略，以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后，管理员必须将这些策略附加到需要这些权限的用户或组。

要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略，请参阅《IAM 用户指南》**中的[在 JSON 选项卡上创建策略](https://docs.aws.amazon.com/service-authorization/latest/reference/access_policies_create.html#access_policies_create-json-editor)。

**Topics**
+ [策略最佳实践](#security_iam_service-with-iam-policy-best-practices)
+ [使用控制 AWS IoT 台](#security_iam_id-based-policy-examples-console)
+ [允许用户查看他们自己的权限](#security_iam_id-based-policy-examples-view-own-permissions)
+ [根据标签查看 AWS IoT 资源](#security_iam_id-based-policy-examples-view-thing-tags)
+ [根据标签查看 AWS IoT 设备顾问资源](#security_iam-device-advisor-tags)

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略决定了某人是否可以在您的账户中创建、访问或删除 AWS IoT 资源。这些操作可能会使 AWS 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **开始使用 AWS 托管策略并转向最低权限权限** — 要开始向用户和工作负载授予权限，请使用为许多常见用例授予权限的*AWS 托管策略*。它们在你的版本中可用 AWS 账户。我们建议您通过定义针对您的用例的 AWS 客户托管策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果服务操作是通过特定的方式使用的，则也可以使用条件来授予对服务操作的访问权限 AWS 服务，例如 CloudFormation。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证 (MFA**)-如果 AWS 账户您的场景需要 IAM 用户或根用户，请启用 MFA 以提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 使用控制 AWS IoT 台
<a name="security_iam_id-based-policy-examples-console"></a>

要访问 AWS IoT 控制台，您必须拥有一组最低权限。这些权限必须允许您列出和查看有关您的 AWS IoT 资源的详细信息 AWS 账户。如果创建比必需的最低权限更为严格的基于身份的策略，对于附加了该策略的实体（用户或角色），控制台将无法按预期正常运行。

为确保这些实体仍然可以使用 AWS IoT 控制台，还要将以下 AWS 托管策略附加到这些实体：`AWSIoTFullAccess`。有关更多信息，请参阅《IAM 用户指南》**中的[为用户添加权限](https://docs.aws.amazon.com/service-authorization/latest/reference/id_users_change-permissions.html#users_change_permissions-add-console)。

对于仅调用 AWS CLI 或 AWS API 的用户，您无需为其设置最低控制台权限。相反，只允许访问与您尝试执行的 API 操作相匹配的操作。

## 允许用户查看他们自己的权限
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

该示例说明了您如何创建策略，以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上或使用 AWS CLI 或 AWS API 以编程方式完成此操作的权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## 根据标签查看 AWS IoT 资源
<a name="security_iam_id-based-policy-examples-view-thing-tags"></a>

您可以在基于身份的策略中使用条件，以便基于标签控制对 AWS IoT 资源的访问。该示例说明了如何创建策略以允许查看事物。不过，只有在事物标签 `Owner` 具有该用户的用户名值时，才会授予权限。此策略还授予在控制台上完成此操作的必要权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListBillingGroupsInConsole",
            "Effect": "Allow",
            "Action": "iot:ListBillingGroups",
            "Resource": "*"
        },
        {
            "Sid": "ViewBillingGroupsIfOwner",
            "Effect": "Allow",
           "Action": "iot:DescribeBillingGroup",
            "Resource": "arn:aws:iot:*:*:billinggroup/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/Owner": "${aws:username}"}
        }
        }
    ]
}
```

您可以将该策略附加到您账户中的 IAM 用户。如果名为的用户`richard-roe`尝试查看 AWS IoT 账单组，则必须将该账单组标记为`Owner=richard-roe`或`owner=richard-roe`。否则，他将被拒绝访问。条件标签键 `Owner` 匹配 `Owner` 和 `owner`，因为条件键名称不区分大小写。有关更多信息，请参阅 *IAM 用户指南* 中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements_condition.html)。

## 根据标签查看 AWS IoT 设备顾问资源
<a name="security_iam-device-advisor-tags"></a>

您可以在基于身份的策略中使用条件，以便基于标签控制对 AWS IoT Device Advisor 资源的访问。以下示例说明如何创建策略以允许查看特定套件定义。但是，仅当套件定义标签具有值设置为 `MQTT` 的 `SuiteType` 时，才会授予权限。此策略还授予在控制台上完成此操作的必要权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewSuiteDefinition",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:GetSuiteDefinition",
            "Resource": "arn:aws:iotdeviceadvisor:*:*:suitedefinition/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/SuiteType": "MQTT"}
        }
        }
    ]
}
```

# AWS 的托管策略 AWS IoT
<a name="security-iam-awsmanpol"></a>







要向用户、群组和角色添加权限，使用 AWS 托管策略比自己编写策略要容易得多。创建仅为团队提供所需权限的 [IAM 客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)需要时间和专业知识。要快速入门，您可以使用我们的 AWS 托管策略。这些策略涵盖常见使用案例，可在您的 AWS 账户中使用。有关 AWS 托管策略的更多信息，请参阅 *IAM 用户指南*中的[AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

AWS 服务维护和更新 AWS 托管策略。您无法更改 AWS 托管策略中的权限。服务偶尔会向 AWS 托管式策略添加额外权限以支持新特征。此类更新会影响附加策略的所有身份（用户、组和角色）。当启动新特征或新操作可用时，服务最有可能会更新 AWS 托管式策略。服务不会从 AWS 托管策略中移除权限，因此策略更新不会破坏您的现有权限。

此外，还 AWS 支持跨多个服务的工作职能的托管策略。例如，**ReadOnlyAccess** AWS 托管策略提供对所有 AWS 服务和资源的只读访问权限。当服务启动新特征时， AWS 会为新操作和资源添加只读权限。有关工作职能策略的列表和说明，请参阅 *IAM 用户指南*中的[适用于工作职能的AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。

**注意**  
AWS IoT 适用于两者 AWS IoT 和 IAM 策略。本主题仅讨论 IAM 策略，它为控制面板和数据面板 API 操作定义策略操作。另请参阅[AWS IoT Core 政策](iot-policies.md)。









## AWS 托管策略： AWSIoTConfig访问权限
<a name="security-iam-awsmanpol-AWSIoTConfigAccess"></a>





您可以将 `AWSIoTConfigAccess` 策略附加到 IAM 身份。



此策略向相关身份授予权限，以允许访问所有 AWS IoT 配置操作。此策略可能会影响数据处理和存储。要在中查看此政策 AWS 管理控制台，请参阅[AWSIoTConfig访问权限](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigAccess$jsonEditor?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot`— 检索 AWS IoT 数据并执行物联网配置操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AcceptCertificateTransfer",
                "iot:AddThingToThingGroup",
                "iot:AssociateTargetsWithJob",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CancelCertificateTransfer",
                "iot:CancelJob",
                "iot:CancelJobExecution",
                "iot:ClearDefaultAuthorizer",
                "iot:CreateAuthorizer",
                "iot:CreateCertificateFromCsr",
                "iot:CreateJob",
                "iot:CreateKeysAndCertificate",
                "iot:CreateOTAUpdate",
                "iot:CreatePolicy",
                "iot:CreatePolicyVersion",
                "iot:CreateRoleAlias",
                "iot:CreateStream",
                "iot:CreateThing",
                "iot:CreateThingGroup",
                "iot:CreateThingType",
                "iot:CreateTopicRule",
                "iot:DeleteAuthorizer",
                "iot:DeleteCACertificate",
                "iot:DeleteCertificate",
                "iot:DeleteJob",
                "iot:DeleteJobExecution",
                "iot:DeleteOTAUpdate",
                "iot:DeletePolicy",
                "iot:DeletePolicyVersion",
                "iot:DeleteRegistrationCode",
                "iot:DeleteRoleAlias",
                "iot:DeleteStream",
                "iot:DeleteThing",
                "iot:DeleteThingGroup",
                "iot:DeleteThingType",
                "iot:DeleteTopicRule",
                "iot:DeleteV2LoggingLevel",
                "iot:DeprecateThingType",
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachPrincipalPolicy",
                "iot:DetachThingPrincipal",
                "iot:DisableTopicRule",
                "iot:EnableTopicRule",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:RegisterCACertificate",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RejectCertificateTransfer",
                "iot:RemoveThingFromThingGroup",
                "iot:ReplaceTopicRule",
                "iot:SearchIndex",
                "iot:SetDefaultAuthorizer",
                "iot:SetDefaultPolicyVersion",
                "iot:SetLoggingOptions",
                "iot:SetV2LoggingLevel",
                "iot:SetV2LoggingOptions",
                "iot:StartThingRegistrationTask",
                "iot:StopThingRegistrationTask",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:TransferCertificate",
                "iot:UpdateAuthorizer",
                "iot:UpdateCACertificate",
                "iot:UpdateCertificate",
                "iot:UpdateEventConfigurations",
                "iot:UpdateIndexingConfiguration",
                "iot:UpdateRoleAlias",
                "iot:UpdateStream",
                "iot:UpdateThing",
                "iot:UpdateThingGroup",
                "iot:UpdateThingGroupsForThing",
                "iot:UpdateAccountAuditConfiguration",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DeleteAccountAuditConfiguration",
                "iot:StartOnDemandAuditTask",
                "iot:CancelAuditTask",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:CreateScheduledAudit",
                "iot:UpdateScheduledAudit",
                "iot:DeleteScheduledAudit",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:CreateSecurityProfile",
                "iot:DescribeSecurityProfile",
                "iot:UpdateSecurityProfile",
                "iot:DeleteSecurityProfile",
                "iot:AttachSecurityProfile",
                "iot:DetachSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 托管策略： AWSIoTConfigReadOnlyAccess
<a name="security-iam-awsmanpol-AWSIoTConfigReadOnlyAccess"></a>





您可以将 `AWSIoTConfigReadOnlyAccess` 策略附加到 IAM 身份。



此策略向相关身份授予权限，以允许只读访问所有 AWS IoT 配置操作。要在中查看此政策 AWS 管理控制台，请参阅[AWSIoTConfigReadOnlyAccess](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigReadOnlyAccess$jsonEditor?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot` – 对物联网配置操作执行只读操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:SearchIndex",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:DescribeSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 托管策略： AWSIoTData访问权限
<a name="security-iam-awsmanpol-AWSIoTDataAccess"></a>





您可以将 `AWSIoTDataAccess` 策略附加到 IAM 身份。



此策略授予相关的身份权限，允许访问所有 AWS IoT 数据操作。数据操作通过 MQTT 或 HTTP 协议发送数据。要在 AWS 管理控制台中查看该策略，请参阅 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot`— 检索 AWS IoT 数据并允许对 AWS IoT 消息操作进行完全访问权限。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",
                "iot:DeleteThingShadow",
                "iot:ListNamedShadowsForThing"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 托管策略： AWSIoTFull访问权限
<a name="security-iam-awsmanpol-AWSIoTFullAccess"></a>





您可以将 `AWSIoTFullAccess` 策略附加到 IAM 身份。



此策略向相关身份授予权限，以允许访问所有 AWS IoT 配置和消息收发操作。要在中查看此政策 AWS 管理控制台，请参阅[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot`— 检索 AWS IoT 数据并允许完全访问 AWS IoT 配置和消息传送操作。
+ `iotjobsdata`— 检索 AWS IoT 作业数据并允许完全访问 AWS IoT 任务数据平面 API 操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*",
                "iotjobsdata:*"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 托管策略： AWSIoTLogging
<a name="security-iam-awsmanpol-AWSIoTLogging"></a>





您可以将 `AWSIoTLogging` 策略附加到 IAM 身份。



此策略授予相关的身份权限，允许用户创建 Amazon CloudWatch Logs 群组并将日志流式传输到这些群组。此策略已附加到您的 CloudWatch 日志记录角色。要在中查看此政策 AWS 管理控制台，请参阅[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `logs`— 检索 CloudWatch 日志。还允许创建 CloudWatch 日志组并将日志流式传输到这些组。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy",
                "logs:GetLogEvents",
                "logs:DeleteLogStream"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

## AWS 托管策略： AWSIoTOTAUpdate
<a name="security-iam-awsmanpol-AWSIoTOTAUpdate"></a>





您可以将 `AWSIoTOTAUpdate` 策略附加到 IAM 身份。



此策略授予相关的身份权限，允许访问创建 AWS IoT 作业、 AWS IoT 代码签名作业和描述 AWS 代码签名者作业。要在中查看此政策 AWS 管理控制台，请参阅[`AWSIoTOTAUpdate`。](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTOTAUpdate?section=permissions)



**权限详细信息**

该策略包含以下权限。




+ `iot`— 创建 AWS IoT 工作和代码签名作业。
+ `signer`— 创建 AWS 代码签名者作业。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "iot:CreateJob",
            "signer:DescribeSigningJob"
        ],
        "Resource": "*"
    }
}
```

## AWS 托管策略： AWSIoTRule操作
<a name="security-iam-awsmanpol-AWSIoTRuleActions"></a>





您可以将 `AWSIoTRuleActions` 策略附加到 IAM 身份。



此策略授予相关的身份权限，允许访问 AWS IoT 规则操作中支持的所有 AWS 服务人。要在中查看此政策 AWS 管理控制台，请参阅[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot` - 执行用于发布规则操作消息的操作。
+ `dynamodb` - 将消息插入到 DynamoDB 表或将消息拆分为 DynamoDB 表的多列。
+ `s3` - 将对象存储在 Amazon S3 存储桶中。
+ `kinesis` - 将消息发送到 Amazon Kinesis 流对象。
+ `firehose` - 在 Firehose 流对象中插入记录。
+ `cloudwatch`-更改 CloudWatch 警报状态或向 CloudWatch指标发送消息数据。
+ `sns` - 执行使用 Amazon SNS 发布通知的操作。此操作的范围仅限于 AWS IoT SNS 主题。
+ `sqs` - 插入要添加到 SQS 队列的消息。
+ `es`-向 OpenSearch 服务服务发送消息。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "dynamodb:PutItem",
            "kinesis:PutRecord",
            "iot:Publish",
            "s3:PutObject",
            "sns:Publish",
            "sqs:SendMessage*",
            "cloudwatch:SetAlarmState",
            "cloudwatch:PutMetricData",
            "es:ESHttpPut",
            "firehose:PutRecord"
        ],
        "Resource": "*"
    }
}
```

## AWS 托管策略： AWSIoTThings注册
<a name="security-iam-awsmanpol-AWSIoTThingsRegistration"></a>





您可以将 `AWSIoTThingsRegistration` 策略附加到 IAM 身份。



此策略向相关身份授予权限，以允许使用 `StartThingRegistrationTask` API 批量注册事物。此策略可能会影响数据处理和存储。要在中查看此政策 AWS 管理控制台，请参阅[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions)。



**权限详细信息**

该策略包含以下权限。




+ `iot` - 批量注册时，执行用于创建内容以及附加策略和证书的操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AddThingToThingGroup",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateCertificateFromCsr",
                "iot:CreatePolicy",
                "iot:CreateThing",
                "iot:DescribeCertificate",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachThingPrincipal",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RemoveThingFromThingGroup",
                "iot:UpdateCertificate",
                "iot:UpdateThing",
                "iot:UpdateThingGroupsForThing",
                "iot:AddThingToBillingGroup",
                "iot:DescribeBillingGroup",
                "iot:RemoveThingFromBillingGroup"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```





## AWS IoT AWS 托管策略的更新
<a name="security-iam-awsmanpol-updates"></a>



查看 AWS IoT 自该服务开始跟踪这些更改以来 AWS 托管策略更新的详细信息。要获得有关此页面更改的自动提醒，请订阅 “ AWS IoT 文档历史记录” 页面上的 RSS feed。




| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  [AWSIoTFull访问权限](#security-iam-awsmanpol-AWSIoTFullAccess)-更新现有策略  |  AWS IoT 添加了新的权限，允许用户使用 HTTP 协议访问 AWS IoT 任务数据平面 API 操作。 新的 IAM 策略前缀可为您提供更精细的访问控制，以访问 AWS IoT 任务数据平面终端节点。`iotjobsdata:`对于控制面板 API 操作，您仍然使用 `iot:` 前缀。有关更多信息，请参阅 [AWS IoT Core HTTPS 协议的策略](iot-data-plane-jobs.md#iot-jobs-data-http)。  | 2022 年 5 月 11 日 | 
|  AWS IoT 开始跟踪更改  |  AWS IoT 开始跟踪其 AWS 托管策略的更改。  | 2022 年 5 月 11 日 | 

# 对 AWS IoT 身份和访问进行故障排除
<a name="security_iam_troubleshoot"></a>

使用以下信息来帮助您诊断和修复在使用 AWS IoT 和 IAM 时可能遇到的常见问题。

**Topics**
+ [我无权在以下位置执行操作 AWS IoT](#security_iam_troubleshoot-no-permissions)
+ [我无权执行 iam：PassRole](#security_iam_troubleshoot-passrole)
+ [我想允许我以外的人 AWS 账户 访问我的 AWS IoT 资源](#security_iam_troubleshoot-cross-account-access)

## 我无权在以下位置执行操作 AWS IoT
<a name="security_iam_troubleshoot-no-permissions"></a>

如果您收到错误提示，指明您无权执行某个操作，则必须更新策略以允许执行该操作。

如果 IAM 用户 `mateojackson` 尝试使用控制台查看有关事物资源的详细信息，但没有 `iot:DescribeThing` 权限，则会出现以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iot:DescribeThing on resource: MyIoTThing
```

在此情况下，必须更新 `mateojackson` 用户的策略，以允许使用 `iot:DescribeThing` 操作访问事物资源。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

使用 AWS IoT 设备顾问  
如果您使用的是 De AWS IoT vice Advisor，则当用户`mateojackson`尝试使用控制台查看有关套件定义的详细信息但没有`iotdeviceadvisor:GetSuiteDefinition`权限时，会出现以下示例错误。  

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iotdeviceadvisor:GetSuiteDefinition on resource: MySuiteDefinition
```
在此情况下，必须更新 `mateojackson` 用户的策略，以允许使用 `iotdeviceadvisor:GetSuiteDefinition` 操作访问 *`MySuiteDefinition`* 资源。

## 我无权执行 iam：PassRole
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到一个错误，表明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给。 AWS IoT

有些 AWS 服务 允许您将现有角色传递给该服务，而不是创建新的服务角色或服务相关角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 AWS IoT中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

## 我想允许我以外的人 AWS 账户 访问我的 AWS IoT 资源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表 (ACLs) 的服务，您可以使用这些策略向人们授予访问您的资源的权限。

要了解更多信息，请参阅以下内容：
+ 要了解是否 AWS IoT 支持这些功能，请参阅[如何 AWS IoT 与 IAM 配合使用](security_iam_service-with-iam.md)。
+ 要了解如何提供对您拥有的资源的访问权限 AWS 账户 ，请参阅 [IAM 用户*指南中的向您拥有 AWS 账户 的另一个 IAM 用户*提供访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)权限。
+ 要了解如何向第三方提供对您的资源的访问[权限 AWS 账户，请参阅 *IAM 用户指南*中的向第三方提供](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)访问权限。 AWS 账户 
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 日志记录和监控
<a name="security-logging"></a>

监控是维护 AWS 解决方案的可靠性、可用性和性能的重要组成部分。 AWS IoT 您应该从 AWS 解决方案的各个部分收集监控数据，以便在出现多点故障时可以更轻松地进行调试。有关日志记录和监控流程的信息，请参阅 [监控 AWS IoT](monitoring_overview.md)

## 监控工具
<a name="monitoring_automated_manual"></a>

AWS 提供了可用于监控的工具 AWS IoT。您可以配置其中的一些工具以便进行监控。一些工具需要手动干预。建议您尽可能实现监控任务自动化。

### 自动监控工具
<a name="monitoring_automated_tools"></a>

您可以使用以下自动监控工具来监视 AWS IoT 和报告何时出现问题：
+ **A CloudWatch mazon** Alarms — 在您指定的时间段内观察单个指标，并根据该指标在多个时间段内相对于给定阈值的值执行一项或多项操作。该操作是发送到亚马逊简单通知服务 (Amazon SNS) Simple Notification Scaling 主题或亚马逊 EC2 Auto Scaling 策略的通知。 CloudWatch 警报不会仅仅因为它们处于特定状态就调用操作。该状态必须已改变并在指定的若干个时间段内保持不变。有关更多信息，请参阅 [使用 Amazon 监控 AWS IoT 警报和指标 CloudWatch](monitoring-cloudwatch.md)。
+ **Amazon CloudWatch Logs** — 监控、存储和访问来自 AWS CloudTrail 或其他来源的日志文件。Ama CloudWatch zon Logs 还允许您查看 AWS IoT 设备顾问测试用例采取的关键步骤、生成的事件以及从您的设备或测试执行 AWS IoT Core 期间发送的 MQTT 消息。这些日志使您能够在设备上进行调试和采取纠正措施。有关更多信息，请参阅[AWS IoT 使用 CloudWatch 日志进行监控](cloud-watch-logs.md)有关使用 Amazon 的更多信息 CloudWatch，请参阅*亚马逊 CloudWatch 用户指南*中的[监控日志文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)。
+ **Amazon CloudWatch ** Events — 匹配事件并将其路由到一个或多个目标函数或流，以进行更改、捕获状态信息并采取纠正措施。有关更多信息，请参阅《[亚马逊* CloudWatch 用户指南》中的什么是亚马逊 CloudWatch*活动](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchEvents.html)。
+ **AWS CloudTrail 日志监控**-在账户之间共享日志文件，通过将 CloudTrail 日志文件发送到 “日志” 来实时监控 CloudWatch 日志文件，用 Java 编写日志处理应用程序，并验证您的日志文件在传送后是否未更改 CloudTrail。有关更多信息，请参阅[使用记录 AWS IoT API 调用 AWS CloudTrail](iot-using-cloudtrail.md)《*AWS CloudTrail 用户指南》*中的 “[使用 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-working-with-log-files.html)”。

### 手动监控工具
<a name="monitoring_manual_tools"></a>

监控 AWS IoT 的另一个重要部分是手动监控 CloudWatch 警报未涵盖的项目。 AWS IoT CloudWatch、和其他 AWS 服务控制台仪表板提供了 AWS 环境状态的 at-a-glance视图。我们建议您同时查看日志文件 AWS IoT。
+ AWS IoT 仪表板显示：
  + CA 证书
  + 证书
  + 策略
  + Rules
  + 事物
+ CloudWatch 主页显示：
  + 当前警报和状态。
  + 警报和资源的图表。
  + 服务运行状况。

  您可以使用 CloudWatch 执行以下操作：
  + 创建[自定义控制面板](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CloudWatch_Dashboards.html)以监控您关心的服务。
  + 绘制指标数据图，以排除问题并弄清楚趋势。
  + 搜索并浏览您的所有 AWS 资源指标。
  + 创建和编辑告警接收有关问题的通知。

# AWS IoT 核心的合规性验证
<a name="compliance"></a>

要了解是否属于特定合规计划的范围，请参阅AWS 服务 “[按合规计划划分的范围](https://aws.amazon.com/compliance/services-in-scope/)” ”，然后选择您感兴趣的合规计划。 AWS 服务 有关一般信息，请参阅[AWS 合规计划AWS](https://aws.amazon.com/compliance/programs/)。

您可以使用下载第三方审计报告 AWS Artifact。有关更多信息，请参阅中的 “[下载报告” 中的 “ AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规责任取决于您的数据的敏感性、贵公司的合规目标以及适用的法律和法规。有关您在使用时的合规责任的更多信息 AWS 服务，请参阅[AWS 安全文档](https://docs.aws.amazon.com/security/)。

# AWS 物联网核心的弹性
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基础设施是围绕 AWS 区域 s和可用区构建的。 AWS 区域 s 提供多个物理分隔和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络连接。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

有关 AWS 区域 s 和可用区的更多信息，请参阅[AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

AWS IoT Core 在设备注册表中存储有关您的设备的信息。此外，它还存储 CA 证书、设备证书和设备影子数据。发生硬件或网络故障时，此数据会跨可用区自动复制，但不会跨区域复制。

AWS IoT Core 更新设备注册表时发布 MQTT 事件。您可以使用这些消息来备份注册表数据并将其保存到某个位置（如 DynamoDB 表）。您负责保存为您 AWS IoT Core 创建的证书或您自己创建的证书。设备影子存储有关您设备的状态数据，并且可以在设备恢复在线时重新发送。 AWS IoT 设备顾问存储有关您的测试套件配置的信息。发生硬件或网络故障时，此数据将自动复制。

AWS IoT Core 资源是特定于区域的， AWS 区域 除非您特别这样做，否则不会跨区域复制。

有关安全性最佳实践的更多信息，请参阅 [中的安全最佳实践 AWS IoT Core](security-best-practices.md)。

# AWS IoT Core 与接口 VPC 终端节点一起使用
<a name="IoTCore-VPC"></a>

借助 AWS IoT Core，您可以使用[接口 VPC [终端节点在虚拟私有云 (VPC) 中创建物联网控制平面](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro)[终端节点和物联网数据](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html)终端节点](https://docs.aws.amazon.com//vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。接口 VPC 终端节点由 AWS PrivateLink一种 AWS 技术提供支持，您可以使用该技术 AWS 通过私有 IP 地址访问在其上运行的服务。有关更多信息，请参阅 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com//AmazonVPC/latest/UserGuide/VPC_Introduction.html)。

要将远程网络（例如公司网络）上的现场设备连接到您的 Amazon VPC，请参阅 V [Network-to-Amazon PC 连接列表中列出的选项](https://docs.aws.amazon.com//whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)。

**Topics**
+ [为 AWS IoT Core 控制平面创建 VPC 终端节点](#Create-VPC-endpoints-CP)
+ [为 AWS IoT Core 数据平面创建 VPC 终端节点](#Create-VPC-endpoints)
+ [为 AWS IoT Core 凭证提供者创建 VPC 终端节点](#Create-VPC-endpoints-credential-provider)
+ [创建 Amazon VPC 接口端点](#Create-VPC-endpoints-core-create-vpc)
+ [配置私有托管区](#connect-iot-core-create-phz-lns)
+ [控制 AWS IoT Core 通过 VPC 终端节点的访问权限](#Control-VPC-access)
+ [限制](#VPC-limitations)
+ [使用扩展 VPC 终端节点 AWS IoT Core](#Scaling-VPC-endpoints)
+ [将自定义域用于 VPC 端点](#VPC-custom-domains)
+ [VPC 终端节点的可用性 AWS IoT Core](#VPC-availability)
+ [对接口 VPC 终端节点使用 AWS IoT Device Management 安全隧道](IoTCore-ST-VPC.md)

## 为 AWS IoT Core 控制平面创建 VPC 终端节点
<a name="Create-VPC-endpoints-CP"></a>

您可以为 AWS IoT Core 控制平面 API 创建 VPC 终端节点，将您的设备连接到 AWS IoT 服务和其他 AWS 服务。要开始使用 VPC 终端节点，请[创建一个接口 VPC 终端节点](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)并选择 AWS IoT Core 作为 AWS 服务。如果您使用的是 CLI，[describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)请先致电确保您选择 AWS IoT Core 的是您的特定可用区 AWS 区域。例如，在 us-east-1 中，此命令将类似于：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.api
```

请参阅以下详细说明，为 AWS IoT Core 控制平面[创建 Amazon VPC 接口终端节点](#Create-VPC-endpoints-core-create-vpc)。

## 为 AWS IoT Core 数据平面创建 VPC 终端节点
<a name="Create-VPC-endpoints"></a>

您可以为 AWS IoT Core 数据平面 API 创建 VPC 终端节点，将您的设备连接到 AWS IoT 服务和其他 AWS 服务。要开始使用 VPC 终端节点，请[创建一个接口 VPC 终端节点](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)并选择 AWS IoT Core 作为 AWS 服务。如果您使用的是 CLI，[describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)请先致电确保您选择 AWS IoT Core 的是您的特定可用区 AWS 区域。例如，在 us-east-1 中，此命令将类似于：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.data
```

**注意**  
用于自动创建 DNS 记录的 VPC 特征已被禁用。要连接到这些端点，您必须手动创建私有 DNS 记录。有关私有 VPC DNS 记录的更多信息，请参阅 [接口终端节点的私有 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)。有关 AWS IoT Core VPC 限制的更多信息，请参阅[限制](#VPC-limitations)。

要将 MQTT 客户端连接到 VPC 端点接口，请执行以下操作：
+ 您必须在附加到 VPC 的私有托管区域中手动创建 DNS 记录。要开始使用，请参阅[创建私有托管区域](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。
+ 在您的私有托管区域中，为 VPC 端点的每个弹性网络接口 IP 创建别名记录。如果您有多个 VPC 终端节点 IPs 的多个网络接口，请为所有加权记录创建权重相等的加权 DNS 记录。按描述字段中的 VPC 终端节点 ID 筛选后，这些 IP 地址可从 [DescribeNetworkInterfaces](https://docs.aws.amazon.com//AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)API 调用中获得。

有关[创建 Amazon VPC 接口终端节点](#Create-VPC-endpoints-core-create-vpc)和为 AWS IoT Core 数据平面[配置私有托管区域](#connect-iot-core-create-phz-lns)，请参阅以下详细说明。

## 为 AWS IoT Core 凭证提供者创建 VPC 终端节点
<a name="Create-VPC-endpoints-credential-provider"></a>

您可以为 AWS IoT Core [凭证提供者](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)创建 VPC 终端节点，以便使用基于客户端证书的身份验证连接设备并获取[AWS 签名版本](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_aws-signing.html) 4 AWS 格式的临时证书。要开始使用 AWS IoT Core 证书提供者的 VPC 终端节点，请运行 [create-vpc-endpoint](https://docs.aws.amazon.com//cli/latest/reference/ec2/create-vpc-endpoint.html)CLI 命令[创建接口 VPC 终端节点](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)，然后选择 AWS IoT Core 凭证提供者作为服务。 AWS 为确保您选择的可用区与您的特定区域相同 AWS 区域，请先运行该[describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)命令。 AWS IoT Core 例如，在 us-east-1 中，此命令将类似于：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.credentials
```

**注意**  
用于自动创建 DNS 记录的 VPC 特征已被禁用。要连接到这些端点，您必须手动创建私有 DNS 记录。有关私有 VPC DNS 记录的更多信息，请参阅 [接口终端节点的私有 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)。有关 AWS IoT Core VPC 限制的更多信息，请参阅[限制](#VPC-limitations)。

要将 HTTP 客户端连接到 VPC 端点接口，请执行以下操作：
+ 您必须在附加到 VPC 的私有托管区域中手动创建 DNS 记录。要开始使用，请参阅[创建私有托管区域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。
+ 在您的私有托管区域中，为 VPC 端点的每个弹性网络接口 IP 创建别名记录。如果您有多个 VPC 终端节点 IPs 的多个网络接口，请为所有加权记录创建权重相等的加权 DNS 记录。按描述字段中的 VPC 终端节点 ID 筛选后，这些 IP 地址可从 [DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)API 调用中获得。

有关[创建 Amazon VPC 接口终端节点](#Create-VPC-endpoints-core-create-vpc)和为 AWS IoT Core 凭证提供者[配置私有托管区域的信息](#connect-iot-core-create-phz-lns)，请参阅以下详细说明。

## 创建 Amazon VPC 接口端点
<a name="Create-VPC-endpoints-core-create-vpc"></a>

您可以创建接口 VPC 终端节点以连接到由提供支持的 AWS 服务 AWS PrivateLink。使用以下步骤创建连接到 AWS IoT Core 数据平面或 AWS IoT Core 凭据提供程序的接口 VPC 终端节点。有关更多信息，请参阅[使用接口 VPC 终端节点访问 AWS 服务](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)。

**注意**  
为 AWS IoT Core 数据平面和 AWS IoT Core 证书提供者创建 Amazon VPC 接口终端节点的过程类似，但您必须对终端节点进行特定更改才能使连接正常运行。

 **通过 [VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **端点**控制台创建接口 VPC 端点** 

1. 导航到 [VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **端点**控制台，在左侧菜单的**虚拟私有云**下，选择**端点**，然后选择**创建端点**。

1. 在**创建端点**页面上，指定以下信息。
   + 为**服务类别**选择 **AWS 服务**。
   + 对于 **Service Name**（服务名称），通过输入关键字 `iot` 进行搜索。在显示的 `iot` 服务列表中，请选择端点。

     如果您为 AWS IoT Core 控制平面创建 VPC 终端节点，请为您的选择 AWS IoT Core 控制平面 API 终端节点 AWS 区域。终端节点的格式为 `com.amazonaws.region.iot.api`。

     如果您为 AWS IoT Core 数据平面创建 VPC 终端节点，请为您的区域选择 AWS IoT Core 数据平面 API 终端节点。终端节点的格式为 `com.amazonaws.region.iot.data`。

     如果您为 AWS IoT Core 凭证提供者创建 VPC 终端节点，请选择您所在地区的 AWS IoT Core 凭证提供商终端节点。终端节点的格式为 `com.amazonaws.region.iot.credentials`。

     如果您为联邦信息处理标准 (FIPS) 区域创建 VPC 终端节点，请为您选择 FIPS API 终端节点。 AWS 区域终端节点的格式为 `com.amazonaws.region.iot-fips.api`。这仅适用于控制平面。
**注意**  
中国地区 AWS IoT Core 数据平面的服务名称将`cn.com.amazonaws.region.iot.data`采用以下格式。中国地区 AWS IoT Core 控制平面的服务名称将`com.amazonaws.region.iot.api`采用以下格式。
   + 对于 **VPC** 和**子网**，选择要在其中创建终端节点的 VPC，以及要在其中创建终端节点网络的可用区 (AZs)。
   + 对于**启用 DNS 名称**，请确保没有**为 AWS IoT Core 数据平面和 AWS IoT Core 凭据提供程序选择为此端点启**用。 AWS IoT Core 数据平面和 AWS IoT Core 凭据提供商都不支持私有 DNS 名称。

     对于 AWS IoT Core 控制平面，默认选中 “**启用 DNS 名称**”。这样可以确保向 AWS IoT Core 控制平面公共终端节点发出的任何请求都将通过 VPC 终端节点进行路由。启用此功能后，您无需配置私有托管区域。
   + 对于 **Security group**（安全组），选择要与端点网络接口关联的安全组。
   + 您可以选择添加或删除标签。标签是用于与端点关联的名称-值对。

1. 要创建 VPC 端点，请选择**创建端点**。

创建 AWS PrivateLink 终端节点后，在终端节点的**详细信息**选项卡中，您将看到 DNS 名称列表。您可以使用在本部分中创建的这些 DNS 名称中的一个来[配置私有托管区域](#connect-iot-core-create-phz-lns)。如果您使用的是 AWS IoT Core 控制平面，则无需配置私有托管区域。

## 配置私有托管区
<a name="connect-iot-core-create-phz-lns"></a>

**注意**  
如果您使用的是 AWS IoT Core 控制平面并选择了 “**启用 DNS 名称**”，则无需配置私有托管区域。如果将其禁用，则必须按照以下步骤配置私有托管区域。

您可以使用在上一部分中创建的这些 DNS 名称中的一个来配置私有托管区域。

 **对于 AWS IoT Core 数据平面** 

DNS 名称必须是您的域配置名称或 `IoT:Data-ATS` 端点。DNS 名称的示例，可以是：` xxx-ats.data.iot.region.amazonaws.com`。

 **对于 AWS IoT Core 凭证提供商** 

DNS 名称必须是您的 `iot:CredentialProvider` 端点。DNS 名称的示例，可以是：` xxxx.credentials.iot.region.amazonaws.com`。

 **用于 AWS IoT Core 控制平面** 

DNS 名称必须是您的 AWS IoT Core 控制平面终端节点。 AWS IoT Core 控制平面的 DNS 名称示例如下` xxxx.api.iot.region.amazonaws.com`。

**注意**  
为 AWS IoT Core 数据平面和 AWS IoT Core 凭据提供程序配置私有托管区域的过程类似，但是您必须对端点进行特定更改才能使连接正常运行。

### 创建私有托管区域
<a name="connect-iot-core-create-phz-lns-private-hosted-zone"></a>

 **使用 Route 53 控制台创建私有托管区域** 

1. 导航到 [Route 53](https://console.aws.amazon.com/route53/v2/hostedzones#/) **托管区域**控制台并选择 **Create hosted zone**（创建托管区域）。

1. 在 **Create hosted zone**（创建托管区域）页面上，指定以下信息。
   + 在**域名**中，输入您的 `iot:Data-ATS` 或 `iot:CredentialProvider` 端点的端点地址。以下 AWS CLI 命令显示如何通过公共网络获取端点：`aws iot describe-endpoint --endpoint-type iot:Data-ATS` 或 `aws iot describe-endpoint --endpoint-type iot:CredentialProvider`。
**注意**  
如果您使用的是自定义域，请参阅[将自定义域与 VPC 端点结合使用](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html#VPC-custom-domains)。 AWS IoT Core 凭据提供者不支持自定义域名。
   + 对于 **Type**（类型），选择 **Private hosted zone**（私有托管区域）。
   + 或者，您可以添加或删除要与托管区域关联的标签。

1. 要创建您的私有托管区域，请选择 **Create hosted zone**（创建托管区域）。

有关更多信息，请参阅[创建私有托管区域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。

### 创建记录
<a name="connect-iot-core-create-phz-lns-create-record"></a>

创建私有托管区域后，您可以创建一个记录，告诉 DNS 如何将流量路由到该域。

 **创建记录** 

1. 在显示的托管区域列表中，选择您之前创建的私有托管区域，然后选择 **Create record**（创建记录）。

1. 使用向导提供的方法创建记录。如果控制台为您提供了 **Quick create**（快速创建）的方法，选择 **Switch to wizard**（切换到向导）。

1. 在 **Routing policy**（路由策略）中选择 **Simple Routing**（简单路由），然后选择 **Next**（下一步）。

1. 在 **Configure records**（配置记录）下，选择 **Define simple record**（定义简单记录）。

1. 在 **Define simple record**（定义简单记录）页面:
   + 在**记录名称**中，输入 `iot:Data-ATS` 或 `iot:CredentialProvider` 端点。该名称必须与私有托管区名称相同。
   + 对于 **Record 类型**，如果您只想 IPv4支持，请将该值保留为`A - Routes traffic to an IPv4 address and some AWS resources`。如果您只需要 IPv6支持，请将该值保持为`AAAA - Routes traffic to an IPv6 address and some AWS resources`。如果您想要双栈支持（两者兼 IPv4 有 IPv6），请在托管区域中创建两条记录（`A`并在托管区域`AAAA`中使用相同的**记录名称**和 **Value/Rou** te 流量到）。
   + 对于 **Value/Route traffic to**（值/流量路由至），选择 **Alias to VPC endpoint**（向 VPC 添加别名）。然后选择您的 **Region**（区域），接着从显示的端点列表中选择您之前创建的端点，如 [创建 Amazon VPC 接口端点](#Create-VPC-endpoints-core-create-vpc) 中所述。

1. 选择 **Define simple record**（定义简单记录）以创建您的记录。

## 控制 AWS IoT Core 通过 VPC 终端节点的访问权限
<a name="Control-VPC-access"></a>

您可以使用 VPC [条件上下文密钥 AWS IoT Core](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html)将设备访问限制为仅允许通过 VPC 终端节点。 AWS IoT Core 支持以下与 VPC 相关的上下文密钥：
+  [SourceVpc](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpc) 
+  [SourceVpce](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpce) 
+  [VPCSourceIp](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip) 

**注意**  
AWS IoT Core 不支持 [VPC 终端节点的终端节点策略](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)。

例如，以下策略授予 AWS IoT Core 使用与事物名称匹配的客户端 ID 进行连接的权限，以及向以事物名称为前缀的任何主题发布内容的权限，条件是设备连接到具有特定 VPC 终端节点 ID 的 VPC 终端节点。此策略将拒绝连接到您的公有物联网数据端点的尝试。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
            }
        }
            
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}/*"
            ]
        }
    ]
}
```

## 限制
<a name="VPC-limitations"></a>

[AWS IoT Core 控制平面终端节点、AWS IoT Core 数据端](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro)[点和[AWS IoT Core 凭证提供程序](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.htm)端点](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html#iot-connect-device-endpoints)目前支持 VPC 终端节点。使用 AWS IoT Core 控制平面时，只有[联邦信息处理标准 (FIPS) 终端节点](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-fips.html)支持 VPC 终端节点。

### 物联网控制平面 VPC 端点的局限性
<a name="VPC-limitations-iot-control"></a>

本节介绍物联网控制平面 VPC 端点的局限性。
+ VPC 端点将仅提供 ATS 证书。
+ 控制平面终端节点不支持自定义域。
+ 有关 FIPS 安全策略的信息，请参阅 [FIPS 安全](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/describe-ssl-policies.html#fips-security-policies)策略。

### IoT 数据 VPC 端点的限制
<a name="VPC-limitations-iot-data"></a>

本部分介绍物联网数据 VPC 端点的限制。
+ MQTT 保持活动状态的时间限制为 230 秒。保持活动状态超过该时段的时间将自动减少到 230 秒。
+ 每个 VPC 端点总共支持 10 万台并发互联设备。如果您需要更多连接，请参阅[使用扩展 VPC 终端节点 AWS IoT Core](#Scaling-VPC-endpoints)。
+ VPC 端点将仅提供 [ATS 证书](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)，但自定义域除外。
+  不支持 [VPC 端点策略](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html)。
+ 对于为 AWS IoT Core 数据平面创建的 VPC 终端节点， AWS IoT Core 不支持使用地区或区域公有 DNS 记录。

### 凭证提供商端点的限制
<a name="VPC-limitations-credential-provider"></a>

本部分介绍凭证提供商 VPC 端点的限制。
+ VPC 端点将仅提供 [ATS 证书](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)。
+  不支持 [VPC 端点策略](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html)。
+ 凭证提供商端点不支持自定义域名。
+ 对于为 AWS IoT Core 凭证提供者创建的 VPC 终端节点， AWS IoT Core 不支持使用地区或区域公有 DNS 记录。

## 使用扩展 VPC 终端节点 AWS IoT Core
<a name="Scaling-VPC-endpoints"></a>

AWS IoT Core 接口 VPC 终端节点限制为通过单个接口终端节点连接的 100,000 台设备。如果您的使用案例需要更多到代理的并发连接，那么我们建议您使用多个 VPC 端点并在接口端点之间手动路由您的设备。创建私有 DNS 记录将流量路由到 VPC 端点时，确保创建与 VPC 端点 数量相同的加权记录，以便在多个端点之间 分配流量。

## 将自定义域用于 VPC 端点
<a name="VPC-custom-domains"></a>

如果要将自定义域与 VPC 端点结合使用，必须在私有托管区域中创建自定义域名记录，并在 Route53 中创建路由记录。有关更多信息，请参阅[创建私有托管区域](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。

**注意**  
仅 AWS IoT Core 数据端点支持自定义域名。

## VPC 终端节点的可用性 AWS IoT Core
<a name="VPC-availability"></a>

AWS IoT Core 所有[AWS IoT Core 支持的区域](https://aws.amazon.com//about-aws/global-infrastructure/regional-product-services/)均提供接口 VPC 终端节点。 AWS IoT Core 中国地区不支持 AWS IoT Core 凭证提供商的接口 VPC 终端节点，以及。 AWS GovCloud (US) Regions

# 对接口 VPC 终端节点使用 AWS IoT Device Management 安全隧道
<a name="IoTCore-ST-VPC"></a>

AWS IoT Device Management 安全隧道支持接口 VPC 端点。您可以使用 VPC 终端节点保持 VPC 之间和 AWS 网络 AWS IoT Secure Tunneling 内部的流量，而无需互联网网关、NAT 设备、VPN AWS Direct Connect 连接或连接。

接口 VPC 终端节点由[AWS PrivateLink](https://docs.aws.amazon.com//vpc/latest/privatelink/what-is-privatelink.html)一项技术提供支持，该技术使您能够使用私有 IP 地址私密访问服务。有关更多信息，请参阅 AWS PrivateLink 指南中的[使用接口 VPC 终端节点访问 AWS 服务](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)。

**Topics**
+ [前提条件](#Create-ST-VPC-endpoints-prereq)
+ [通过 VPC 终端节点接收隧道通知](#ST-VPC-Receive-notifications)
+ [为安全隧道传输创建 VPC 终端节点](#Create-ST-VPC-endpoints-Create)
+ [在代理服务器上配置 VPC 终端节点策略](#Create-ST-VPC-endpoints-Configure)
+ [后续步骤](#Create-ST-VPC-endpoints-Next)

## 前提条件
<a name="Create-ST-VPC-endpoints-prereq"></a>

在为创建 VPC 终端节点之前 AWS IoT Secure Tunneling，请确认您已具备以下条件：
+ 具有创建 VPC 终端节点所需权限的 AWS 账户。
+ 您 AWS 账户中的 VPC。
+ 了解 AWS IoT Device Management 安全隧道的概念。
+ 熟悉 VPC 终端节点策略和 AWS Identity and Access Management (IAM)

## 通过 VPC 终端节点接收隧道通知
<a name="ST-VPC-Receive-notifications"></a>

要通过 VPC 终端节点接收隧道通知，您的设备可以通过 VPC 终端节点连接到 AWS IoT Core 数据平面并订阅安全隧道预留 MQTT 主题。

有关如何在 AWS IoT Core 数据平面中创建和配置 VPC 终端节点的说明，请参阅 AWS IoT 开发人员指南中的[AWS IoT Core 与接口 VPC 终端节点一起使用](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html)。

## 为安全隧道传输创建 VPC 终端节点
<a name="Create-ST-VPC-endpoints-Create"></a>

您可以为安全隧道控制平面和代理服务器创建 VPC 终端节点。

**创建用于安全隧道的 VPC 终端节点**

1. 按照 Amazon VPC 开发人员指南中[创建接口终端节点](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)中的步骤进行操作

1. 对于**服务名称**，请根据您的终端节点类型选择以下选项之一：

**控制面板**
   + 标准：`com.amazonaws.<region>.iot.tunneling.api`
   + FIPS（在 FIPS 地区可用）：`com.amazonaws.<region>.iot-fips.tunneling.api`

**代理服务器**
   + 标准：`com.amazonaws.<region>.iot.tunneling.data`
   + FIPS（在 FIPS 地区可用）：`com.amazonaws.<region>.iot-fips.tunneling.data`

   *<region>*用你的 AWS 区域. 例如 `us-east-1`。

1. 根据您的网络要求完成 VPC 终端节点创建过程中的其余步骤。

## 在代理服务器上配置 VPC 终端节点策略
<a name="Create-ST-VPC-endpoints-Configure"></a>

除了用于授权隧道连接的基于客户端访问令牌的授权外，您还可以使用 VPC 终端节点策略进一步限制设备如何使用 VPC 终端节点连接到安全隧道代理服务器。VPC 终端节点策略遵循类似 IAM 的语法，并在 VPC 终端节点本身上进行配置。

请注意，代理服务器 VPC 终端节点策略唯一支持的 IAM 操作是`iot:ConnectToTunnel`。

以下是不同的 VPC 终端节点策略的示例。

### 代理服务器 VPC 终端节点策略示例
<a name="w2aac17c35c31c15b9"></a>

以下示例显示了常见用例的代理服务器 VPC 终端节点策略配置。

**Example -默认策略**  
此策略允许您的 VPC 内的设备通过任何 AWS 账户连接到创建终端节点 AWS 区域 所在地的任何隧道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
```

**Example -限制对特定 AWS 账户的访问权限**  
此策略仅允许 VPC 终端节点连接到特定 AWS 账户中的隧道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*",
                "arn:aws:iot:us-east-1:444455556666:tunnel/*"
            ]
        }
    ]
}
```

**Example -通过隧道端点限制连接**  
您可以将 VPC 终端节点访问限制为仅允许设备连接到隧道的源端或目标端。  
仅限来源：  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "source"
                }
            }
        }
    ]
}
```

仅限目的地：

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

**Example -根据资源标签限制访问权限**  
此策略仅允许 VPC 终端节点连接到标有特定键值对的隧道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Production"
                }
            }
        }
    ]
}
```

**Example -综合保单条件**  
此策略演示了如何组合多个策略元素。它允许连接到特定 AWS 账户中的任何隧道，但前提是隧道标记`AllowConnectionsThroughPrivateLink`为设置为，`true`并且客户端未连接到隧道的目标端。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AllowConnectionsThroughPrivateLink": "true"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

## 后续步骤
<a name="Create-ST-VPC-endpoints-Next"></a>

在为创建和配置您的 VPC 终端节点后 AWS IoT Secure Tunneling，请考虑以下事项：
+ 通过终端节点连接设备，测试您的 VPC 终端节点配置。
+ 通过 Amazon CloudWatch 指标监控 VPC 终端节点的使用情况。
+ 根据您的安全要求，根据需要查看和更新您的 VPC 终端节点策略。

有关 AWS IoT Device Management 安全隧道的更多信息，请参阅。[AWS IoT Secure Tunneling](https://docs.aws.amazon.com//iot/latest/developerguide/secure-tunneling.html)

# 基础设施安全 AWS IoT
<a name="infrastructure-security"></a>

作为托管服务的集合， AWS IoT 受《[Amazon Web Services：安全流程概述》白皮书中描述的 AWS 全球网络安全](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)程序的保护。

您可以使用 AWS 已发布的 API 调用 AWS IoT 通过网络进行访问。客户端必须支持传输层安全性协议（TLS）1.2 或更高版本。客户端还必须支持具有完全向前保密（PFS）的密码套件，例如 Ephemeral Diffie-Hellman（DHE）或 Elliptic Curve Ephemeral Diffie-Hellman（ECDHE）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。有关更多信息，请参阅 [运输安全 AWS IoT Core](transport-security.md)。

必须使用访问密钥 ID 以及与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) (AWS STS) 生成临时安全凭证来对请求进行签名。

# 使用 Core 对生产车队或设备进行 AWS IoT 安全监控
<a name="security-monitoring"></a>

IoT 实例集可能由大量具有不同功能、长期存在且地理位置分散的设备组成。这些特性导致实例集设置复杂且容易出错。由于设备的计算能力、内存和存储功能通常有限，因而限制了在设备本身上对加密和其它形式的安全功能的使用。此外，设备经常使用具有已知漏洞的软件。这些因素不仅令物联网实例集成为吸引黑客的目标，而且导致难以持续保护设备实例集安全。

AWS IoT Device Defender 通过提供工具来识别安全问题和与最佳实践的偏差，从而应对这些挑战。您可以使用 De AWS IoT vice Defender 来分析、审计和监控连接的设备，以检测异常行为并降低安全风险。 AWS IoT Device Defender 可以对设备队列进行审计，以确保它们遵守安全最佳实践并检测设备上的异常行为。这使得在您的 AWS IoT 设备群中实施一致的安全策略成为可能，并在设备遭到入侵时快速做出响应。有关更多信息，请参阅 [AWS IoT Device Defender](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/what-is-device-defender.html)。

AWS IoT Device Advisor 会根据需要推送更新并修补您的机群。 AWS IoT 设备顾问会自动更新测试用例。 您选择 的测试使用案例始终为最新版本。有关更多信息，请参阅 [Device Advisor](device-advisor.md)。

# 中的安全最佳实践 AWS IoT Core
<a name="security-best-practices"></a>

本节包含有关安全最佳实践的信息 AWS IoT Core。有关工业物联网解决方案的安全规则的信息，请参阅[工业物联网解决方案的十大安全黄金规则](https://aws.amazon.com/blogs/iot/ten-security-golden-rules-for-industrial-iot-solutions/)。

## 保护中的 MQTT 连接 AWS IoT
<a name="secure-mqtt"></a>

[AWS IoT Core](https://aws.amazon.com/iot-core/)是一项托管云服务，可让联网设备轻松安全地与云应用程序和其他设备进行交互。 AWS IoT Core 支持 HTTP [WebSocket](https://en.wikipedia.org/wiki/WebSocket)、和 [MQTT](https://en.wikipedia.org/wiki/MQTT)，这是一种专为容忍间歇性连接而设计的轻量级通信协议。如果您 AWS IoT 使用 MQTT 进行连接，则每个连接都必须与称为客户端 ID 的标识符相关联。MQTT 客户端 IDs 唯一标识 MQTT 连接。如果使用已为其他连接申请的客户端 ID 建立新连接，则 AWS IoT 消息代理会丢弃旧连接以允许新连接。每个 AWS 账户 客户机都 IDs 必须是唯一 AWS 区域的。这意味着，您无需在您所在区域 IDs 之外 AWS 账户 或您所在区域内跨区域强制执行客户的全球唯一性。 AWS 账户

在设备实例集上删除 MQTT 连接的影响和严重程度取决于许多因素。这些方法包括：
+ 您的用例（例如，您的设备发送到的数据 AWS IoT、数据量以及发送数据的频率）。
+ 您的 MQTT 客户端配置（例如，自动重新连接设置、关联的退避计时以及使用 [MQTT 持久会话](mqtt.md#mqtt-persistent-sessions)）。
+ 设备资源限制。
+ 断开连接的根本原因、其主动性和持久性。

为避免客户端 ID 冲突及其潜在的负面影响，请确保每台设备或移动应用程序都有 AWS IoT 或 IAM 策略，该策略限制哪个客户端 IDs 可用于与 AWS IoT 消息代理的 MQTT 连接。例如，您可以使用 IAM 策略防止设备无意中通过使用已在使用的客户端 ID 关闭其它设备的连接。有关更多信息，请参阅 [Authorization](iot-authorization.md)。

您的队列中的所有设备都必须具有仅授权预期操作的权限的证书，这些权限包括（但不限于） AWS IoT MQTT 操作，例如发布消息或订阅具有特定范围和上下文的主题。具体的权限策略可能因您的使用案例而异。确定最能满足您的业务和安全要求的权限策略。

要简化权限策略的创建和管理，您可以使用 [AWS IoT Core 策略变量](iot-policy-variables.md) 和 [IAM 策略变量](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)。策略变量可以放在策略中，并且在评估策略时，变量将由来自设备请求的值替换。使用策略变量，您可以创建单个策略以授予对多个设备的权限。您可以根据您的 AWS IoT 账户配置、身份验证机制和连接到 AWS IoT 消息代理时使用的网络协议来确定与您的用例相关的策略变量。但是，要编写最佳权限策略，应考虑使用案例和[威胁模型](https://en.wikipedia.org/wiki/Threat_model)的具体情况。

例如，如果您在注册 AWS IoT 表中注册了设备，则可以在策略中 AWS IoT 使用[事物策略变量](thing-policy-variables.md)，根据事物名称、事物类型和事物属性值等事物属性来授予或拒绝权限。事物名称是从事物连接到时发送的 MQTT 连接消息中的客户端 ID 中获取的 AWS IoT。当事物使用 TLS 相互身份验证通过 MQTT 连接或使用 AWS IoT 经过身份验证的 [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html) 身份通过 WebSocket 协议连接 MQTT 时，事物策略变量将被替换。您可以使用 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html)API 将证书和经过身份验证的 Amazon Cognito 身份附加到事物。 `iot:Connection.Thing.ThingName`是强制执行客户端 ID 限制的有用策略变量。以下示例 AWS IoT 策略要求将已注册事物的名称用作与 AWS IoT 消息代理的 MQTT 连接的客户端 ID：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

如果要识别持续存在的客户端 ID 冲突，可以启用和使用[CloudWatch 日志 AWS IoT](cloud-watch-logs.md)。对于 AWS IoT 消息代理由于客户端 ID 冲突而断开连接的每个 MQTT 连接，都会生成一条类似于以下内容的日志记录：

```
{
    "timestamp": "2019-04-28 22:05:30.105",
    "logLevel": "ERROR",
    "traceId": "02a04a93-0b3a-b608-a27c-1ae8ebdb032a",
    "accountId": "123456789012",
    "status": "Failure",
    "eventType": "Disconnect",
    "protocol": "MQTT",
    "clientId": "clientId01",
    "principalId": "1670fcf6de55adc1930169142405c4a2493d9eb5487127cd0091ca0193a3d3f6",
    "sourceIp": "203.0.113.1",
    "sourcePort": 21335,
    "reason": "DUPLICATE_CLIENT_ID",
    "details": "A new connection was established with the same client ID"
}
```

您可以使用[CloudWatch 日志筛选器](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)，例如`{$.reason= "DUPLICATE_CLIENT_ID" }`搜索客户端 ID 冲突的实例，或者设置[CloudWatch 指标筛选器和](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringPolicyExamples.html)相应的 CloudWatch 警报以进行持续监控和报告。

您可以使用 Dev [AWS IoT ice Defender](https://aws.amazon.com/iot-device-defender/) 来识别过于宽松的策略 AWS IoT 和 IAM 策略。 AWS IoT Device Defender 还提供审计检查，如果您的队列中有多台设备使用相同的客户端 ID 连接到 AWS IoT 消息代理，则会通知您。

您可以使用 AWS IoT Device Advisor 来验证您的设备能否可靠地连接 AWS IoT Core 并遵循安全最佳实践。

### 另请参阅
<a name="mqtt-security-see-also"></a>
+ [AWS IoT Core](https://aws.amazon.com/iot-core/)
+ [AWS IoT的安全特征](authentication.md)
+ [AWS IoT Core 策略变量](iot-policy-variables.md)
+ [IAM 策略变量](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_variables.html)
+ [Amazon Cognito 身份](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html)
+ [AWS IoT Device Defender](https://aws.amazon.com/iot-device-defender/)
+ [CloudWatch 的日志 AWS IoT](cloud-watch-logs.md)

## 使设备的时钟保持同步
<a name="device-clock"></a>

请务必确保您的设备上有准确的时间。X.509 证书具有到期日期和时间。设备上的时钟用于验证服务器证书是否仍有效。如果您要构建商用物联网设备，请记住，您的产品在出售前可能会存放较长时间。在此期间，实时时钟可能会出现偏移误差，并且电池可能会放电，因此在工厂设置时间是不够的。

对于大多数系统，这意味着设备的软件必须包含网络时间协议（NTP）客户端。设备应等待，直到它与 NTP 服务器同步，然后再尝试连接到 AWS IoT Core。如果无法做到这一点，系统将为用户提供一种设置设备时间的方法，以便后续连接成功。

设备与 NTP 服务器同步后，便能打开与 AWS IoT Core的连接。允许的时钟偏移量取决于您尝试通过此连接执行的操作。

## 验证服务器证书
<a name="validate-server-cert"></a>

设备与之交互的第一件事 AWS IoT 就是打开安全连接。将设备连接到时 AWS IoT，请确保您正在与服务器通话 AWS IoT ，而不是其他服务器在模仿 AWS IoT。每 AWS IoT 台服务器都配置了为该`iot.amazonaws.com`域颁发的证书。该证书 AWS IoT 由可信的证书颁发机构颁发，该机构验证了我们的身份和域名所有权。

设备连接时要 AWS IoT Core 做的第一件事就是向设备发送服务器证书。设备可以验证它们是否希望连接到 `iot.amazonaws.com`，并验证位于该连接一端的服务器是否拥有来自该域的受信任颁发机构的证书。

TLS 证书采用 X.509 格式，并包含各种信息，例如组织的名称、位置、域名和有效期。有效期被指定为一对时间值（分别名为 `notBefore` 和 `notAfter`）。 AWS IoT Core 诸如服务器证书的有效期有限（例如，一年），并在旧证书到期之前开始提供新证书。

## 每个设备使用一个身份
<a name="cert-per-device"></a>

每个客户端使用一个身份。设备通常使用 X.509 客户端证书。Web 和移动应用程序使用 Amazon Cognito Identity。这使您能够对设备应用细化权限。

例如，您有一个由手机设备构成的应用程序，这些设备接收来自两个不同的智能家居对象（灯泡和恒温器）的状态更新。灯泡发送电池电量的状态，恒温器发送报告温度的消息。

AWS IoT 对设备进行单独身份验证并单独处理每个连接。您可以使用授权策略应用精细访问控制。您可以为恒温器定义一个策略，该策略允许恒温器发布到主题空间的策略。您可以为灯泡定义一个单独策略，该策略允许灯泡发布到不同的主题空间。最后，您可以为移动应用程序定义一个策略，该策略只允许它连接到和订阅恒温器和灯泡的主题以接收来自这些设备的消息。

应用最小权限原则，并尽可能缩小每个设备的权限范围。所有设备或用户都应 AWS IoT 制定政策 AWS IoT ，仅允许其使用已知的客户端 ID 进行连接，以及发布和订阅已确定和固定的主题集。

## 用一秒钟 AWS 区域 作为备份
<a name="use-second-region"></a>

考虑在一秒钟内存储一份数据副本 AWS 区域 作为备份。请注意，名为 “[灾难恢复” 的 AWS](https://aws.amazon.com/solutions/implementations/disaster-recovery-for-aws-iot/)解决方案 AWS IoT已不再可用。虽然相关[GitHub库](https://github.com/awslabs/disaster-recovery-for-aws-iot)仍然可以访问，但已于 2023 年 7 月将其 AWS 弃用，并且不再为其提供维护或支持。要实施您自己的解决方案或探索其他支持选项，请访问[联系 AWS](https://aws.amazon.com/contact-us/)。如果您的账户有 AWS 技术客户经理，请联系他们寻求帮助。

## 使用即时预调配
<a name="use-jitp"></a>

手动创建和配置每台设备可能很耗时。 AWS IoT 提供了一种定义模板的方法，以便在设备首次连接时对其进行配置 AWS IoT。有关更多信息，请参阅 [Just-in-time 资源调配](jit-provisioning.md)。

## 运行 AWS IoT 设备顾问测试的权限
<a name="device-advisor-perms"></a>

以下策略模板显示了运行 AWS IoT Device Advisor 测试用例所需的最低权限和 IAM 实体。[您需要*your-device-role-arn*替换为在先决条件下创建的设备角色 Amazon 资源名称 (ARN)。](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-workflow.html#device-advisor-workflow-prereqs)

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iot:us-east-1:123456789012:thinggroup/your-thing-group",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "iotdeviceadvisor.amazonaws.com"
            }
        }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke*",
                "iam:ListRoles",
                "iot:Connect",
                "iot:CreateJob",
                "iot:DeleteJob",
                "iot:DescribeCertificate",
                "iot:DescribeEndpoint",
                "iotjobsdata:DescribeJobExecution",
                "iot:DescribeJob",
                "iot:DescribeThing",
                "iotjobsdata:GetPendingJobExecutions",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListCertificates",
                "iot:ListPrincipalPolicies",
                "iot:ListThingPrincipals",
                "iot:ListThings",
                "iot:Publish",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution",
                "iot:UpdateThingShadow",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:PutRetentionPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:*",
            "Resource": "*"
        }
    ]
}
```

## 针对 Device Advisor 防范跨服务混淆代理
<a name="cross-service-confused-deputy-prevention-DA"></a>

混淆代理问题是一个安全性问题，即不具有某操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在中 AWS，跨服务模仿可能会导致混乱的副手问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为了防止这种情况，我们 AWS 提供了一些工具，帮助您保护所有服务的数据，这些服务委托人已被授予对您账户中资源的访问权限。

我们建议在资源策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 Device Advisor 为其它服务提供的资源访问权限。如果使用两个全局条件上下文键，在同一策略语句中使用时，`aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户必须使用相同的账户 ID。

`aws:SourceArn` 的值必须是套件定义资源的 ARN。套件定义资源是指您使用 Device Advisor 创建的测试套件。

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符（`*`）的 `aws:SourceArn` 全局上下文条件键。例如，`arn:aws:iotdeviceadvisor:*:account-id:suitedefinition/*`

以下示例演示如何使用 Device Advisor 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "ConfusedDeputyPreventionExamplePolicy",
        "Effect": "Allow",
        "Principal": {
            "Service": "iotdeviceadvisor.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
            "ArnLike": {
                "aws:SourceArn": "arn:aws:iotdeviceadvisor:us-east-1:123456789012:suitedefinition/ygp6rxa3tzvn"
        },
            "StringEquals": {
                "aws:SourceAccount": "123456789012"
        }
        }
    }
}
```

## AWS 培训和认证
<a name="iot-security-training"></a>

参加以下课程，了解有关安全的关键概念： AWS IoT [AWS IoT 安全入门](https://www.aws.training/Details/Curriculum?id=42304)。