IAM允许访问一个dynamoDB方法,但不能访问另一个使用javascript到AWS的方法

IAM Gives access to one dynamoDB method but not another using javascript to AWS

本文关键字:方法 访问 另一个 javascript 但不能 AWS dynamoDB 许访问 IAM 一个      更新时间:2023-09-26

我在Cognito角色上定义了以下策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-southeast-2: NUMBER:table/myapplication_product"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": [
                        "${cognito-identity.amazonaws.com:sub}"
                    ]
                }
            }
        }
    ]
}

正如您所看到的,它应该允许访问GetItem、UpdateItem和Scan,但我发现只有Scan有效。尝试使用GetItem会导致:

https://dynamodb.ap-southeast-2.amazonaws.com/ 400 (Bad Request)
Error: User: arn:aws:sts:: NUMBER:assumed-role/Cognito_XXXXX_IDUnauth_Role/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:ap-southeast-2:NUMBER:table/myapplication_product(…)

我已经设置了:

AWS.config.region = 'ap-northeast-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'ap-northeast-1:SECRET_UUID',
});
AWS.config.apiVersions = {
    dynamodb: '2012-08-10',
};
this.dynamodb = new AWS.DynamoDB({region: "ap-southeast-2"});

那么,为什么一种方法有效而另一种方法无效呢?

编辑

我想我还应该详细说明实际提出的问题。

这就是扫描,它的基础;ly显示所有产品

Store.prototype.getAllProducts = function(callback) {
    var params = {
        TableName: 'myapplication_product',
    };
    this.dynamodb.scan(params, callback); 
}

这是GetItem:

Store.prototype.getProduct = function (sku, callback) {
    var params = {
        TableName: 'stonesandpearls_product',
        Key: { 
            sku: { S: sku }
        },    
    };
    this.dynamodb.getItem(params, callback);
}

如果我只是使用:

AWS.config.update({accessKeyId: 'MY_SECRET_ID', secretAccessKey: 'MY_SECRET_ACCESS_KEY'});

这些查询起作用,而不是CognitoIdentityCredentials。

这里有几件事。

查看您的策略,您似乎在寻找身份级别的细粒度访问。如果你想这样做,并将扫描添加到你的策略中,它基本上可以让任何身份访问你的完整表。您应该只允许细粒度策略中的项目级操作。用于细粒度访问控制的IAM角色对此进行了更详细的解释。

dynamodb:LeadingKeys条件密钥将允许用户仅访问分区/哈希键值与其标识ID匹配的项。您收到的错误表明,当您发出获取或更新项时,标识ID不是dynamodb表中的哈希密钥,或者您没有在dynamodb查询中设置哈希键值。这也是扫描工作的原因,因为扫描查询不需要哈希键值。