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

UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK

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

  • 管理或修改事物。

  • 读取事物管理数据。

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

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

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

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

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

严重性:危急

详细信息

对于此检查,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

为什么这非常重要

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

如何修复

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

  1. 创建新的合规角色。

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

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

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

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

  • 应用 Amazon SNS 缓解操作,以实施自定义响应来响应 PUBLISH_FINDINGS_TO_SNS 消息。

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

管理或修改事物。

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

  • AddThingToThingGroup

  • AttachThingPrincipal

  • CreateThing

  • DeleteThing

  • DetachThingPrincipal

  • ListThings

  • ListThingsInThingGroup

  • RegisterThing

  • RemoveThingFromThingGroup

  • UpdateThing

  • UpdateThingGroupsForThing

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

读取事物管理数据

以下 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" ] } ] }

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

管理非事物对象

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

订阅/发布到 MQTT 主题

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/*

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

读取/修改影子或作业数据

为设备授予执行 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" ] } ] }

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