可以在 dynamodb 的细粒度访问策略中使用通配符 (*) 吗?

Ric*_*ong 13 amazon-dynamodb amazon-iam

我有一个 Amazon dynamodb 表,分区键由用户的 id(来自 facebook 或 google)和其他字符组成。我知道通配符可用于指定细粒度访问策略的属性,但我无法在dynamodb:LeadingKeys工作中使用通配符。

以下是工作方针:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "dynamodb:BatchGetItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:DeleteItem",
              "dynamodb:GetItem",
              "dynamodb:PutItem",
              "dynamodb:Query",
              "dynamodb:UpdateItem"
          ],
          "Resource": [
              "arn:aws:dynamodb:<region>:<...>:table/<table-name>"
          ],
          "Condition": {
              "ForAllValues:StringEquals": {
                  "dynamodb:LeadingKeys": [
                      "g_${accounts.google.com:sub}"
                  ]
              }
          }
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "dynamodb:BatchGetItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:DeleteItem",
              "dynamodb:GetItem",
              "dynamodb:PutItem",
              "dynamodb:Query",
              "dynamodb:UpdateItem"
          ],
          "Resource": [
              "arn:aws:dynamodb:<region>:<...>:table/<table-name>"
          ],
          "Condition": {
              "ForAllValues:StringEquals": {
                  "dynamodb:LeadingKeys": [
                      "*_${accounts.google.com:sub}"
                  ]
              }
          }
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ong 24

我找到了解决方案。因此,不要使用ForAllValues:StringEquals,而是使用ForAllValues:StringLike.

工作方针是这样的:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "dynamodb:BatchGetItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:DeleteItem",
              "dynamodb:GetItem",
              "dynamodb:PutItem",
              "dynamodb:Query",
              "dynamodb:UpdateItem"
          ],
          "Resource": [
              "arn:aws:dynamodb:<region>:<...>:table/<table-name>"
          ],
          "Condition": {
              "ForAllValues:StringLike": {
                  "dynamodb:LeadingKeys": [
                      "*_${accounts.google.com:sub}"
                  ]
              }
          }
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才找到这个参考:http : //docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AccessPolicyLanguage_ConditionType

  • 我很惊讶我发现很少提到这个。从文档中可以看出,您似乎只能基于 ENTIRE 分区键进行行级访问控制,如果您还需要访问控制,这在许多情况下可能会强制课程分区键。这提供了更大的灵活性。 (5认同)