将 public-read 对象放在 AWS S3 上所需的最低权限?

Least privileges required to put public-read objects on AWS S3?

我创建了一个新的 AWS IAM 角色,并赋予它以下策略(尽量遵循最小权限原则):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1493050925000",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::avatars-bus-com-development/avatar/*"
            ]
        }
    ]
}

使用 s3cmd,我尝试使用以下命令行上传一个公开可读的文件:

s3cmd put --public-acl --access_key AKIA... --secret_key "..." \
  spec/fixtures/avatars/large-avatar.jpg \
  s3://avatars-bus-com-development/avatar/00-55/inbb7ljt-2017-02-17-09-00-55/original.jpg

当我这样做时,我收到来自 S3 的拒绝访问错误。

使用 AWS CLI 工具时,我也收到 AccessDenied 错误:

$ AWS_ACCESS_KEY_ID="AKIA..." AWS_SECRET_ACCESS_KEY="..." aws s3 cp \
    --acl public-read \
    --content-type image/png \
    spec/fixtures/image.png \
    s3://bus-com-avatars-development/avatar/francois.png
upload failed: spec/fixtures/image.png to s3://bus-com-avatars-development/avatar/francois.png An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

为了将公开可读的对象放在 S3 上,必须提供哪些其他操作?

问题是由 --acl public-read 引起的,它需要 PutObjectAcl 权限。 (如果你把它去掉,它就可以正常工作。)

因此,将您的政策更新为:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::avatars-bus-com-development/avatar/*"
            ]
        }
    ]
}