AWS IoT
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS IoT Core 中的安全最佳实践

本节包含有关 AWS IoT Core 的安全最佳实践的信息。

在 AWS IoT 中保护 MQTT 连接

AWS IoT Core 是一款托管的云服务,让互联设备可以轻松、安全地与云应用程序及其他设备交互。AWS IoT Core 支持 HTTP、WebSocketMQTT,这是一个专门用于承受间歇性连接的轻量级通信协议。如果您使用 MQTT 连接到 AWS IoT 消息代理,您的每个连接都必须与一个称为客户端 ID 的标识符关联。MQTT 客户端 ID 唯一地标识 MQTT 连接。如果使用已为另一个连接声明的客户端 ID 建立新连接,则 AWS IoT 消息代理将删除旧连接以允许新连接。您可以使用 AWS IoT 中的授权功能,通过使用已在使用的客户端 ID 建立 MQTT 连接,以确保您队列中的设备不会无意中被授权来断开其他设备的连接。客户端 ID 在每个 AWS 账户和每个 AWS 区域中必须是唯一的,因此,您无需在 AWS 账户之外或 AWS 账户中的各区域之间强制实施客户端 ID 的全局唯一性。

在设备队列上删除 MQTT 连接的影响和严重程度取决于许多因素。包括:

  • 您的使用案例(例如,您的设备向 AWS IoT 发送的数据、数据量以及发送数据的频率)。

  • 您的 MQTT 客户端配置(例如,自动重新连接设置、关联的退避计时以及使用 MQTT 持久会话)。

  • 设备资源限制。

  • 断开连接的根本原因、其主动性和持久性。

要避免客户端 ID 冲突及其潜在的负面影响,请确保每个设备或移动应用程序都有一个 AWS IoT 或 IAM 策略,以限制允许将哪些客户端 ID 用于与 AWS IoT 消息代理的 MQTT 连接。

您队列中的所有设备必须具有相应的凭证,这些凭证仅具有授权执行预期操作的权限,包括但不限于 AWS IoT MQTT 操作,例如发布消息或订阅具有特定范围和上下文的主题。为每个用例使用的特定权限策略各不相同,因此您需要确定最符合业务和安全要求的权限策略。

为了简化权限策略的创建和管理,您可以使用AWS IoT 策略变量IAM 策略变量。策略变量可以放在策略中,并且在评估策略时,变量将由来自设备请求的值替换。使用策略变量,您可以创建单个策略以授予对多个设备的权限。您可以根据用于连接到 AWS IoT 消息代理的 AWS IoT 帐户配置、身份验证机制和网络协议,为您的用例确定相关的策略变量。但是,要编写最佳权限策略,您需要考虑用例和威胁模型的具体情况。

例如,如果已在 AWS IoT 注册表中注册了设备,则可以使用 AWS IoT 策略中的事物策略变量根据事物属性(如事物名称、事物类型和事物属性值)授予或拒绝权限。事物名称从事物连接至 AWS IoT 时发送的 MQTT Connect 消息中的客户端 ID 获取。当事物通过使用 TLS 双向身份验证的 MQTT 或通过基于 WebSocket 的 MQTT 协议(使用经过身份验证的 Amazon Cognito 身份)连接至 AWS IoT 时,事物策略变量将被替换。您可以使用 AttachThingPrincipal 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 冲突,可以启用和使用适用于 AWS IoT 的 CloudWatch Logs。对于 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 Logs 筛选条件(如 {$.reason= "DUPLICATE_CLIENT_ID" })来搜索客户端 ID 冲突的实例,或者设置 CloudWatch 度量筛选条件和相应的 CloudWatch 警报以进行连续监视和报告。

您可以使用 AWS IoT Device Defender 识别过度宽容的 AWS IoT 和 IAM 策略。AWS IoT Device Defender 还提供审核检查,如果队列中的多个设备使用相同的客户端 ID 连接到 AWS IoT 消息代理,则会通知您。

另请参阅