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

审核

AWS IoT Device Defender 审核会查看与账户相关的和与设备相关的设置及策略,以确保安全措施就绪。审核可帮助您检测与安全​最佳实践或访问策略的任何偏离(例如,使用同一身份的多个设备,或允许一个设备读取和更新许多其他设备数据的过度宽松的权限策略。)您可以根据需要运行审核(按需审核)或安排审核定期运行(计划审核)。

AWS IoT Device Defender 审核会针对常见的 IoT 安全最佳实践和设备漏洞运行一组预定义检查。预定义检查示例包括,授权读取或更新多个设备上数据的策略、共享身份(X.509 证书)的设备或者即将过期或已吊销但仍处于活动状态的证书。​

审核检查

注意

检查一经启用,数据收集就会立即开始。如果账户中有大量数据需要收集,那么在启用检查之后可能需要等待一定时间才会获得结果。

以下为受支持的审核检查:

REVOKED_CA_CERT_CHECKDetails (1)Why it matters (1)How to fix it (1)
REVOKED_CA_CERT_CHECK

CA 证书已被吊销,但在 AWS IoT 中仍处于活动状态。

严重性:危急

Details (1)

CA 证书在发证机构所维护的证书吊销列表中标记为已吊销,但在 AWS IoT 中仍标记为“ACTIVE”或“PENDING_TRANSFER”。

此检查发现不合规的 CA 证书时,会返回以下原因代码:

  • CERTIFICATE_REVOKED_BY_ISSUER

Why it matters (1)

已吊销的 CA 证书不应再用于签发设备证书。证书可能因遭破坏而被吊销。如果新添加的设备具有使用此 CA 证书签发的证书,可能会造成安全威胁。

How to fix it (1)
  1. 使用 UpdateCACertificate 在 AWS IoT 中将该 CA 证书标记为“INACTIVE”。您还可以使用缓解操作实现以下目的:

    • 对您的审核结果应用 UPDATE_CA_CERTIFICATE 缓解操作以进行此更改。

    • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

    有关更多信息,请参阅 缓解操作

  2. 对吊销 CA 证书后的设备证书注册活动进行审核,并考虑吊销在此期间可能使用它颁发的任何设备证书。(使用 ListCertificatesByCA 列出通过该 CA 证书签发的设备证书,并使用 UpdateCertificate 吊销设备证书。)

 

DEVICE_CERTIFICATE_SHARED_CHECKDetails (2)Why it matters (2)How to fix it (2)
DEVICE_CERTIFICATE_SHARED_CHECK

多个并发连接使用相同的 X.509 证书向 AWS IoT 进行身份验证。

严重性:危急

Details (2)

此检查一经启用,数据收集就会立即开始,但检查结果需要至少两个小时后才会出来。

在按需审核过程中进行此检查时,它会检查在审核开始之前 31 天内设备用于连接的证书和客户端 ID。对于计划审核,此检查会查看从上次运行审核到该审核实例开始期间的数据。如果在检查期间已采取措施来缓解这种状况,请记录执行并行连接的时间,以判断问题是否持续存在。

此检查发现不合规的证书时,会返回以下原因代码:

  • CERTIFICATE_SHARED_BY_MULTIPLE_DEVICES

此外,此检查返回的结果还包含共享证书的 ID、使用证书进行连接的客户端的 ID,以及连接/连接断开次数。最近的结果列在最前面。

Why it matters (2)

每个设备应具有唯一证书以向 AWS IoT 进行身份验证。如果多个设备使用相同的证书,这可能表示设备已遭破坏。其身份可能已遭克隆,会进一步危害系统。

How to fix it (2)

验证设备证书是否已遭破坏。如果已遭破坏,请遵照安全最佳实践来缓解此情况。

如果在多个设备上使用同一证书,则需要执行以下操作:

  1. 预置新的唯一证书并将其附加到每个设备。

  2. 验证新证书是否有效,以及设备能否使用它们进行连接。

  3. 使用 UpdateCertificate 在 AWS IoT 中将旧证书标记为“REVOKED”。您还可以使用缓解操作实现以下目的:

    • 对您的审核结果应用 UPDATE_CA_CERTIFICATE 缓解操作以进行此更改。

    • 应用 ADD_THINGS_TO_THING_GROUP 缓解操作,以将设备添加到可以对其执行操作的组。

    • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

    有关更多信息,请参阅 缓解操作

  4. 将旧证书从各个设备中分离。

 

UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECKManage or modify things (3)Read thing administrative data (3)Manage non-things (3)Subscribe/publish to MQTT topics (3)Read/modify shadow or job data (3)Details (3)Why it matters (3)How to fix it (3)
UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK

附加到未经身份验证的 Amazon Cognito 身份池角色的策略被视为过于宽松,因为它会授权执行以下任意 AWS IoT 操作:

  • 管理或修改事物。

  • 读取事物管理数据。

  • 管理非事物相关的数据或资源。

