如何为用户 ID 等于 DynamoDB table 名称的 DynamoDB 创建策略?

how to create a policy for DynamoDB where the user id is equal to DyanmoDB table name?

我正在尝试创建一个 DDB 策略,其中 Cognito 用户 ID (sub) 应该等于 DynamoDB table 名称。 DDB中的table name是用户的id(sub)。 因此,该策略应该仅限于该用户访问该用户的 table。 下面是我创建的伪策略。

我不清楚的是如何指定用户 ID ( sub ) 应该等于 DDB table 名称?

{
 "Version": "2020-11-01",
    "Statement": [
        {
            "Sid": "xxxxxxxxxxxxxx",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query",
            ],
             
            "Resource": [ "arn:aws:dynamodb:<REGION>:<ACCOUNT_ID>:table/<${www.amazon.com:user_id}>"]
        }  
         
      DDB TABLE NAME SHOULD MATCH USER ID HERE ${www.amazon.com:user_id}
    ]
}   

很遗憾,您目前无法使用 DynamoDB 执行此操作。这是因为 DynamoDB 的 table 资源不支持任何条件键(参见 https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)。

您唯一可能做的就是使用 dynamodb:LeadingKeys 条件限制每个前导键的访问。这同样只适用于 Query 操作。不适用于 Scan(很明显)。您的保单将如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:Query"
            ],
            "Resource": ["arn:aws:dynamodb:*:*:table/MyTable"],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]
                }
            }
        }
    ]
}