如何为用户定义IAM策略,以便仅对特定的dynamodb表具有编程完全访问权限或受限访问权限?

时间:2017-02-21 09:13:34

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

我的一个项目使用了dynamodb表,但我们在该项目上的开发人员很少。我们希望提供用户特定的密钥和访问密钥,以便他们只能使用特定的dynamodb表,例如(一个表仅用于读访问,一个表用于读写访问)。

2 个答案:

答案 0 :(得分:1)

您可以使用与此类似的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"
            ]
        }
    ]
}

答案 1 :(得分:1)

正如Here所述:

  

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

因此,如果您要为表格的特定用户授予 FULL 访问权限,则可以将政策设置为:

{
  "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"
],

如第一个示例中所述,访问点描述

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

这里使用关键字'ForAllValues:StringEquals'。指定的用户   只能请求属性“UserId”和“TopScore”。

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

可以在以下说明中理解StringEqualsIfExists的定义:

  

权限策略中的StringEqualsIfExists子句确保了   以下内容:

     

如果用户指定Select参数,则其值必须为   SPECIFIC_ATTRIBUTES。此要求会阻止API操作   返回任何不允许的属性,例如索引   投影。如果用户指定ReturnValues参数,那么它   值必须为NONE,UPDATED_OLD或UPDATED_NEW。这是必需的   因为UpdateItem操作还执行隐式读取操作   在更换之前检查项目是否存在,以便这样做   如果请求,可以返回先前的属性值。限制   ReturnValues以这种方式确保用户只能读取或写入   允许的属性。 StringEqualsIfExists子句仅保证   可以使用其中一个参数 - Select或ReturnValues   请求,在允许的操作的上下文中。

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

您可以找到完整的样本here