【问题标题】:Access denied on AWS s3 bucket even with bucket and/or user policy即使使用存储桶和/或用户策略,对 AWS s3 存储桶的访问也被拒绝
【发布时间】:2022-04-29 06:00:00
【问题描述】:

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

【问题讨论】:

  • 您可以通过控制台列出对象,但不下载它们吗?对象最初是如何加载到存储桶中的?它们是通过 CLI 复制到那里的吗?
  • @JohnRotenstein 进程:应用程序将对象放入存储桶中。我刷新控制台,我看到它出现了。我选择它并单击“下载”。我被放到一个丑陋的页面上,上面写着拒绝访问。如果我通过控制台手动上传一个对象,我可以立即下载它。

标签: amazon-web-services amazon-s3 permissions access-denied


【解决方案1】:

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

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

  • 私人
  • 公开阅读
  • 公共读写
  • 认证读取
  • 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 Object Ownership can now disable access control lists to simplify access management for data in S3。这避免了指定对象所有权的需要并解决了大多数对象所有权问题。

【讨论】:

  • 我不应该有一个方法让我有一个桶或用户策略,只是说“无论如何上传,这个用户都有权从这个桶下载任何东西”?
  • 如果对象是在没有存储桶所有者权限的情况下上传的,则不可能。我知道——这很奇怪!
  • 谢谢!我发现这些文章很有帮助:docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.htmldocs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html。最后我只是做了一个 restRequest.AddHeader("x-amz-acl", "bucket-owner-full-control") 并解决了它。
  • 这里可以上传多条ACL记录吗?例如,我想让对象公开阅读广告以及存储桶所有者完全控制。
  • @BritGwaltney 不,您似乎只能指定一个 ACL。有关它们定义的详细信息,请参阅:Canned ACL 有关所有权的详细信息,请参阅:Amazon S3 Bucket and Object Ownership
【解决方案2】:

您可以使用以下方法解决它: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

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 2019-04-21
    • 2019-04-28
    • 2019-02-03
    • 1970-01-01
    • 2019-04-20
    • 2021-09-03
    • 2017-02-14
    相关资源
    最近更新 更多