amazon-web-services - DynamoDBleadingKeys 限制的 IAM 策略 Cognito 变量

标签 amazon-web-services amazon-dynamodb aws-api-gateway amazon-cognito amazon-iam

我的设置: - 移动中心 - Cognito 用户池 - API网关 - DynamoDB

到目前为止我所做的工作: 用户可以注册/登录 Cognito 用户池并获取 Id 和 AccessToken。 IdToken 与 Api 网关 Cognito 授权方一起使用来访问 Api 网关。 将用户子映射到 DynamoDb 的集成消息中是有效的。

"userId": {
    "S": "$context.authorizer.claims.sub"
}

限制对 DynamoDb 表中非用户行的访问不起作用。 DynamoDb 表是使用 Mobile Hubs protected 表功能创建的,该功能创建以下策略:

    "Condition": {
        "ForAllValues:StringEquals": {
            "dynamodb:LeadingKeys": [
                "${cognito-identity.amazonaws.com:sub}"
            ]
        }
    }

但这不起作用,因为此表达式返回身份用户 ID,而不是用户池子。首先我没有使用身份池,其次我想在此处使用用户子。

我发现了 ${cognito-idp.<REGION>.amazonaws.com/<POOL-ID>:sub}应该可以解决问题,但这也不起作用。

如果我对条件进行硬编码以使用测试用户的 Sub,一切都会按预期工作,因此策略本身没问题,只是获取当前用户的 sub 的表达式无法正常工作。

是否可以调试 IAM 策略以查看运行时表达式的值?

有什么想法、提示、建议吗?

提前致谢。

最佳答案

我终于通过使用 aws:PrincipalTags 弄清楚了这一点

先决条件是确保 Cognito 用户承担的 IAM 角色具有 sts:TagSession 承担角色策略权限。 This allows principal tags to be passed after successful login to Cognito.

在 Cognito 身份池中,打开身份验证提供程序并找到 Cognito 提供程序。确保访问控制的属性使用将 username 映射到 sub 的默认映射,或者您有一个传递 sub 属性的自定义规则集到一个PrincipalTag。

最后,您可以使用角色过滤器中传递的标签来仅允许该子角色访问资源。

{
  "Action": [
    "dynamodb:UpdateItem",
    "dynamodb:Query",
    "dynamodb:PutItem",
    "dynamodb:GetItem"
  ],
  "Condition": {
    "ForAllValues:StringEquals": {
      "dynamodb:LeadingKeys": "${aws:PrincipalTag/username}"
    }
  },
  "Effect": "Allow",
  "Resource": "arn:aws:dynamodb:*:*:table/MyTableName",
  "Sid": ""
}

关于amazon-web-services - DynamoDBleadingKeys 限制的 IAM 策略 Cognito 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801845/

相关文章:

linux - 根据 AWS "--profile"更改用户的命令提示符颜色

amazon-web-services - 为什么 AWS Lambda 在使用 Knex.js 时总是超时

java - DynamoDB 慢扫描查询

amazon-dynamodb - 为什么本地二级索引只允许用于散列和范围键(不仅仅是散列?)

javascript - 如何启用 CORS?

amazon-web-services - 不使用托管 UI 的 AWS Cognito 授权代码授权流程

android - AWS S3 Gradle 依赖行

python-3.x - 使用 boto3 在 Dynamo 中按分区键查询所有项目

amazon-web-services - 如何在 API Gateway 中配置 API 以仅接受来自指定 EC2 实例的流量

swagger - 使用基于 swagger 文件的 terraform 部署 api 网关