【问题标题】:AWS IAM -- Using conditionalsAWS IAM -- 使用条件
【发布时间】:2017-03-19 16:54:36
【问题描述】:

我是 AWS 中 IAM 的新手。而且,我希望将各种用户的查询限制为仅主键与 cognito id 匹配的表条目。为此,我制定了政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowAccessToOnlyItemsMatchingUserID",
        "Effect": "Allow",
        "Action": [
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:us-east-1:XXXXXXXXXXX:table/User"
        ],
        "Condition": {
            "ForAllValues:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "${cognito-identity.amazonaws.com:sub}"
                ]
            }
        }
    }
]

}

但是,当我使用 Postman 查询表时,如下所示:

我收到以下错误:

"__type": "com.amazon.coral.service#AccessDeniedException",


"Message": "User: arn:aws:sts::XXXXXXXXXXXXX:assumed-role/Achintest/BackplaneAssumeRoleSession is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:XXXXXXXXXXXXX:table/User"

谁能告诉我我做错了什么?


======== 更新 ========

我尝试使用策略 sim,但我无法理解为什么允许使用如下图所示的无LeadingKey 的查询。

当我提供前导键时,它说拒绝。见下图:

【问题讨论】:

  • 错误信息很清楚。它指出调用用户(即arn:aws:sts::049428796662:assumed...)没有权限在资源上调用进程/机制dynamodb:Queryarn:aws:dynamodb...
  • 是的。但是,我的 cognito id 与表中的主键相同。那么,尽管我正确提供了所有凭据,但为什么会出现此错误?
  • 我不能给你一个具体的答案,但我的猜测是这与凭据的正确性无关,它确实与你服务器端的安全设置有关(这这是一个疯狂的猜测,因为我不熟悉 AWS)。
  • 确实如此。但是,我无法弄清楚为什么,因为我已经按照 AWS 文档中的说明设置了所有内容
  • 很抱歉,但不能真正帮助你超越这一点(即事件提出甚至可能引发你身边想法的愚蠢问题)。希望你早日找到出路。干杯。

标签: amazon-web-services amazon-dynamodb amazon-iam


【解决方案1】:

错误信息具有误导性。 (我有同样的问题) 我创建了一个表,设置了一个策略并且可以进行“查询”和“扫描”。 该表仍然是空的,但查询和扫描返回了合理的 0 行结果。

然后我想要细粒度的访问控制并添加

"Condition": {
    "ForAllValues:StringEquals": {
        "dynamodb:LeadingKeys": [
             "${aws:userid}"
        ]
    }
}

从这一点上 AWS 报告了"AccessDeniedException" .... User ... is not authorized to perform: dynamodb:Query on resource...

我还是继续用数据填充表格 - 等等 - 现在它可以工作了。 因此,如果人们不期望一个空的结果集,错误消息可能是有意义的。

【讨论】:

    【解决方案2】:

    这可能取决于您发出的请求。您的 IAM 策略使用 ForAllValues,它考虑了请求的每个键。如果您的请求中的某些键与结果中的某些条件值不匹配,您的策略可能会返回 false。

    尝试使用ForAnyValue 可能会成功。

    请参阅here 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2021-11-12
      • 2021-05-31
      • 2020-01-23
      • 2017-04-21
      相关资源
      最近更新 更多