为您的存储桶控制对象所有权和禁用 ACL。 - Amazon Simple Storage Service

为您的存储桶控制对象所有权和禁用 ACL。

S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权并禁用或启用访问控制列表(ACL)。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对数据的访问权限。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您将 ACL 保持为禁用状态,除非有必须单独控制每个对象的访问权限的特殊情况。禁用 ACL 后,您可以使用策略来更轻松地控制对存储桶中每个对象的访问权限,无论是谁将对象上传到存储桶。

对象所有权有三个设置,您可以使用它来控制上载到存储桶的对象的所有权,并禁用或启用 ACL:

已禁用 ACL
  • 强制存储桶拥有者(默认)– ACL 已禁用,存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不再影响 S3 存储桶中对数据的权限。存储桶使用策略来定义访问控制。

已启用 ACL
  • Bucket owner preferred(首选存储桶拥有者)— 存储桶拥有者拥有并完全控制其他账户使用 bucket-owner-full-control 标准 ACL 写入存储桶的新对象。

  • 对象编写者— 该 AWS 账户上载对象拥有该对象,对其拥有完全控制权,并且可以通过 ACL 授予其他用户访问该对象的权限。

对于 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 账户的自定义授权)失败并返回带有错误代码 AccessControlListNotSupported400 错误。

反之,具有首选存储桶拥有者设置的存储桶将继续接受和遵守存储桶和对象 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 存储统计管理工具查找对象所有权设置

注意

有关将 Amazon S3 Express One Zone 存储类与目录存储桶配合使用的更多信息,请参阅 什么是 S3 Express One Zone?目录存储桶

对象所有权设置

此表显示了每个对象所有权设置对 ACL、对象、Object Ownership 和对象上载的影响。

设置 适用于 对 Object Ownership 的影响 对 ACL 的影响 已接受上载
强制存储桶拥有者(默认) 所有新的和现有对象 存储桶拥有者拥有每个对象。

ACL 已禁用,不再影响存储桶的访问权限。设置或更新 ACL 的请求失败。然而,我们仍然支持读取 ACL 的请求。

存储桶拥有者拥有完全所有权和控制

对象编写者不再拥有完全的所有权和控制权。

使用存储桶拥有者完全控制 ACL 进行上载或未指定 ACL 的上载
首选存储桶拥有者 新对象 如果对象上载包含 bucket-owner-full-control 标准 ACL,存储桶拥有者拥有该对象。

使用其他 ACL 上载的对象归写入账户所有。

ACL 可以更新并可以授予权限。

如果对象上载包含 bucket-owner-full-control 标准 ACL,存储桶拥有者具有完全控制权限,对象编写者不再具有完全控制权限。

所有上载项
对象编写者 新对象 对象编写者拥有该对象。

ACL 可以更新并可以授予权限。

对象编写者具有完全控制权限。

所有上载项

通过禁用 ACL 引起的更改

当应用对象所有权的强制存储桶拥有者设置时,将禁用 ACL,并且您将自动拥有并完全控制存储桶中的每个对象,而无需执行任何其他操作。强制存储桶拥有者是所有新创建的存储桶的默认设置。应用强制存储桶拥有者设置后,您将看到三个变化:

  • 所有存储桶 ACL 和对象 ACL 都被禁用,这将为您提供作为存储桶拥有者的完全访问权限。当您对存储桶或对象执行读取 ACL 请求时,您将看到仅向存储桶拥有者授予完全访问权限。

  • 作为存储桶拥有者,您自动拥有并完全控制存储桶中的每个对象。

  • ACL 不再影响存储桶的访问权限。因此,您的数据访问控制基于策略,如 IAM 策略、S3 存储桶策略、VPC 端点策略和 Organizations SCP。


				显示当您应用强制存储桶拥有者设置禁用 ACL 时会发生什么情况的图表。

如果您使用 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 --key key-name --body path-to-file --acl bucket-owner-full-control

因为以下 PutObject 操作没有指定 ACL,对于禁用 ACL 的存储桶,它也会成功。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key key-name --body path-to-file
注意

如果其他 AWS 账户 在上载后需要对象的访问权限,您必须通过存储桶策略向这些账户授予其他权限。有关更多信息,请参阅 示例演练:管理对 Amazon S3 资源的访问

重新启用 ACL

您可以随时从强制存储桶拥有者设置更改为另一个对象所有权设置来重新启用 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 向账户以外的其他人授予读取或写入权限,则必须将这些权限迁移到存储桶策略,然后才能应用强制存储桶拥有者设置。如果您不迁移在账户之外授予读取或写入访问权限的存储桶 ACL,则应用强制存储桶拥有者设置的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。

