如何在亚马逊S3存储桶中仅允许特定目录的PutObject权限

5
我正在尝试配置一个Amazon IAM用户,使其可以执行仅限于将文件上传到特定S3存储桶文件夹的策略。 当策略编写如下时,我可以成功上传图像:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Put*"
            ],
            "Resource": "*"
        }
    ]
}

以下是我的上传函数(使用浏览器端 JavaScript AWS-SDK 的 Coffeescript 编写):

s3.putObject data, (err, data) =>
  if err
    console.log err
    console.log 'Error uploading data: ', data
  else
    console.log 'succesfully uploaded the image!'

然而,我希望将权限范围限制为仅允许putObject,并且仅在特定目录中。我认为这个策略会起作用,但它会抛出403错误:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::my_bucket/example_directory"
            }
        ]
    }

我的策略中是否有语法错误,或者我做错了其他事情?我还不熟悉编写IAM策略。

更新

通过在IAM模拟器中让以下代码工作,我已经取得了一些进展,但是很遗憾,尽管它说应该允许putObject,但在实际上传时仍会抛出403错误。

simulator pass

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject*"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Deny",
                "Action": [
                    "s3:PutObjectAcl*",
                    "s3:PutObjectVersionAcl*"
                ],
                "Resource": "*"
            }
        ]
    }

дљ†еПѓдї•еЬ®з≠ЦзХ•дЄ≠жЈїеК† "Principal": "*",пЉИжИЦжВ®жГ≥и¶БйЩРеИґзЪДIAMеЄРжИЈпЉЙпЉМзДґеРОйЗНиѓХгАВ - Frederic Henri
谢谢您的帮助,当我这样做时出现了一个错误。 - satyrsynth
2个回答

5

我终于按预期使这个工作起来了,关键在于我必须在拒绝部分中使用NotActionNotResource

请查看以下代码:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject*"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/myfolder",
                "arn:aws:s3:::mybucket/myfolder/*"
            ]
        },
        {
            "Effect": "Deny",
            "NotAction": [
                "s3:PutObjectAcl*",
                "s3:PutObjectVersionAcl*"
            ],
            "NotResource": [
                "arn:aws:s3:::mybucket/myfolder",
                "arn:aws:s3:::mybucket/myfolder/*"
            ]
        }
    ]
}

1

尝试:

"Resource": "arn:aws:s3:::my_bucket/example_directory/*"

谢谢您的建议,但不幸的是它并没有起作用 - 或许这与我的存储桶名称格式为 www.bucketname.com 有关? - satyrsynth
不,那应该没有关系。为了澄清,您是在尝试保存策略时遇到错误吗?还是在应用策略后尝试放置对象时遇到错误? - Mark B
我看到你把工作策略从“Put”改成了“PutObject”。我认为这可能是问题的一部分。尝试将其改回“Put”或添加“s3:PutObjectAcl”权限。 - Mark B
策略验证成功,但当我尝试从浏览器或策略模拟器中上传时,它会导致 putObject 被拒绝。即使我使用 Put* 而不仅仅是 PutObject,情况也是如此。 - satyrsynth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接