如何仅允许对 Amazon S3 存储桶中的特定目录的 PutObject 权限

sat*_*nth 5 amazon-s3 amazon-web-services coffeescript amazon-iam

我正在尝试为 Amazon IAM 用户配置一项策略,允许他们仅执行上传到 s3 存储桶的特定文件夹的操作。

当策略写成这样时,我可以成功上传图片:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Put*"
            ],
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的上传功能(在带有浏览器端 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!'
Run Code Online (Sandbox Code Playgroud)

不过,我想将权限范围限制为仅允许 putObject,并且仅在特定目录中。我以为这个策略会起作用,但是它抛出了 403 错误:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::my_bucket/example_directory"
            }
        ]
    }
Run Code Online (Sandbox Code Playgroud)

我的策略中是否存在语法错误,或者我是否执行了其他错误操作?我对编写 IAM 策略还很陌生。

更新

通过让以下代码在 IAM 模拟器中运行,我已经取得了一些进展,但不幸的是,尽管我说应该允许 putObject,但当我尝试实际上传时,它仍然抛出 403 错误。

模拟器通行证

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject*"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Deny",
                "Action": [
                    "s3:PutObjectAcl*",
                    "s3:PutObjectVersionAcl*"
                ],
                "Resource": "*"
            }
        ]
    }
Run Code Online (Sandbox Code Playgroud)

sat*_*nth 5

我终于按预期工作了,关键是我必须在该部分中使用NotActionand 。NotResourceDeny

请看下面的代码:

{
    "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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)