例如,如果要为接收服务器访问日志的存储桶禁用 ACL,则必须将 S3 日志交付组的存储桶 ACL 权限迁移到存储桶策略中的日志记录服务主体。有关更多信息,请参阅 为服务器访问日志记录授予对 S3 日志传输组的访问权限

如果您希望对象编写者保持对其上载的对象的完全控制权,则对象编写者是您使用案例的最佳对象所有权设置。如果您想在单个对象级别控制访问权限,那么首选存储桶拥有者是最佳选择。这些用例不常见。

要查看 ACL 并将 ACL 权限迁移到存储桶策略,请参阅 禁用 ACL 的先决条件

识别需要 ACL 进行授权的请求

要识别需要 ACL 进行授权的 Amazon S3 请求,您可以使用 Amazon S3 服务器访问日志或 AWS CloudTrail 中的 aclRequired 值。如果请求需要 ACL 进行授权,或者如果您具有指定 ACL 的 PUT 请求,则字符串为 Yes。如果不需要 ACL,或者您正在设置 bucket-owner-full-control 标准 ACL,或者如果您的存储桶策略允许请求,则 Amazon S3 服务器访问日志中的 aclRequired 值字符串为“-”,但 CloudTrail 中不存在该值字符串。有关预期 aclRequired 值的更多信息,请参阅常见 Amazon S3 请求的 aclRequired 值

如果您的 PutBucketAclPutObjectAcl 请求的标头授予基于 ACL 的权限(bucket-owner-full-control 标准 ACL 除外),则必须先删除这些标头,然后才能禁用 ACL。否则,您的请求将失败。

对于需要 ACL 进行授权的所有其他请求,请将这些 ACL 权限迁移到存储桶策略。然后,在启用强制存储桶拥有者设置之前,删除所有存储桶 ACL。

注意

请勿删除对象 ACL。否则,依赖于对象 ACL 获取权限的应用程序将失去访问权限。

如果您发现没有请求需要 ACL 进行授权,则可以继续禁用 ACL。有关识别请求的更多信息,请参阅使用 Amazon S3 服务器访问日志来确定请求使用 CloudTrail 识别 Amazon S3 请求

查看和更新使用 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 权限

要应用、更新或删除存储桶的对象所有权设置,您需要 s3:PutBucketOwnershipControls 权限。要返回存储桶的对象所有权设置,您需要 s3:GetBucketOwnershipControls 权限。有关更多信息,请参阅 在创建存储桶时设置对象所有权查看 S3 存储桶的对象所有权设置

禁用所有新存储桶的 ACL

默认情况下,所有新存储桶都是在应用强制存储桶拥有者设置的情况下创建的,且 ACL 处于禁用状态。我们建议将 ACL 保持为禁用状态。作为一般规则,我们建议您使用基于 S3 资源的策略(存储桶策略和接入点策略)或 IAM 策略进行访问控制,而不是 ACL。策略是一种简化、更灵活的访问控制选项。借助存储桶策略和接入点策略,您可以定义广泛适用于针对 Amazon S3 资源的所有请求的规则。

复制和 Object Ownership

当您使用 S3 复制,并且源存储桶和目标存储桶由不同的 AWS 账户拥有时,您可以禁用 ACL(对于对象所有权应用强制存储桶拥有者设置),以将副本拥有权更改为拥有目标存储桶的 AWS 账户。此设置模拟现有的所有者覆盖行为,而无需 s3:ObjectOwnerOverrideToBucketOwner 权限。在采用强制存储桶拥有者设置的情况下复制到目标存储桶的所有对象都归目标存储桶拥有者所有。有关复制配置的所有者覆盖选项的更多信息,请参阅 更改副本拥有者

设置对象所有权

您可以使用 Amazon S3 控制台、AWS CLI、AWS SDK、Amazon S3 REST API 或 AWS CloudFormation 应用对象所有权设置。以下 REST API 和 AWS CLI 命令支持 Object Ownership:

REST API AWS CLI 描述
PutBucketOwnershipControls put-bucket-ownership-controls 为现有 S3 存储桶创建或修改对象所有权设置。
CreateBucket create-bucket 使用创建存储桶 x-amz-object-ownership 请求标头以指定对象所有权设置。
GetBucketOwnershipControls get-bucket-ownership-controls 检索 Amazon S3 存储桶的对象所有权设置。
DeleteBucketOwnershipControls delete-bucket-ownership-controls 删除 Amazon S3 存储桶的对象所有权设置。

有关应用和使用 Object Ownership 设置的更多信息,请参阅以下主题。