IAM 策略条件中的 cognito 用户池自定义属性与 Dynamodb 细粒度访问

Posted

技术标签:

【中文标题】IAM 策略条件中的 cognito 用户池自定义属性与 Dynamodb 细粒度访问【英文标题】:cognito user pool custom attribute in IAM Policy Conditions with Dynamodb Fine grained access 【发布时间】:2017-09-16 20:15:12 【问题描述】:

我有一个带有自定义属性 organization_id 的 Cognito 用户池。 一个组织可能有多个用户。可以有多个组织。 另一个 Dynamodb 表用于维护具有 _id 和 organization_id 作为分区键的类别。 类别可以归组织所有,因此属于该特定组织的用户只能在这些类别中执行某些操作。

现在,我如何创建 IAM 策略,以便它采用组织 ID 而不是 sub/user_id,如此处所述http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html


"Version": "2012-10-17",
"Statement": [
    
        "Sid": "AllowAccessToOnlyItemsMatchingUserID",
        "Effect": "Allow",
        "Action": [
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
        ],
        "Condition": 
            "ForAllValues:StringEquals": 
                "dynamodb:LeadingKeys": [
                    "$cognito:organisation_id(?)"

                ],
                "dynamodb:Attributes": [
                    "UserId",
                    "GameTitle",
                    "Wins",
                    "Losses",
                    "TopScore",
                    "TopScoreDateTime"
                ]
            ,
            "StringEqualsIfExists": 
                "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
            
        
    
]

所以我的主要要求是通过 cognito 获取 IAM 策略中的自定义用户池属性。这怎么可能?

【问题讨论】:

你是如何解决这个问题的?? 不能...我为自己的自定义解决方案离开了 API 网关 【参考方案1】:

这是不可能的。它需要 IAM 角色能够从任何认知用户池中识别自定义属性。不过,这是一个有趣的功能,将与团队讨论。

但是,作为替代方案,您可以查看 Cognito 身份和角色库访问控制

http://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html

【讨论】:

有什么更新吗?目前似乎不可能满足@dan 的要求。通过 cognito 组和组特定角色的硬限制为 25。通过自定义属性和基于规则的角色分配的软限制为 25。这两个限制都表明,对于 1000 甚至 10000 个组织/范围内的事物,这两种方法都不可行组。 @SebastianAnnies +1 添加此功能,但是现在每个用户池最多可以有 10,000 个组。似乎仍然是一个相当大的功能疏忽,有效地使 Cognito 仅适用于 1:1 租户与用户池关联。 @Vasileios Lekakis 对该功能 +1。是不是意味着除了用户池之外,我们还需要引入身份池? aws.amazon.com/about-aws/whats-new/2021/01/… 不确定此公告是否包括来自 Congito 用户池的用户。此外,控制台确实包含从属性到主体标签的映射。这是否意味着它实际上是受支持的?【参考方案2】:

一些支持,但据我所知,并不完全符合您的需要。

我的用例与你的非常相似,但我仍然找不到解决方案。

但是,在一定程度上支持将池属性用作细粒度授权。阅读https://docs.aws.amazon.com/cognito/latest/developerguide/attributes-for-access-control.html

我已经能够使用 一些 标准 Cognito 使用池属性(例如 given_name 等),但对于我的生活,我无法获得 custom: 属性工作。我还在 AWS 支持论坛上发布了一些问题和 cmets,并且得到了零回复。

也许软糖是使用标准属性之一。然而,这远非理想。

【讨论】:

从这里开始,我实际上发现您可以使用“自定义:”属性。但是,对于可以在属性值中包含的字符有一些限制。我不知道限制的程度,因为我无法在任何地方找到此文档,但我发现如果您想要使用的任何用户属性的值中包含“#”字符,那么一切都会中断IAM 政策。

以上是关于IAM 策略条件中的 cognito 用户池自定义属性与 Dynamodb 细粒度访问的主要内容,如果未能解决你的问题,请参考以下文章

Cognito/IAM 策略和 S3 获取对象

基于 Cognito ID 的 S3 文件夹访问的 IAM 策略

如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?

从 Cognito 组担任 IAM 角色

Cognito 授权人组

使用 Cognito UnAuth 角色时的 IAM 权限问题