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 还很陌生,所以我很小心,不要搞乱太多我不明白的东西。
我尝试转向使用存储桶策略。我将存储桶策略设置如下:
{
"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。
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 - 对于public
或write
acl,策略需要相应更改(PutObject)
当然,没有什么可以阻止您使用 ACL,您需要做的是为您的存储桶设置BucketOwnerPreferred或ObjectWriter。
$ 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
PublicAccessBlockConfiguration和OwnershipControls 。
小智 5
请启用 ACL 并选择ObjectWriter
。
如果您使用 CloudFormation,则必须删除AccessControl
Type: AWS::S3::Bucket
Properties:
# AccessControl: PublicRead << Remove
OwnershipControls: # << Add
Rules:
- ObjectOwnership: ObjectWriter
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43847 次 |
最近记录: |