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

标签 amazon-web-services amazon-dynamodb amazon-iam amazon-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 状态:已禁用
  • 子:4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
  • email_verified: 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 而失败。为此,userId在您的 Dynamo 条目中实际上应该是身份 ID,而不是 sub。目前,IAM 策略变量与 Cognito 用户池服务之间没有直接联系。

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

    关于amazon-web-services - 如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38731723/

    相关文章:

    amazon-dynamodb - DynamoDB更新项目多操作

    java - 使用 spring-data-dynamodb 自定义 DynamoDBMapper

    amazon-web-services - 使用 cloudformation 附加 IAM 角色

    node.js - 如何使用 node.js 解码并验证 AWS SigV4 请求的签名

    amazon-web-services - 有没有办法以编程方式列出 AWS 服务的所有可用操作?

    amazon-web-services - AWS CLI中的SSL CERTIFICATE_VERIFY_FAILED

    amazon-web-services - AWS SAM 模板 - 定义由 API Gateway 触发的 SQS 队列

    amazon-web-services - Cloudformation - 在 map 中定义默认值

    java - 如何使用 EasyMock 模拟 DynamoDB 的 ItemCollection<QueryResult>?

    amazon-web-services - AWS : Cannot delete folders with current IAM policy