AWS S3:存储桶无法使用 ObjectOwnership 的 BucketOwnerEnforced 设置设置 ACL)

Sar*_*tts 40 amazon-s3 amazon-web-services

在我的网站上,突然无法上传照片。我收到以下错误:

##### RightAws::S3Interface returned an error: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidBucketAclWithObjectOwnership</Code><Message>Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting</Message><RequestId>REQUEST</RequestId><HostId>ID$
##### RightAws::S3Interface request: https://bucket.s3.amazonaws.com:443/ ####

RightAws::AwsError (InvalidBucketAclWithObjectOwnership: Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting):
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当这曾经起作用时,我这边没有任何改变。AWS 确实发送了这封电子邮件,这封电子邮件似乎相关,但应该只适用于新的存储桶:

你好,

我们特此通知您,从 2023 年 4 月开始,Amazon S3 将更改所有新 S3 存储桶的默认安全配置。对于此日期之后创建的新存储桶,将启用 S3 阻止公共访问,并禁用 S3 访问控制列表 (ACL)。

大多数 S3 用例不需要公共访问或 ACL。对于大多数客户而言,无需执行任何操作。如果您有公共存储桶访问或使用 ACL 的用例,您可以在创建 S3 存储桶后禁用阻止公共访问或启用 ACL。在这些情况下,您可能需要更新自动化脚本、CloudFormation 模板或其他基础设施配置工具来配置这些设置。要了解更多信息,请阅读有关此更改的 AWS 新闻博客 [1] 和新增公告 [2],或访问我们的 S3 阻止公共访问 [3] 和 S3 对象所有权以禁用 ACL [4] 的用户指南。另请参阅有关这些设置的 AWS CloudFormation 用户指南 [5][6]。

我见过类似的问题,人们通过使用Edit Object Ownership将对象所有权设置为 来修复它ACLs disabled (recommended)。当我尝试这个时,我收到此错误:

无法应用存储桶所有者强制实施,因为您已有存储桶 ACL 如果您想要应用存储桶所有者强制设置,您必须从存储桶 ACL 中删除授予其他 AWS 账户或组的访问权限,并将这些权限迁移到存储桶策略

我不知道如何克服这个问题。我见过有人更新存储桶策略,但我的目前是空白的。我对 AWS 还很陌生,所以我很小心,不要搞乱太多我不明白的东西。

该存储桶应该是公共的。这是当前的 ACL 设置:
访问控制列表

我尝试转向使用存储桶策略。我将存储桶策略设置如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1380877761162",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我删除了存储桶 ACL,将其恢复为默认值。
已删除

我编辑了对象所有权:
对象所有权

我仍然遇到同样的错误,这特别令人困惑,因为如果我理解正确的话,它现在根本不应该使用 ACL。

use*_*462 37

TLDR 现在要创建一个存储桶(aclpublic-read选项的替代方案):

#!/bin/bash

bucket_name="my-unique-name"
aws s3api create-bucket --bucket "${bucket_name}" > /dev/null # 1
aws s3api put-public-access-block --bucket "${bucket_name}" --public-access-block-configuration "BlockPublicPolicy=false" # 2
aws s3api put-bucket-policy --bucket "${bucket_name}" --policy '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::'"${bucket_name}"'/*"
 
            ]
        }
    ]
}' # 3
Run Code Online (Sandbox Code Playgroud)

发生了什么变化

1 - 自2023 年 4 月 25 日起,Amazon 更改了新创建的存储桶的默认设置。存储桶上的 ACL 被认为是错误的做法(这里有一些关于这一点的好文章)。为了阻止使用它们, BucketOwnerEnforced选项开始成为默认选项。

BucketOwnerEnforced - 访问控制列表 (ACL) 被禁用,不再影响权限。存储桶所有者自动拥有并完全控制存储桶中的每个对象。存储桶仅接受未指定 ACL 或存储桶所有者完全控制 ACL 的 PUT 请求,例如存储桶所有者完全控制预设 ACL 或以 XML 格式表示的此 ACL 的等效形式。

$ aws s3api get-bucket-ownership-controls --bucket "${bucket_name}"

{
    "OwnershipControls": {
        "Rules": [
            {
                "ObjectOwnership": "BucketOwnerEnforced"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

2 - 如果没有BlockPublicPolicy,我们将无法设置对存储桶的公共访问。如果是 acl authenticated-read(不是 100% 确定的想法),请确保RestrictPublicBuckets也设置为 false。

3 - 对于publicwriteacl,策略需要相应更改(PutObject

当然,没有什么可以阻止您使用 ACL,您需要做的是为您的存储桶设置BucketOwnerPreferredObjectWriter

$ aws s3api put-bucket-ownership-controls --bucket "${bucket_name}" --ownership-controls="Rules=[{ObjectOwnership=BucketOwnerPreferred}]"
$ aws s3api put-bucket-acl --bucket "${bucket_name}" --acl public-read
Run Code Online (Sandbox Code Playgroud)


Cos*_*tin 26

我有一个类似的问题。根据之前对该问题的回答,我做了这些更改:

resources:
  Resources:
    TasksAPIBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.bucketName}
        ### No more AccessControl
        # AccessControl: PublicRead
        ###  replace it with...
        PublicAccessBlockConfiguration:
          BlockPublicAcls: false
        OwnershipControls:
          Rules:
            - ObjectOwnership: ObjectWriter
        ###
        WebsiteConfiguration:
          IndexDocument: index.html
          ErrorDocument: error.html
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅AWS::S3::Bucket PublicAccessBlockConfigurationOwnershipControls 。


小智 5

请启用 ACL 并选择ObjectWriter

如果您使用 CloudFormation,则必须删除AccessControl

Type: AWS::S3::Bucket
Properties:
  # AccessControl: PublicRead << Remove
  OwnershipControls:  # << Add
    Rules:
      - ObjectOwnership: ObjectWriter
Run Code Online (Sandbox Code Playgroud)

  • 您能否添加解释为什么应删除“AccessControl”以及“OwnershipControls”正在做什么? (3认同)