或者,因为它授权在一系列设备上执行以下 AWS IoT 操作:

  • 使用 MQTT 连接/发布/订阅预留主题(包括影子或作业执行数据)。

  • 使用 API 命令读取或修改影子或作业执行数据。

一般情况下,使用未经身份验证的 Amazon Cognito 身份池角色进行连接的设备只应具备有限的权限,发布和订阅事物特定 MQTT 主题,或者使用 API 命令读取和修改与影子或作业执行数据相关的事物特定数据。

严重性:危急

Manage or modify things (3)

以下 AWS IoT API 操作可用于管理或修改事物,因此不应该为通过未经身份验证的 Amazon Cognito 身份池进行连接的设备授予执行这些操作的权限:

  • AddThingToThingGroup

  • AttachThingPrincipal

  • CreateThing

  • DeleteThing

  • DetachThingPrincipal

  • ListThings

  • ListThingsInThingGroup

  • RegisterThing

  • RemoveThingFromThingGroup

  • UpdateThing

  • UpdateThingGroupsForThing

任何授权执行这些操作的角色,即便是在单一资源上执行这些操作,也会被视为不合规。

Read thing administrative data (3)

以下 AWS IoT API 操作可用于读取或修改事物数据,因此不应该为通过未经身份验证的 Amazon Cognito 身份池进行连接的设备授予执行这些操作的权限:

  • DescribeThing

  • ListJobExecutionsForThing

  • ListThingGroupsForThing

  • ListThingPrincipals

示例:

  • 不合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeThing", "iot:ListJobExecutionsForThing", "iot:ListThingGroupsForThing", "iot:ListThingPrincipals" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing" ] } ] }

    此示例允许设备执行指定操作,即便该设备仅获得了针对一个特定事物的权限。

Manage non-things (3)

通过未经身份验证的 Amazon Cognito 身份池进行连接的设备,不应该被授予执行除这些部分中所述之外的 AWS IoT API 操作的权限。要使用通过未经身份验证的 Amazon Cognito 身份池进行连接的应用程序来管理账户,请创建一个不供设备使用的单独身份池。

Subscribe/publish to MQTT topics (3)

MQTT 消息通过 AWS IoT 消息代理发送,并由设备用来执行许多不同的操作,包括访问和修改影子状态和作业执行状态。为设备授权以连接、发布或订阅 MQTT 消息的策略,应该限定对特定资源执行如下操作:

连接
  • 不合规:

    arn:aws:iot:<region>:<account-id>:client/*

    通配符 * 允许任何设备连接到 AWS IoT。

    arn:aws:iot:<region>:<account-id>:client/${iot:ClientId}

    除非 iot:Connection.Thing.IsAttached 在条件键中设置为 True,这相当于上例中的通配符 *。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:client/${iot:Connection.Thing.ThingName}" ], "Condition": { "Bool": { "iot:Connection.Thing.IsAttached": "true" } } } ] }

    资源规范包含与用于连接的设备名称匹配的变量。条件语句通过检查 MQTT 客户端所用的证书是否与附加到使用此名称的事物的证书匹配,进一步限制权限。

发布
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*/shadow/update

    此示例允许设备更新任何设备的影子(* = 所有设备)。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*

    此示例允许设备读取/更新/删除任何设备的影子。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题。

订阅
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    此示例允许设备订阅为所有设备预留的影子或作业主题。

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    与上一个示例相同,不过使用的是 # 通配符。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/+/shadow/update

    此示例允许设备查看任何设备上的影子更新(+ = 所有设备)。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题和作业相关主题。

接收
  • 合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    这是允许的,因为设备只能从其有权订阅的主题接收消息。

Read/modify shadow or job data (3)

为设备授予执行 API 操作权限以访问或修改设备影子或作业执行数据的策略,应该限定对特定资源执行以下操作。API 操作有:

  • DeleteThingShadow

  • GetThingShadow

  • UpdateThingShadow

  • DescribeJobExecution

  • GetPendingJobExecutions

  • StartNextPendingJobExecution

  • UpdateJobExecution

