如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?

Posted

技术标签:

【中文标题】如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?【英文标题】:How to use DynamoDB fine grained access control with Cognito User Pools? 【发布时间】:2016-12-08 11:23:15 【问题描述】:

使用 Cognito 用户池登录时,我无法理解如何在 DynamoDB 上使用细粒度访问控制。我已经按照文档和谷歌搜索,但由于某种原因,我似乎无法让它工作。

下面列出了我的 AWS 设置。如果我删除角色策略中的条件,我可以获取和放置项目没有问题,因此条件很可能是问题所在。但我不知道如何或在何处调试依赖于经过身份验证的身份的策略 - 哪些变量可用,它们的值是什么等等。

任何帮助将不胜感激!

DynamoDB 表

表名:文档 主分区键:用户 ID(字符串) 主排序键:docID(字符串)

DynamoDB 示例行


  "attributes": ,
  "docID": "0f332745-f749-4b1a-b26d-4593959e9847",
  "lastModifiedNumeric": 1470175027561,
  "lastModifiedText": "Wed Aug 03 2016 07:57:07 GMT+1000 (AEST)",
  "type": "documents",
  "userID": "4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb"

Cognito 用户池用户

用户状态:启用/确认 MFA 状态:已禁用 子:4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb email_verified: true

“角色名称”的角色政策


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents"
            ],
            "Condition": 
                "ForAllValues:StringEquals": 
                    "dynamodb:LeadingKeys": [
                        "$cognito-identity.amazonaws.com:sub"
                    ]
                
            
        
    ]

cognitoUser.getUserAttributes()返回的登录信息

attribute sub has value 4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
attribute email_verified has value true
attribute email has value ****@****com

错误信息

Code: "AccessDeniedException"
Message: User: arn:aws:sts::NUMBER:assumed-role/ROLE_NAME/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents

【问题讨论】:

【参考方案1】:

策略变量"$cognito-identity.amazonaws.com:sub" 不是您从 Cognito 用户池获得的用户子。实际上,当您将 Cognito 用户池中的用户与联合身份服务联合时,Cognito 联合身份服务会生成用户的身份 ID。

由于 "$cognito-identity.amazonaws.com:sub" 中的值永远不会与您在 DynamoDB 行中的值匹配,因此它会因 AccessDenied 而失败。为此,您的 Dynamo 条目中的 userId 实际上应该是身份 ID,而不是子 ID。目前,IAM 策略变量和 Cognito 用户池服务之间没有直接联系。

这里有一些文档链接可能会有所帮助。 1.IAM roles with Cognito Federated Identity Service 2.Integrating User Pools with Cognito Federated Identity Service

【讨论】:

非常感谢!对于那些需要更多指导的人,当用户使用 Cognito 身份池登录时,IAM 中的字符串 $cognito-identity.amazonaws.com:sub 将解析为在AWS.config.credentials.identityId 中找到的值(看起来类似us-east-1:########-####-####-####-############)。 我面临***.com/questions/40446680/… 中描述的类似问题。我的主键与 cognito id 相同,但我仍然收到未经授权的错误。 @Chetan Mehta:你知道是否有计划使用cognitoIdentityId 作为替代变量?对于我的用例,我在 DynamoDB 中使用 cognitoIdentityId 作为 HASHKEY,最好(从安全的角度)使用 dynamodb:LeadingKeyscognitoIdentityId 作为策略中条件的替代变量(类似于“Fine - 对 Amazon DynamoDB 的粒度访问”:docs.aws.amazon.com/cognito/latest/developerguide/…)。 @Chetan Mehta,我可以在身份验证后在我的 api 调用中获取 identityID。但是我如何在我的 getObject 中实际传递它?我需要将它包含在键前缀中吗? 有什么方法可以让我在 IAM 策略文档中获取用户的 cognito pool sub? IAM 角色何时只能通过身份池访问?

以上是关于如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 dynamoDB 和用户组进行细粒度访问

粗粒度与细粒度权限控制

粗粒度与细粒度权限控制

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

Lambda 代入具有细粒度权限的 AWS IAM 角色