amazonweb服务-如何使用DynamoDB细粒度访问控制与Cognito用户池



当使用Cognito用户池登录时,我很难理解如何在DynamoDB上使用细粒度访问控制。我一直在关注医生并在谷歌上搜索,但由于某种原因,我似乎无法让它发挥作用。

下面列出了我的AWS设置。如果我删除角色策略中的条件,我可以获得和放置没有问题的项目,所以条件似乎就是问题所在。但我不知道如何或在哪里调试依赖于已验证身份的策略——哪些变量可用,它们的值是什么,等等。

如有任何帮助,我们将不胜感激!

DynamoDB表

  • 表名:文档
  • 主分区键:userID(字符串)
  • 主要排序关键字: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状态:禁用
  • sub:4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
  • 电子邮件验证:true

"RoleName"的角色策略

{
    "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

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

由于"${cognito-identity.amazonaws.com:sub}"中的值永远不会与DynamoDB行中的值匹配,因此它将以AccessDenied失败。要做到这一点,Dynamo条目中的userId实际上应该是标识id,而不是sub。目前,IAM策略变量和Cognito用户池服务之间没有直接链接。

这里有一些文档链接可能会有所帮助
1.Cognito Federated Identity Service的IAM角色
2.将用户池与Cognito联合身份服务集成

添加到Chetan的答案中:

目前,IAM策略变量和Cognito用户池服务之间没有直接链接。

截至2023年8月(但我相信这在更早的时候是可能的),这种说法已不再成立。

相反,确实可以通过PrincipalTag将IAM策略变量映射到Cognito用户池属性(标准和自定义)。

是的,你可以做到:

  1. 使用默认或自定义映射创建AWS::Cognito::IdentityPoolPrincipalTag:

username(标签密钥)->sub(索赔)

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

上面的IAM片段将允许对DynamoDB表项进行细粒度访问。例如:

具有sub属性4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb的Cognito用户池用户能够访问具有值4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb的主键userID的项目。

你可以在我对类似问题的回答中看到细节。

相关内容

  • 没有找到相关文章

最新更新