为您的桶控制对象所有权和禁用 ACL。
S3 对象所有权是 Amazon S3 桶级设置,您可以使用它禁用 access control list(ACL)(访问控制列表 ACL),并获取桶中每个对象的所有权,从而简化了对存储在 Amazon S3 中的数据的访问管理。预设情况下,当另一个 AWS 账户 将对象上载到您的 S3 桶,该账户(对象写入器)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用 Object Ownership 来更改此原定设置行为。
使用 Object Ownership,ACL 将被禁用,而且作为桶拥有者,您将自动拥有桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM policy、S3 桶策略、虚拟私有云(VPC)端点策略和 AWS Organizations 服务控制策略(SCP)。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在必须单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 AWS 账户 上载的对象维护桶。作为桶拥有者,您拥有桶中的所有对象,并可以使用策略管理对它们的访问。
对象所有权有三个设置,您可以使用它来控制上载到桶的对象的所有权,并禁用或启用 ACL:
已禁用 ACL
-
强制桶拥有者(推荐)— ACL 被禁用,桶拥有者自动拥有并完全控制桶中的每个对象。ACL 不再影响 S3 桶中对数据的权限。桶使用策略来定义访问控制。
已启用 ACL
-
Bucket owner preferred(首选桶拥有者)— 桶拥有者拥有并完全控制其他账户使用
bucket-owner-full-control
标准 ACL 写入桶的新对象。 -
对象写入器(原定设置)— 该 AWS 账户 上载对象拥有该对象,对其拥有完全控制权,并且可以通过 ACL 授予其他用户访问该对象的权限。
从 2023 年 4 月开始,Amazon S3 将更改所有新 S3 桶的 S3 阻止公有访问和对象所有权(禁用 ACL)的原定设置。对于在此更新之后创建的新桶,所有 S3 阻止公有访问设置都将启用,S3 访问控制列表(ACL)将被禁用。这些原定设置是在 Amazon S3 中保护数据的推荐最佳实践。您可以在创建桶后调整这些设置。有关更多信息,请参阅 新 S3 桶的原定设置常见问题解答和 AWS 新闻博客中的 Heads-Up: Amazon S3 Security Changes Are Coming in April of 2023
对于 S3 中的大多数现代使用案例,我们建议您通过选择桶拥有者强制执行的设置来禁用 ACL,然后根据需要使用桶策略与账户外的用户共享数据。这种方法简化了权限管理和审计。您可以在新创建的桶和现有桶上禁用 ACL。如果现有桶中已有对象,在禁用 ACL 后,对象和桶 ACL 将不再是访问评估的一部分,并且根据策略授予或拒绝访问权限。对于现有桶,您可以在禁用 ACL 后随时重新启用它们,并恢复原先存在的桶和对象 ACL。
在禁用 ACL 之前,我们建议您查看桶策略,以确保它涵盖了您打算在账户外授予对桶访问权限的所有方式。您必须将桶 ACL 重置为原定设置值(由桶拥有者完全控制)。禁用 ACL 后,您的桶仅接受未指定 ACL 的 PUT 请求或具有桶拥有者完全控制 ACL 的 PUT
请求,例如 bucket-owner-full-control
标准 ACL 或以 XML 表示的此 ACL 的等效形式。支持桶拥有者完全控制 ACL 的现有应用程序没有影响。包含其他 ACL 的 PUT
请求(例如,向某些 AWS 账户的自定义授权)失败并返回带有错误代码 AccessControlListNotSupported
的 400
错误。
反之,具有桶拥有者首选设置的桶将继续接受和遵守桶和对象 ACL。有了这个设置,用 bucket-owner-full-control
标准的 ACL 编写的新对象将自动归桶所有者而不是对象写入器所有。所有其他 ACL 行为都保持不变。为了要求所有 Amazon S3 PUT
操作都包含 bucket-owner-full-control
标准 ACL,您可以添加一个桶策略,该策略只允许使用该 ACL 上载对象。
要查看哪些对象所有权设置应用于您的桶,您可以使用 Amazon S3 Storage Lens 存储统计管理工具指标。S3 Storage Lens 存储统计管理工具是一项云存储分析功能,您可以使用它在整个组织范围内了解对象存储的使用情况和活动。有关更多信息,请参阅使用 S3 Storage Lens 存储统计管理工具查找对象所有权设置。
对象所有权设置
此表显示了每个对象所有权设置对 ACL、对象、Object Ownership 和对象上载的影响。
设置 | 适用于 | 对 Object Ownership 的影响 | 对 ACL 的影响 | 已接受上载 |
---|---|---|---|---|
强制桶拥有者(推荐) | 所有新的和现有对象 | 桶拥有者拥有每个对象。 |
ACL 已禁用,不再影响桶的访问权限。设置或更新 ACL 的请求失败。然而,我们仍然支持读取 ACL 的请求。 桶拥有者拥有完全所有权和控制 对象写入者不再拥有完全的所有权和控制权。 |
使用桶拥有者完全控制 ACL 进行上载或未指定 ACL 的上载 |
桶拥有者首选 | 新对象 | 如果对象上载包含 bucket-owner-full-control 标准 ACL,桶拥有者拥有该对象。使用其他 ACL 上载的对象归写入账户所有。 |
ACL 可以更新并可以授予权限。 如果对象上载包含 |
所有上载项 |
对象写入器(原定设置) | 新对象 | 对象写入器拥有该对象。 |
ACL 可以更新并可以授予权限。 对象写入器具有完全控制权限。 |
所有上载项 |
通过禁用 ACL 引起的更改
当您应用桶拥有者强制执行的 Object Ownership 设置以禁用 ACL 时,您将自动拥有并完全控制桶中的每个对象,而无需执行任何其他操作。应用此设置后,您将看到三个更改:
-
所有桶 ACL 和对象 ACL 都被禁用,这将为您提供作为桶拥有者的完全访问权限。当您对桶或对象执行读取 ACL 请求时,您将看到仅向桶拥有者授予完全访问权限。
-
作为桶拥有者,您自动拥有并完全控制桶中的每个对象。
-
ACL 不再影响桶的访问权限。因此,您的数据访问控制基于策略,如 IAM policy、S3 桶策略、VPC 端点策略和 Organizations SCP。

