如何定义IAM策略以使用户仅适用于特定DynamoDB表的程序化完全或有限的访问



我的项目之一使用DynamoDB表,但是我们在该项目上的开发人员很少。我们想给出用户特定的秘密密钥和访问密钥,以便它们只能使用特定的DynamoDB表,例如(仅用于阅读访问的一个表,一个表格读写访问)。

您可以使用类似于此的IAM策略,并将其附加到您的组或用户:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StatementForTable1",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:REGION:ACCOUNT:table/Table1"
            ]
        },
        {
            "Sid": "StatementForTable2",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:REGION:ACCOUNT:table/Table2"
            ]
        }
    ]
}

如下所示:

以下策略可以附加到IAM组并为用户提供 允许编程访问名称的DynamoDB表 匹配用户的名称。例如,用户BOB可以执行任何 表中的DynamoDB动作名为Bob。该政策可以附加到 一个包含允许每个人管理自己的用户的组 DynamoDB表。

因此,如果要授予完整访问表的特定用户,则可以按照以下方式设置策略:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "dynamodb:*",
    "Resource": "arn:aws:dynamodb:AWS-REGION-IDENTIFIER:ACCOUNT-ID-WITHOUT-HYPHENS:table/${aws:username}"
  }]
}

使用IAM策略条件进行细粒度访问控制

例如,假设我们要授予限制表中特定属性的权限:

样本IAM策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LimitAccessToSpecificAttributes",
            "Effect": "Allow",
            "Action": [
                "dynamodb:UpdateItem",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:Attributes": [
                        "UserId",
                        "TopScore"
                    ]
                },
                "StringEqualsIfExists": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES",
                    "dynamodb:ReturnValues": [
                        "NONE",
                        "UPDATED_OLD",
                        "UPDATED_NEW"
                    ]
                }
            }
        }
    ]
}

说明:

本部分让相关用户可以做的操作。

"Action": [ 
    "dynamodb:UpdateItem",
    "dynamodb:GetItem",
    "dynamodb:Query",
    "dynamodb:BatchGetItem",
    "dynamodb:Scan"
],

如第一个样本中所述,访问点desc。

"Resource": [
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
        ]

在这里,带有关键字" forallValues:string equals"。指定的用户 只能请求属性" UserId"one_answers" TopScore"。

"ForAllValues:StringEquals": {
                "dynamodb:Attributes": [
                    "UserId",
                    "TopScore"
                ]
            }

可以在以下说明中理解字符串Equequalsifexists的定义:

"权限策略 以下:

如果用户指定选择参数,则其值必须为 特定_attributes。该要求阻止了API动作 返回任何不允许的属性,例如从索引 投影。如果用户指定returnValues参数,则 值必须无,updated_old或updated_new。这是必需的 因为updateItem操作还执行隐式读取操作 要检查一个物品是否在替换之前存在,以便 如果要求,可以返回以前的属性值。限制 以这种方式返回价值可确保用户只能读取或编写 允许的属性。StringEqualsifexists的条款仅确保 这些参数之一 - 选择或返回值 - 可以使用 请求,在允许的操作的上下文中。

"StringEqualsIfExists": {
                "dynamodb:Select": "SPECIFIC_ATTRIBUTES",
                "dynamodb:ReturnValues": [
                    "NONE",
                    "UPDATED_OLD",
                    "UPDATED_NEW"
                ]
            }

您可以在这里找到完整的样本。

相关内容

  • 没有找到相关文章