示例:

  • 不合规:

    arn:aws:iot:<region>:<account-id>:thing/*

    此示例允许设备对任何事物执行指定操作。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DeleteThingShadow", "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DescribeJobExecution", "iot:GetPendingJobExecutions", "iot:StartNextPendingJobExecution", "iot:UpdateJobExecution" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing1", "arn:aws:iot:<region>:<account-id>:/thing/MyThing2" ] } ] }

    此示例允许设备仅对两个事物执行指定操作。

Details (3)

对于此检查,AWS IoT Device Defender 会审核在执行审核之前 31 天内用于连接到 AWS IoT 消息代理的所有 Amazon Cognito 身份池。所有的 Amazon Cognito 身份池(无论连接时使用的是经身份验证或未经身份验证的 Amazon Cognito 身份)都在审核范围内。

此检查发现不合规的未经身份验证的 Amazon Cognito 身份池角色时,会返回以下原因代码:

  • ALLOWS_ACCESS_TO_IOT_ADMIN_ACTIONS

  • ALLOWS_BROAD_ACCESS_TO_IOT_DATA_PLANE_ACTIONS

Why it matters (3)

由于未经身份验证的身份从未经过用户的身份验证,因此它们带来的风险远远高于经身份验证的 Amazon Cognito 身份。如果未经身份验证的身份遭到破坏,它可能使用管理操作来修改账户设置、删除资源或获取对敏感数据的访问权限。或者,凭借对设备设置宽泛的访问权限,它可以访问或修改您账户中所有设备的影子和作业。来宾用户可能使用这些权限破坏您的整个队列或通过消息发动 DDOS 攻击。

How to fix it (3)

附加到未经身份验证的 Amazon Cognito 身份池角色的策略,应该仅为设备授予执行作业所需的权限。我们建议您完成以下步骤:

  1. 创建新的合规角色。

  2. 创建 Amazon Cognito 身份池并为其附加合规角色。

  3. 验证您的身份能否使用新池访问 AWS IoT。

  4. 验证完成后,将合规角色附加到标记为不合规的 Amazon Cognito 身份池。

您还可以使用缓解操作实现以下目的:

  • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

有关更多信息,请参阅 缓解操作

 

AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECKManage or modify things (4)Manage non-things (4)Read thing administrative data (4)Subscribe/publish to MQTT topics (4)Read/modify shadow or job data (4)Details (4)Why it matters (4)How to fix it (4)
AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK

附加到经身份验证的 Amazon Cognito 身份池角色的策略被视为过于宽松,因为它会授权执行以下 AWS IoT 操作:

  • 管理或修改事物。

  • 管理非事物相关的数据或资源。

或者,因为它授权在一系列设备上执行以下 AWS IoT 操作:

  • 读取事物管理数据。

  • 使用 MQTT 连接/发布/订阅预留主题(包括影子或作业执行数据)。

  • 使用 API 命令读取或修改影子或作业执行数据。

一般情况下,使用经身份验证的 Amazon Cognito 身份池角色进行连接的设备只应具备有限的权限,读取事物特定管理数据、发布和订阅事物特定 MQTT 主题,或使用 API 命令读取和修改与影子或作业执行数据相关的事物特定数据。

严重性:危急

Manage or modify things (4)

以下 AWS IoT API 操作可用于管理或修改事物,因此不应该为通过经身份验证的 Amazon Cognito 身份池进行连接的设备授予执行以下操作的权限:

  • AddThingToThingGroup

  • AttachThingPrincipal

  • CreateThing

  • DeleteThing

  • DetachThingPrincipal

  • ListThings

  • ListThingsInThingGroup

  • RegisterThing

  • RemoveThingFromThingGroup

  • UpdateThing

  • UpdateThingGroupsForThing

任何授权执行这些操作的角色,即便是在单一资源上执行这些操作,也会被视为不合规。

Manage non-things (4)

通过经身份验证的 Amazon Cognito 身份池进行连接的设备,不应该被授予执行除这些部分中所述之外的 AWS IoT API 操作的权限。要使用通过经身份验证 Amazon Cognito 身份池进行连接的应用程序来管理账户,请创建一个不供设备使用的单独身份池。

Read thing administrative data (4)

以下 AWS IoT API 操作可用于读取事物数据,因此应该为通过经身份验证的 Amazon Cognito 身份池进行连接的设备授予仅对有限事物集执行以下操作的权限:

  • DescribeThing

  • ListJobExecutionsForThing

  • ListThingGroupsForThing

  • ListThingPrincipals

示例:

  • 不合规:

    arn:aws:iot:<region>:<account-id>:thing/*

    此示例允许设备对任何事物执行指定操作。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeThing", "iot:ListJobExecutionsForThing", "iot:ListThingGroupsForThing", "iot:ListThingPrincipals" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing" ] } ] }

    此示例允许设备仅对一个事物执行指定操作。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeThing", "iot:ListJobExecutionsForThing", "iot:ListThingGroupsForThing", "iot:ListThingPrincipals" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing*" ] } ] }

    此示例之所以合规,是因为尽管该资源是使用通配符 (*) 指定的,但它的前面是特定字符串,这将仅限名称包含给定前缀的设备访问事物集。

Subscribe/publish to MQTT topics (4)

MQTT 消息通过 AWS IoT 消息代理发送,并由设备用来执行许多不同的操作,包括访问和修改影子状态和作业执行状态。为设备授权以连接、发布或订阅 MQTT 消息的策略,应该限定对特定资源执行如下操作:

连接
  • 不合规:

    arn:aws:iot:<region>:<account-id>:client/*

    通配符 * 允许任何设备连接到 AWS IoT。

    arn:aws:iot:<region>:<account-id>:client/${iot:ClientId}

    除非 iot:Connection.Thing.IsAttached 在条件键中设置为 True,这相当于上例中的通配符 *。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:client/${iot:Connection.Thing.ThingName}" ], "Condition": { "Bool": { "iot:Connection.Thing.IsAttached": "true" } } } ] }

    资源规范包含与用于连接的设备名称匹配的变量,且条件语句通过检查 MQTT 客户端所用的证书是否与附加到使用此名称的事物的证书匹配,进一步限制权限。

发布
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*/shadow/update

    此示例允许设备更新任何设备的影子(* = 所有设备)。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*

    此示例允许设备读取/更新/删除任何设备的影子。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题。

