已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题

Posted

技术标签:

【中文标题】已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题【英文标题】:AWS IAM policy issue for DynamoDB table access by authenticated Cognito users 【发布时间】:2019-06-20 23:31:01 【问题描述】:

我在通过成功通过身份验证的 Cognito 用户访问新 DynamoDB 表时遇到问题。

尝试扫描表(使用 AWS javascript 开发工具包)时,我收到以下 AccessDeniedException:

Unable to scan. Error: 
  "message": "User: arn:aws:sts::MY-ACCOUNT-NUM:assumed-role/Cognito_VODStreamTestAuth_Role/CognitoIdentityCredentials 
is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:us-east-1:MY-ACCOUNT-NUM:table/VideoCatalog",
  "code": "AccessDeniedException",
  "time": "2019-01-27T02:25:27.686Z",
  "requestId": "blahblah",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 18.559011800834146

已通过以下 DynamoDB 部分扩展了经过身份验证的 Cognito 用户策略:


  "Sid": "AllowedCatalogActions",
  "Effect": "Allow",
  "Action": [
     "dynamodb:BatchGetItem",
     "dynamodb:GetItem",
     "dynamodb:Scan",
     "dynamodb:Query",
     "dynamodb:UpdateItem"
  ],
  "Resource": [
     "arn:aws:dynamodb:us-east-2:MY-ACCOUNT-NUM:table/VideoCatalog"
  ]

只要我像上面那样指定表资源,这是否足以让经过身份验证的 Cognito 用户访问我可能创建的任何 DynamoDB 表?还是我需要在表格的“访问控制”选项卡下添加"Fine-grained access control"?

我可以说我在我的非根管理员 IAM 角色(上面由 MY-ACCOUNT-NUM 表示)下创建了 VideoCatalog DynamoDB 表。那是问题吗? (在尝试移动到 DynamoDB 表之前,我使用 S3 上的 JSON 文件作为视频目录。)

我很困惑!

【问题讨论】:

【参考方案1】:

查看来自 AWS 的错误消息和您提供的政策文档,我可以看到这里有两个不同的区域。

AWS 说您的用户无权访问 aws:dynamodb:us-east-1:MY-ACCOUNT-NUM:table/VideoCatalog,而您的政策文档提供了对 aws 的访问权限:dynamodb:us-east-2:MY-ACCOUNT-NUM:table/VideoCatalog.

您是否可能错误地将资源配置在两个不同的区域?

【讨论】:

本身不是错误的......但感谢您注意到这一点!该表肯定位于 us-east-2 区域,而 Cognito 用户池位于 us-east-1。看到当我尝试以编程方式(使用 AWS JavaScript SDK)扫描 VideoCatalog 表时我没有指定区域,它必须假设它在同一区域中。我没有理由不能将 DynamoDB 表与我的 Cognito 用户池放在同一区域。所以我会这样做并报告! 你说的很对。很容易错过 us-east-1 与 -2 的比赛,但现在我知道首先要考虑区域问题!谢谢!!

以上是关于已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题的主要内容,如果未能解决你的问题,请参考以下文章

如何允许 cognito 身份验证的用户获得对 s3 存储桶的公共访问权限

如何从 Cognito 身份池提供的身份凭证访问用户数据?

如何配置 AWS 用户 cognito 身份验证流程以在 Java sdk 后端生成身份令牌、访问令牌?

如何使用带有 iOS SDK 的 Facebook 身份验证通过 DynamoDB 和 Cognito 存储用户信息

通过 Lambda 到 GetObject 的 Cognito 身份验证角色 - 调用 GetObject 操作时发生错误 (AccessDenied):访问被拒绝

“没有当前用户”:是不是甚至可以通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用?