即使使用存储桶 and/or 用户策略,AWS s3 存储桶上的访问也被拒绝

Access denied on AWS s3 bucket even with bucket and/or user policy

我已经尝试了几乎所有可能的存储桶策略。还尝试向用户添加策略,但每次我尝试使用 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"
                    ]
                }
            }
        }
    ]
}

这不起作用,所以我尝试向我的用户名添加 策略:

{
    "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/*"
            ]
        }
    ]
}

尽管听起来很奇怪,但可以将拥有存储桶的帐户无法访问的对象上传到 Amazon S3。

将对象上传到 Amazon S3 (PutObject) 时,可以指定访问控制列表 (ACL)。可能的值为:

  • 私有
  • public-阅读
  • public-读写
  • 已验证读取
  • aws-exec-读取
  • bucket-owner-read
  • bucket-owner-full-control

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

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

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

如何解决:

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

更新: 2021 年 11 月,发布了一项新功能:Amazon S3 Object Ownership can now disable access control lists to simplify access management for data in S3。这避免了指定对象所有权的需要并修复了对象所有权的大多数问题。

您可以使用以下方法解决它:http://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-acl.html

put-object-acl : 这必须由原始上传者完成。

但绝对比再次复制数据快。

我有 TB 的数据要处理。

aws s3api put-bucket-acl --bucket $foldername --key $i --grant-full-control uri=http://acs.amazonaws.com/groups/global/AllUsers