即使具有存储桶和/或用户策略,也无法访问AWS s3存储桶

6
我尝试了几乎所有可能的存储桶策略。我还尝试向用户添加策略,但每次在使用AWS控制台从S3存储桶下载对象时都会收到“访问被拒绝”的提示。 存储桶策略:
{
    "Version": "2012-10-17",
    "Id": "MyPolicy",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::12345678901011:user/my-username"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-bucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "XX.XXX.XXX.XXX/24",
                        "XXX.XXX.XXX.XXX/24"
                    ]
                }
            }
        }
    ]
}

这不起作用,所以我尝试为my-username添加了一个策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

1
你能否通过控制台列出对象,但不下载它们?这些对象最初是如何加载到存储桶中的?它们是通过命令行界面复制到那里的吗? - John Rotenstein
@JohnRotenstein 过程:应用程序将一个对象放入存储桶中。我刷新控制台,看到它出现了。我选择它并单击“下载”。我被放在一个丑陋的页面上,上面写着“访问被拒绝”。如果我通过控制台手动上传一个对象,我就可以立即下载它。 - Scott Decker
2个回答

16
尽管听起来很奇怪,但在上传对象到Amazon S3(PutObject)时,可能存在帐户拥有的存储桶无法访问的情况。

上传对象时可以指定访问控制列表(ACL),可能的值包括:

  • private
  • public-read
  • public-read-write
  • authenticated-read
  • aws-exec-read
  • bucket-owner-read
  • bucket-owner-full-control

通常应使用 bucket-owner-full-control ACL 上传对象。这允许存储桶所有者访问对象并具有控制对象的权限(例如删除它)。

如果未提供此权限,则他们将无法访问或修改该对象。

我知道这与您认为存储桶应该工作的方式相矛盾,但这是真的!

如何解决:

  • 使用 bucket-owner-full-control ACL 重新上传对象;或者
  • 原始上传者可以遍历对象并使用新的ACL执行就地 CopyObject。这样可以更改权限而无需重新上传。

更新:在2021年11月,发布了一个新功能:Amazon S3对象所有权现在可以禁用访问控制列表,以简化S3中数据的访问管理。这避免了需要指定对象所有权并解决了大多数对象所有权问题。


2
我是否应该有一种方法来创建一个存储桶或用户策略,只需说明“无论如何上传,此用户都具有从此存储桶下载任何内容的权限”? - Scott Decker
如果对象是在没有 Bucket Owner 权限的情况下上传的,那就不可能了。我知道这很奇怪! - John Rotenstein
谢谢!我发现这些文章非常有帮助:http://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html 和 http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html。最终,我只需使用restRequest.AddHeader("x-amz-acl", "bucket-owner-full-control")即可解决问题。 - Scott Decker
@JohnRotenstein 这非常有帮助,即使应用了 bucket-owner-full-control,我仍然在其他账户上传时遇到权限问题,如果通过 S3 静态网站(http)调用进行 GetObject,则会出现此问题。非常感谢任何帮助...我的问题... https://dev59.com/G3MOtIcB2Jgan1znbdkj - Rino Bino
@RinoBino 可以随意创建一个新问题,并且会有人能够提供帮助。请包括您上面提到的有趣细节。 - John Rotenstein
显示剩余5条评论

2
您可以通过使用put-object-acl来解决此问题,但必须由原始上传者执行。这比重新复制数据要快得多。我需要处理数TB的数据。
aws s3api put-bucket-acl --bucket $foldername --key $i --grant-full-control uri=http://acs.amazonaws.com/groups/global/AllUsers

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