【问题标题】:IAM Gives access to one dynamoDB method but not another using javascript to AWSIAM 授予对一种 dynamoDB 方法的访问权限,但不授予对 AWS 使用 javascript 的另一种方法的访问权限
【发布时间】:2016-03-23 11:37:01
【问题描述】:

我在 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"});

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

编辑

我认为我还应该详细说明正在执行的实际查询。

这是扫描,基本上是为了显示所有产品

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。

【问题讨论】:

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


    【解决方案1】:

    这里有几件事。

    查看您的政策,您似乎正在寻找身份级别的细粒度访问权限。如果您想要,并且将 Scan 添加到您的策略中,它基本上可以让任何身份访问您的完整表。您应该只允许细粒度策略中的项目级操作。 IAM roles for fine grained access control 更详细地解释了这一点。

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

    【讨论】:

    • 感谢您的 cmets。基本上,这是一个显示产品目录的网站,因此扫描对功能至关重要,所以我想要那个。我真的不想要细粒度的访问,我只是希望允许显示的三种方法。第二点,我会尝试不带条件(反正我不是很明白)。
    • 我从策略中删除了条件块,GetItem 开始工作。您回答的第二部分是问题的答案
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多