【问题标题】:How to allow only PutObject permissions on specific directory in Amazon S3 bucket如何只允许对 Amazon S3 存储桶中特定目录的 PutObject 权限
【发布时间】:2016-06-11 01:42:09
【问题描述】:

我正在尝试为 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 错误。

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

【问题讨论】:

  • 您能否在策略中添加"Principal": "*",(或您要限制的 IAM 账户)并重试
  • 感谢您的帮助,我这样做时遇到错误

标签: amazon-web-services amazon-s3 coffeescript amazon-iam


【解决方案1】:

我终于按预期完成了这项工作,关键是我必须在Deny 部分中使用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/*"
            ]
        }
    ]
}

【讨论】:

    【解决方案2】:

    试试:

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

    【讨论】:

    • 感谢您的建议,但不幸的是它不起作用-也许这与我的存储桶名称格式为www.bucketname.com有关?
    • 不,这根本不重要。澄清一下,您在尝试保存策略时是否遇到错误?还是在应用策略后尝试放置对象时出现错误?
    • 我看到您将工作策略从 Put* 更改为 PutObject。我认为这可能是问题的一部分。尝试将其改回Put* 或添加s3:PutObjectAcl 权限。
    • 策略验证成功,但是当我尝试在策略模拟器和浏览器中上传时,它会导致 putObject 被拒绝。当我使用 Put* 而不仅仅是 PutObject 时也是如此。
    猜你喜欢
    • 2019-10-07
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2021-11-10
    • 2018-04-24
    相关资源
    最近更新 更多