如果您使用 S3 版本控制,则桶拥有者拥有并完全控制桶中的所有对象版本。应用桶拥有者强制执行的设置不会添加对象的新版本。
只有在新对象使用桶拥有者完全控制 ACL 或未指定 ACL 时,才能将新对象上载到桶。如果指定任何其他 ACL,对象上载将失败。有关更多信息,请参阅故障排除。
因为以下示例中使用 AWS Command Line Interface(AWS CLI)的 PutObject
操作包含 bucket-owner-full-control
固有的 ACL,所以目标可以上载至 ACL 禁用的桶中。
aws s3api put-object --bucket
DOC-EXAMPLE-BUCKET
--keykey-name
--bodypath-to-file
--acl bucket-owner-full-control
因为以下 PutObject
操作没有指定 ACL,对于禁用 ACL 的桶,它也会成功。
aws s3api put-object --bucket
DOC-EXAMPLE-BUCKET
--keykey-name
--bodypath-to-file
如果其他 AWS 账户 在上载后需要对象的访问权限,您必须通过桶策略向这些账户授予其他权限。有关更多信息,请参阅示例演练:管理对 Amazon S3 资源的访问。
重新启用 ACL
您可以随时从桶拥有者强制执行的设置更改为另一个 Object Ownership 设置来重新启用 ACL。如果在应用桶拥有者强制执行的设置之前使用了对象 ACL 进行权限管理,并且您没有将这些对象 ACL 权限迁移到桶策略中,则在重新启用 ACL 后,这些权限将恢复。此外,在应用桶拥有者强制设置时写入桶的对象仍然归桶拥有者所有。
例如,如果您从桶拥有者强制设置更改为对象写入器,则作为桶拥有者,您将不再拥有和完全控制以前由其他 AWS 账户 拥有的对象。反之,上载账户将再次拥有这些对象。其他账户拥有的对象使用 ACL 获取权限,因此您不能使用策略向这些对象授予权限。但是,您作为桶所有者,在应用桶所有者强制设置时,仍然拥有写入桶的任何对象。这些对象不归对象写入器所有,即使您重新启用 ACL 也是如此。
有关使用 AWS Management Console、AWS Command Line Interface(CLI)、REST API 或 AWS SDK 启用和管理 ACL 的说明,请参阅配置 ACL。
禁用 ACL 的先决条件
在为现有桶禁用 ACL 之前,请先完成以下先决条件。
查看桶和对象 ACL 并迁移 ACL 权限
禁用 ACL 时,桶和对象 ACL 授予的权限不再影响访问。在禁用 ACL 之前,请查看桶和对象 ACL。要识别需要 ACL 进行授权的 Amazon S3 请求,您可以使用 Amazon S3 服务器访问日志中的 aclRequired
字段或 AWS CloudTrail。有关更多信息,请参阅 使用 Amazon S3 访问日志确定请求 和 使用 CloudTrail 识别 Amazon S3 请求:
如果您的桶 ACL 向账户以外的其他人授予读取或写入权限,则必须将这些权限迁移到桶策略,然后才能应用桶拥有者强制执行的设置。如果您不迁移在账户之外授予读取或写入访问权限的桶 ACL,则应用“强制桶拥有者”设置的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。
例如,如果要为接收服务器访问日志的桶禁用 ACL,则必须将 S3 日志交付组的桶 ACL 权限迁移到桶策略中的日志记录服务委托人。有关更多信息,请参阅为服务器访问日志记录授予 S3 日志交付组的访问权。
如果您希望对象写入器保持对其上载的对象的完全控制权,则对象写入器是您使用案例的最佳对象所有权设置。如果您想在单个对象级别控制访问权限,那么桶拥有者首选是最佳选择。这些用例不常见。
要查看 ACL 并将 ACL 权限迁移到桶策略,请参阅 禁用 ACL 的先决条件。
查看和更新使用 ACL 相关条件密钥的桶策略
应用桶拥有者强制设置禁用 ACL 后,只有在请求使用桶拥有者完全控制 ACL 或未指定 ACL 的情况下,才能将新对象上载到桶。在禁用 ACL 之前,请查看桶策略以了解 ACL 相关的条件密钥。
如果您的桶策略使用 ACL 相关的条件密钥来要求 bucket-owner-full-control
储存的 ACL(例如,s3:x-amz-acl
),您无需更新桶策略。以下桶策略使用 s3:x-amz-acl
以要求 bucket-owner-full-control
储存的 ACL 用于 S3 PutObject
请求。这项策略仍旧要求对象写入器指定 bucket-owner-full-control
标准的 ACL。但是,禁用 ACL 的桶仍然接受此 ACL,因此请求将继续成功,无需客户端更改。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with bucket owner full control", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
111122223333
:user/ExampleUser
" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
但是,如果您的桶策略使用的是要求不同 ACL 的 ACL 相关条件密钥,则必须移除此条件密钥。此示例桶策略要求 public-read
ACL 用于 S3 PutObject
请求,因此必须在禁用 ACL 之前进行更新。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with public read access", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
111122223333
:user/ExampleUser
" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "public-read" } } } ] }
Object Ownership 权限
要应用、更新或删除桶的 Object Ownership 设置,您需要 s3:PutBucketOwnershipControls
权限。要返回桶的 Object Ownership 设置,您需要 s3:GetBucketOwnershipControls
权限。有关更多信息,请参阅 在创建桶时设置 Object Ownership 和 查看 S3 桶的对象所有权设置。
禁用所有新桶的 ACL
您可以通过使用 IAM 或企业策略借助禁用的 ACL 要求创建所有新的桶。您可以使用 IAM 和企业策略中的 s3:x-amz-object-ownership
条件密钥,要求桶拥有者在所有新创建的桶上强制执行 Object Ownership 设置。通过要求桶拥有者强制设置,您可以确保账户或企业中的所有新桶都禁用 ACL。有关更多信息,请参阅禁用所有新桶的 ACL(强制执行桶拥有者)。
复制和 Object Ownership
当您使用 S3 副本,且源和目标桶由不同的 AWS 账户 拥有时,您可以禁用 ACL(桶所有者强制设定对象所有权)以将副本拥有权更改为拥有目标桶的 AWS 账户。此设置模拟现有的所有者覆盖行为,而无需 s3:ObjectOwnerOverrideToBucketOwner
权限。在桶拥有者强制设置的情况下已复制到目标桶的所有对象都归目标桶拥有者所有。有关复制配置的所有者覆盖选项的更多信息,请参阅 更改副本拥有者。
如果您对 Object Ownership(对象拥有权)使用原定设置对象写入器设置,或将桶拥有者首选设置用于目标桶,则可以使用 S3 复制拥有者覆盖选项以将已复制对象的拥有权转移给目标桶拥有者。
设置对象所有权
您可以使用 S3 控制台、AWS CLI、AWS SDK、Amazon S3 REST API 或 AWS CloudFormation 应用 Object Ownership 的设置。以下 REST API 和 AWS CLI 命令支持 Object Ownership:
REST API | AWS CLI | 描述 |
---|---|---|
PutBucketOwnershipControls | put-bucket-ownership-controls |
为现有 S3 桶创建或修改 Object Ownership 设置。 |
CreateBucket | create-bucket |
使用创建桶 x-amz-object-ownership 请求标头以指定 Object Ownership 设置。 |
GetBucketOwnershipControls | get-bucket-ownership-controls |
检索 Amazon S3 桶的 Object Ownership 设置。 |
DeleteBucketOwnershipControls | delete-bucket-ownership-controls |
删除 Amazon S3 桶的对象所有权设置。 |
有关应用和使用 Object Ownership 设置的更多信息,请参阅以下主题。
主题