订阅
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    此示例允许设备订阅为所有设备预留的影子或作业主题。

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/#

    与上一个示例相同,不过使用的是 # 通配符。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/+/shadow/update

    此示例允许设备查看任何设备上的影子更新(+ = 所有设备)。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题和作业相关主题。

接收
  • 合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    此示例是可行的,因为设备只能从其有权订阅的主题接收消息。

Read/modify shadow or job data (4)

为设备授予执行 API 操作权限以访问或修改设备影子或作业执行数据的策略,应该限定对特定资源执行以下操作。API 操作有:

  • DeleteThingShadow

  • GetThingShadow

  • UpdateThingShadow

  • DescribeJobExecution

  • GetPendingJobExecutions

  • StartNextPendingJobExecution

  • UpdateJobExecution

示例:

  • 不合规:

    arn:aws:iot:<region>:<account-id>:thing/*

    此示例允许设备对任何事物执行指定操作。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DeleteThingShadow", "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DescribeJobExecution", "iot:GetPendingJobExecutions", "iot:StartNextPendingJobExecution", "iot:UpdateJobExecution" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing1", "arn:aws:iot:<region>:<account-id>:/thing/MyThing2" ] } ] }

    此示例允许设备仅对两个事物执行指定操作。

Details (4)

对于此检查,AWS IoT Device Defender 会审核在执行审核之前 31 天内用于连接到 AWS IoT 消息代理的所有 Amazon Cognito 身份池。所有的 Amazon Cognito 身份池(无论连接时使用的是经身份验证或未经身份验证的 Amazon Cognito 身份)都在审核范围内。

此检查发现不合规的经身份验证的 Amazon Cognito 身份池角色时,会返回以下原因代码:

  • ALLOWS_BROAD_ACCESS_TO_IOT_THING_ADMIN_READ_ACTIONS

  • ALLOWS_ACCESS_TO_IOT_NON_THING_ADMIN_ACTIONS

  • ALLOWS_ACCESS_TO_IOT_THING_ADMIN_WRITE_ACTIONS

Why it matters (4)

如果经身份验证的身份遭到破坏,它可能使用管理操作来修改账户设置、删除资源或获取对敏感数据的访问权限。

How to fix it (4)

附加到经身份验证的 Amazon Cognito 身份池角色的策略,应该仅为设备授予执行作业所需的权限。我们建议您完成以下步骤:

  1. 创建新的合规角色。

  2. 创建 Amazon Cognito 身份池并为其附加合规角色。

  3. 验证您的身份能否使用新池访问 AWS IoT。

  4. 验证完成后,将角色附加到标记为不合规的 Amazon Cognito 身份池。

您还可以使用缓解操作实现以下目的:

  • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

有关更多信息,请参阅 缓解操作

 

IOT_POLICY_OVERLY_PERMISSIVE_CHECKMQTT permissions (5)Shadow and job permissions (5)Details (5)Why it matters (5)How to fix it (5)
IOT_POLICY_OVERLY_PERMISSIVE_CHECK

AWS IoT 策略提供的权限过于宽泛或不受限制。它为一系列设备授予发送或接收 MQTT 消息的权限,或为一系列设备授予访问或修改影子和作业执行数据的权限。

一般而言,针对某个设备的策略应该授予仅与该设备关联的资源的访问权限,而不应该牵涉其他设备,或只牵涉少量其他设备。除了某些例外情况,在此类策略中使用通配符(例如“*”)指定资源被视为过于宽泛或不受限制。

严重性:危急

MQTT permissions (5)

MQTT 消息通过 AWS IoT 消息代理发送,并由设备用来执行许多不同的操作,包括访问和修改影子状态和作业执行状态。为设备授权以连接、发布或订阅 MQTT 消息的策略,应该限定对特定资源执行如下操作:

连接
  • 不合规:

    arn:aws:iot:<region>:<account-id>:client/*

    通配符 * 允许任何设备连接到 AWS IoT。

    arn:aws:iot:<region>:<account-id>:client/${iot:ClientId}

    除非 iot:Connection.Thing.IsAttached 在条件键中设置为 True,这相当于上例中的通配符 *。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:client/${iot:Connection.Thing.ThingName}" ], "Condition": { "Bool": { "iot:Connection.Thing.IsAttached": "true" } } } ] }

    资源规范包含与用于连接的设备名称匹配的变量。条件语句通过检查 MQTT 客户端所用的证书是否与附加到使用此名称的事物的证书匹配,进一步限制权限。

发布
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*/shadow/update

    此示例允许设备更新任何设备的影子(* = 所有设备)。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/*

    此示例允许设备读取/更新/删除任何设备的影子。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题。

订阅
  • 不合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    此示例允许设备订阅为所有设备预留的影子或作业主题。

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    与上一个示例相同,不过使用的是 # 通配符。

    arn:aws:iot:<region>:<account-id>:topic/$aws/things/+/shadow/update

    此示例允许设备查看任何设备上的影子更新(+ = 所有设备)。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" "arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*" ], } ] }

    资源规范包含通配符,但仅匹配其事物名称用于连接的设备的任何影子相关主题和作业相关主题。

接收
  • 合规:

    arn:aws:iot:<region>:<account-id>:topicfilter/$aws/things/*

    此示例是可行的,因为设备只能从其有权订阅的主题接收消息。

Shadow and job permissions (5)

为设备授予执行 API 操作权限以访问或修改设备影子或作业执行数据的策略,应该限定对特定资源执行以下操作。API 操作有:

  • DeleteThingShadow

  • GetThingShadow

  • UpdateThingShadow

  • DescribeJobExecution

  • GetPendingJobExecutions

  • StartNextPendingJobExecution

  • UpdateJobExecution

示例:

  • 不合规:

    arn:aws:iot:<region>:<account-id>:thing/*

    此示例允许设备对任何事物执行指定操作。

  • 合规:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DeleteThingShadow", "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DescribeJobExecution", "iot:GetPendingJobExecutions", "iot:StartNextPendingJobExecution", "iot:UpdateJobExecution" ], "Resource": [ "arn:aws:iot:<region>:<account-id>:/thing/MyThing1", "arn:aws:iot:<region>:<account-id>:/thing/MyThing2" ] } ] }

    此示例允许设备仅对两个事物执行指定操作。

Details (5)

此检查发现不合规的 IoT 策略时,会返回以下原因代码:

  • ALLOWS_BROAD_ACCESS_TO_IOT_DATA_PLANE_ACTIONS

Why it matters (5)

策略过于宽松的证书、Amazon Cognito 身份或事物组一旦遭到破坏,会影响整个账户的安全性。攻击者可以使用此类宽泛的访问权限,读取或修改所有设备的影子、作业或作业执行数据。或者,攻击者可以使用已遭破坏的证书连接您网络中的恶意设备或发动 DDOS 攻击。

How to fix it (5)

按照以下步骤来修复附加到事物、事物组或其他实体的任何不合规策略:

  1. 使用 CreatePolicyVersion 创建新的兼容版本的策略。将 setAsDefault 标记设置为 True。(这可使此新版本适用于使用策略的所有实体。)

  2. 使用 ListTargetsForPolicy 获取策略附加到的目标列表(证书、事物组),并确定组中包含的设备或使用证书进行连接的设备。

  3. 验证所有关联的设备能否连接到 AWS IoT。如果设备无法连接,使用 SetPolicyVersion 将默认策略回滚到之前的版本,修改策略,然后重试。

您可以使用缓解操作实现以下目的:

  • 对您的审核结果应用 REPLACE_DEFAULT_POLICY_VERSION 缓解操作以进行此更改。

  • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

有关更多信息,请参阅 缓解操作

使用 AWS IoT 策略变量在策略中动态引用 AWS IoT 资源。

 

CA_CERT_APPROACHING_EXPIRATION_CHECKDetails (6)Why it matters (6)How to fix it (6)
CA_CERT_APPROACHING_EXPIRATION_CHECK

CA 证书将在 30 天内过期或已经过期。

严重性:

Details (6)

此检查适用于状态为“ACTIVE”或“PENDING_TRANSFER”的 CA 证书。

此检查发现不合规的 CA 证书时,会返回以下原因代码:

  • CERTIFICATE_APPROACHING_EXPIRATION

  • CERTIFICATE_PAST_EXPIRATION

Why it matters (6)

已过期的 CA 证书不应被用于签发新设备证书。

How to fix it (6)

有关如何继续,请参阅安全最佳实践。您可能想要:

  1. 向 AWS IoT 注册新的 CA 证书。

  2. 验证能否使用新的 CA 证书签发设备证书。

  3. 使用 UpdateCACertificate 在 AWS IoT 中将旧的 CA 证书标记为“INACTIVE”。您还可以使用缓解操作实现以下目的:

    • 对您的审核结果应用 UPDATE_CA_CERTIFICATE 缓解操作以进行此更改。

    • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

    有关更多信息,请参阅 缓解操作

 

CONFLICTING_CLIENT_IDS_CHECKDetails (7)Why it matters (7)How to fix it (7)
CONFLICTING_CLIENT_IDS_CHECK

多个设备使用同一客户端 ID 连接。

严重性:

Details (7)

使用同一客户端 ID 建立了多个连接,从而导致已连接的设备断开连接。MQTT 规范只允许每个客户端 ID 有一个活动连接,因此当另一个设备使用同一客户端 ID 连接时,它会使前一个连接断开。

在按需审核过程中进行此检查时,它会检查在审核开始之前 31 天内客户端 ID 是如何用于连接的。对于计划审核,此检查会查看从上次运行审核到该审核实例开始期间的数据。如果您已在检查期间采取措施来缓解这种状况,请记录连接/连接断开的时间,以判断问题是否持续存在。

此检查发现不合规问题时,会返回以下原因代码:

  • DUPLICATE_CLIENT_ID_ACROSS_CONNECTIONS

此检查返回的结果还包含用于连接的客户端 ID、委托人 ID 和连接断开次数。最近的结果列在最前面。

Why it matters (7)

ID 相冲突的设备将被迫不断重新连接,这可能导致消息丢失或致使设备无法连接。

这可能表示设备或设备的凭证已遭破坏,并可能是 DDoS 攻击的一部分。也有可能是设备未在账户中得到正确配置,或者设备连接效果不佳,被迫每分钟重新连接多次。

How to fix it (7)

将每个设备注册为 AWS IoT 中的唯一事物,并使用事物名称作为客户端 ID 进行连接。或者,在通过 MQTT 连接设备时使用 UUID 作为客户端 ID。您还可以使用缓解操作实现以下目的:

  • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

有关更多信息,请参阅 缓解操作

 

DEVICE_CERT_APPROACHING_EXPIRATION_CHECKDetails (8)Why it matters (8)How to fix it (8)
DEVICE_CERT_APPROACHING_EXPIRATION_CHECK

设备证书将在 30 天内过期或已经过期。

严重性:

Details (8)

此检查适用于状态为“ACTIVE”或“PENDING_TRANSFER”的设备证书。

此检查发现不合规的设备证书时,会返回以下原因代码:

  • CERTIFICATE_APPROACHING_EXPIRATION

  • CERTIFICATE_PAST_EXPIRATION

Why it matters (8)

设备证书过期后不应再投入使用。

How to fix it (8)

有关如何继续,请参阅安全最佳实践。您可能想要:

  1. 预置新证书并将它附加到设备。

  2. 验证新证书是否有效以及设备能否使用它进行连接。

  3. 使用 UpdateCertificate 在 AWS IoT 中将旧证书标记为“INACTIVE”。您还可以使用缓解操作实现以下目的:

    • 对您的审核结果应用 UPDATE_DEVICE_CERTIFICATE 缓解操作以进行此更改。

    • 应用 ADD_THINGS_TO_THING_GROUP 缓解操作,以将设备添加到可以对其执行操作的组。

    • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

    有关更多信息,请参阅 缓解操作

  4. 将旧证书从设备分离。(请参阅 DetachThingPrincipal。)

 

REVOKED_DEVICE_CERT_CHECKDetails (9)Why it matters (9)How to fix it (9)
REVOKED_DEVICE_CERT_CHECK

已吊销的设备证书仍处于活动状态。

严重性:

Details (9)

设备证书位于其 CA 的证书吊销列表中,但它在 AWS IoT 中仍处于活动状态。

此检查适用于状态为“ACTIVE”或“PENDING_TRANSFER”的设备证书。

此检查发现不合规问题时,会返回以下原因代码:

  • CERTIFICATE_REVOKED_BY_ISSUER

Why it matters (9)

设备证书通常因为遭到破坏而被吊销。证书也可能因为错误或疏忽而尚未在 AWS IoT 中吊销。

How to fix it (9)

验证设备证书是否已遭破坏。如果已遭破坏,请遵照安全最佳实践来缓解此情况。您可能想要:

  1. 为设备预置新证书。

  2. 验证新证书是否有效以及设备能否使用它进行连接。

  3. 使用 UpdateCertificate 在 AWS IoT 中将旧证书标记为“REVOKED”。您还可以使用缓解操作实现以下目的:

    • 对您的审核结果应用 UPDATE_DEVICE_CERTIFICATE 缓解操作以进行此更改。

    • 应用 ADD_THINGS_TO_THING_GROUP 缓解操作,以将设备添加到可以对其执行操作的组。

    • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

    有关更多信息,请参阅 缓解操作

  4. 将旧证书从设备分离。(请参阅 DetachThingPrincipal。)

 

LOGGING_DISABLED_CHECKDetails (10)Why it matters (10)How to fix it (10)
LOGGING_DISABLED_CHECK

CloudWatch 中未启用 AWS IoT 日志。

严重性:

Details (10)

此检查发现不合规问题时,会返回以下原因代码:

  • LOGGING_DISABLED

Why it matters (10)

借助 CloudWatch 中的 AWS IoT 日志,您可以了解 AWS IoT 中的行为,包括身份验证失败、意外的连接和连接断开,这些行为可能表明设备遭到破坏。

How to fix it (10)

在 CloudWatch 中启用 AWS IoT 日志。请参阅监控工具。您还可以使用缓解操作实现以下目的:

  • 对您的审核结果应用 ENABLE_IOT_LOGGING 缓解操作以进行此更改。

  • 如果要实现自定义响应以响应 PUBLISH_FINDINGS_TO_SNS 消息,请应用 Amazon SNS 缓解操作。

有关更多信息,请参阅 缓解操作

如何执行审核

  1. 为账户配置审核设置。使用 UpdateAccountAuditConfiguration 启用您希望用于审核、设置可选通知及配置权限的检查。

    对于某些检查,AWS IoT 会在检查启用后立即开始收集数据。

  2. 创建一个或多个审核计划。使用 CreateScheduledAudit 指定您在审核期间要执行的检查以及这些审核应该运行的频率。

    或者,您可以在必要时运行按需审核。使用 StartOnDemandAuditTask 指定要执行的检查并立即开始运行审核。(如果您最近启用了包含在按需审核之中的检查,则可能需要等待一段时间才能获得结果。)

  3. 可以使用 AWS IoT 控制台查看审核结果。

    或者,也可以使用 ListAuditFindings 查看审核结果。使用此命令,您可以按照检查类型、特定资源或审核时间筛选结果。您可以使用此信息来解决发现的任何问题。

  4. 您可以将您在 AWS 账户中定义的缓解操作应用于任何不符合要求的结果。有关更多信息,请参阅 应用缓解操作

通知

审核完成后,系统会发送 SNS 通知,并附带所执行的各项审核检查结果的摘要,包括发现的不合规资源的数量详情。在 UpdateAccountAuditConfiguration 命令的输入中使用 auditNotificationTargetConfigurations 字段。SNS 通知具有以下负载:

负载示例
{ "accountId": "123456789012", "taskId": "4e2bcd1ccbc2a5dd15292a82ab80c380", "taskStatus": "FAILED|CANCELED|COMPLETED", "taskType": "ON_DEMAND_AUDIT_TASK|SCHEDULED_AUDIT_TASK", "scheduledAuditName": "myWeeklyAudit", "failedChecksCount": 0, "canceledChecksCount": 0, "nonCompliantChecksCount": 1, "compliantChecksCount": 0, "totalChecksCount": 1, "taskStartTime": 1524740766191, "auditDetails": [ { "checkName": "DEVICE_CERT_APPROACHING_EXPIRATION_CHECK | REVOKED_DEVICE_CERT_CHECK | CA_CERT_APPROACHING_EXPIRATION_CHECK | REVOKED_CA_CERT_CHECK | DEVICE_CERTIFICATE_SHARED_CHECK | IOT_POLICY_UNRESTRICTED_CHECK | UNAUTHENTICATED_COGNITO_IDENTITY_UNRESTRICTED_ACCESS_CHECK | AUTHENTICATED_COGNITO_IDENTITY_UNRESTRICTED_ACCESS_CHECK | CONFLICTING_CLIENT_IDS_CHECK | LOGGING_DISABLED_CHECK", "checkRunStatus": "FAILED | CANCELED | COMPLETED_COMPLIANT | COMPLETED_NON_COMPLIANT", "nonCompliantResourcesCount": 1, "totalResourcesCount": 1, "message": "optional message if an error occurred", "errorCode": "INSUFFICIENT_PERMISSIONS|AUDIT_CHECK_DISABLED" } ] }
负载 JSON 架构
{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "arn:aws:iot:::schema:auditnotification/1.0", "type": "object", "properties": { "accountId": { "type": "string" }, "taskId": { "type": "string" }, "taskStatus": { "type": "string", "enum": [ "FAILED", "CANCELED", "COMPLETED" ] }, "taskType": { "type": "string", "enum": [ "SCHEDULED_AUDIT_TASK", "ON_DEMAND_AUDIT_TASK" ] }, "scheduledAuditName": { "type": "string" }, "failedChecksCount": { "type": "integer" }, "canceledChecksCount": { "type": "integer" }, "nonCompliantChecksCount": { "type": "integer" }, "compliantChecksCount": { "type": "integer" }, "totalChecksCount": { "type": "integer" }, "taskStartTime": { "type": "integer" }, "auditDetails": { "type": "array", "items": [ { "type": "object", "properties": { "checkName": { "type": "string", "enum": [ "DEVICE_CERT_APPROACHING_EXPIRATION_CHECK", "REVOKED_DEVICE_CERT_CHECK", "CA_CERT_APPROACHING_EXPIRATION_CHECK", "REVOKED_CA_CERT_CHECK", "LOGGING_DISABLED_CHECK" ] }, "checkRunStatus": { "type": "string", "enum": [ "FAILED", "CANCELED", "COMPLETED_COMPLIANT", "COMPLETED_NON_COMPLIANT" ] }, "nonCompliantResourcesCount": { "type": "integer" }, "totalResourcesCount": { "type": "integer" }, "message": { "type": "string", }, "errorCode": { "type": "string", "enum": [ "INSUFFICIENT_PERMISSIONS", "AUDIT_CHECK_DISABLED" ] } }, "required": [ "checkName", "checkRunStatus", "nonCompliantResourcesCount", "totalResourcesCount" ] } ] } }, "required": [ "accountId", "taskId", "taskStatus", "taskType", "failedChecksCount", "canceledChecksCount", "nonCompliantChecksCount", "compliantChecksCount", "totalChecksCount", "taskStartTime", "auditDetails" ] }

您也可以在 AWS IoT 控制台中查看通知,以及设备相关信息、设备统计数据(例如,上次连接时间、活动连接数、数据传输速率)和设备提醒历史记录。

权限

本部分包含有关如何设置创建、运行和管理 AWS IoT Device Defender 审核所需 IAM 角色和策略的信息。有关更多信息,请参阅 AWS Identity and Access Management 用户指南

授予 AWS IoT Device Defender 收集数据的权限以运行审核

调用 UpdateAccountAuditConfiguration 时,必须为 IAM 角色指定两个策略:一个权限策略和一个信任策略。运行审核时,权限策略使用 AWS IoT 授予 AWS IoT Device Defender 访问您账户数据的权限。信任策略授予 AWS IoT Device Defender 代入所需角色的权限。

权限策略
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "iot:GetLoggingOptions", "iot:GetV2LoggingOptions", "iot:ListCACertificates", "iot:ListCertificates", "iot:DescribeCACertificate", "iot:DescribeCertificate", "iot:ListPolicies", "iot:GetPolicy", "iot:GetEffectivePolicies", "cognito-identity:GetIdentityPoolRoles", "iam:ListRolePolicies", "iam:ListAttachedRolePolicies", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:GetRolePolicy" ], "Resource":[ "*" ] } ] }
信任策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

授予 AWS IoT Device Defender 向 SNS 主题发布通知的权限。

如果在 UpdateAccountAuditConfiguration 中使用 auditNotificationTargetConfigurations 参数,则必须为 IAM 角色指定两个策略:一个权限策略和一个信任策略。权限策略授予 AWS IoT Device Defender 向 SNS 主题发布通知的权限。信任策略授予 AWS IoT Device Defender 代入所需角色的权限。

权限策略
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "sns:Publish" ], "Resource":[ "arn:aws:sns:region:account-id:your-topic-name" ] } ] }
信任策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

授予 IAM 用户或组运行 AWS IoT Device Defender 审核命令的权限

要允许 IAM 用户或组管理、运行或查看 AWS IoT Device Defender 结果,必须创建和分配角色,并附加相应的策略以授予这些角色运行适当命令的权限。每个策略的内容取决于您希望用户或组运行的命令。

  • UpdateAccountAuditConfiguration

策略

必须在运行该命令的同一账户中创建 IAM 角色并为其附加策略。不允许跨账户访问。策略应该具有 iam:PassRole 权限(用于传递该角色的权限)。

在以下策略模板中,audit-permissions-role-arn 是您在 UpdateAccountAuditConfiguration 请求中使用 roleArn 参数传递到 AWS IoT Device Defender 的角色 ARN。audit-notifications-permissions-role-arn 是您在 UpdateAccountAuditConfiguration 请求中使用 auditNotificationTargetConfigurations 参数传递到 AWS IoT Device Defender 的角色 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:UpdateAccountAuditConfiguration" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::account-id:role/audit-permissions-role-arn", "arn:aws:iam::account-id:role/audit-notifications-permissions-role-arn" ] } ] }
  • DescribeAccountAuditConfiguration

  • DeleteAccountAuditConfiguration

  • StartOnDemandAuditTask

  • CancelAuditTask

  • DescribeAuditTask

  • ListAuditTasks

  • ListScheduledAudits

  • ListAuditFindings

策略

所有这些命令都要求策略的 Resource 字段中包含 *。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeAccountAuditConfiguration", "iot:DeleteAccountAuditConfiguration", "iot:StartOnDemandAuditTask", "iot:CancelAuditTask", "iot:DescribeAuditTask", "iot:ListAuditTasks", "iot:ListScheduledAudits", "iot:ListAuditFindings" ], "Resource": [ "*" ] } ] }
  • CreateScheduledAudit

  • UpdateScheduledAudit

  • DeleteScheduledAudit

  • DescribeScheduledAudit

策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:CreateScheduledAudit", "iot:UpdateScheduledAudit", "iot:DeleteScheduledAudit", "iot:DescribeScheduledAudit" ], "Resource": [ "arn:aws:iot:region:account-id:scheduledaudit/scheduled-audit-name" ] } ] }

AWS IoT Device Defender 计划审核角色 ARN 的格式为:

arn:aws:iot:region:account-id:scheduledaudit/scheduled-audit-name

服务限制

资源 限制 描述
计划审核 最多 5 个。 在发生 LimitExceeded 异常之前,最多可以创建 5 个计划审核。
同时进行的按需审核 最多 10 个。 在发生 LimitExceeded 异常之前,最多可以创建 10 个按需审核。