使用IAM策略条件中的Dynamodb Fine grained访问控制来自定义Cognito用户池属性。

7
我有一个带有自定义属性 organization_id 的 Cognito 用户池。 一个组织可能有多个用户。可以有多个组织。 另一个 DynamoDB 表用于维护类别,其中 _id 和 organization_id 是分区键。 类别可以由组织拥有,以便属于该特定组织的用户仅在这些类别中执行某些操作。
现在,我该如何创建 IAM 策略,以便它使用 organization_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策略中获取自定义用户池属性。这是否可能?

你是如何解决这个问题的? - md-shah
无法...所以我放弃了API网关,转而使用自己的定制解决方案。 - Indrajit Dan
3个回答

2

7
有最新进展吗?目前来看,似乎无法实现@dan所需的要求。通过cognito群组和特定群组角色的方式有一个硬性限制为25个。通过自定义属性和规则分配角色的方式有一个软性限制为25个。这两种限制都表明,对于组织/群组数量在1000甚至10000左右的情况,这两种方法都不可行。 - Sebastian Annies
1
@SebastianAnnies 加一分,因为你已经可以在每个用户池中拥有多达10,000个组。但仍然似乎是一个相当大的功能疏忽,有效地使Cognito只适用于1:1租户与用户池关联。 - atlas_scoffed
@Vasileios Lekakis 对该功能点点赞。这是否意味着我们需要引入身份池以补充用户池? - systemdebt
不确定此公告是否包括来自Cognito用户池的用户。此外,控制台确实包含了属性到主体标记的映射。这是否意味着它得到了支持? - agoldis

0

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

我的使用情况与您非常相似,但我仍然找不到解决方案。

然而,对于使用池属性作为细粒度授权,有一定程度的支持。请阅读https://docs.aws.amazon.com/cognito/latest/developerguide/attributes-for-access-control.html

我已经能够使用一些标准的 Cognito 使用池属性(例如given_name等),但是我无法让custom:属性正常工作。我还在 AWS 支持论坛上发布了许多问题和评论,但没有得到任何回复。

也许一个权宜之计是使用其中一个标准属性。然而,这远非理想。


接下来,我实际上发现您可以使用“custom:”属性。但是,有一些限制,即您可以在属性值中包含哪些字符。我不知道限制的程度,因为我找不到任何文档记录,但我发现,如果您在要在IAM策略中使用的任何用户属性的值中具有“#”字符,则所有内容都会中断。 - Rado
我已经能够在IAM策略的条件语句中使用标准和自定义用户池属性。您必须在IAM策略中使用aws PrincipalTag/my_custom_tag,并且还应该添加一个AWS::Cognito::IdentityPoolPrincipalTag映射(例如,将my_custom_tag标签键映射到custom:my_custom_attr声明)。 - maslick

0

是的,你可以这样做:

  1. 创建一个自定义用户池属性:organisation_id
  2. 创建一个带有自定义映射的AWS::Cognito::IdentityPoolPrincipalTag

organisation_id(标签键) -> custom:organisation_id(声明)

  1. 在IAM策略中使用${aws:PrincipalTag/organisation_id}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": [
                        "${aws:PrincipalTag/organisation_id}"
                    ]
                }
            },
            "Action": [
                "dynamodb:*"
            ],
            "Resource": "arn:aws:dynamodb:[REGION]:[ACCOUNT]:table/[TABLE]",
            "Effect": "Allow"
        }
    ]
}

你可以在我对类似问题的回答中看到详细信息

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接