为您的存储桶控制对象所有权和禁用 ACL。
S3 对象所有权是 Amazon S3 存储桶级设置,您可以使用它禁用 access control lists (ACLs)(访问控制列表 ACL),并获取存储桶中每个对象的所有权,从而简化了对存储在 Amazon S3 中的数据的访问管理。预设情况下,当另一个 Amazon Web Services 账户 将对象上载到您的 S3 存储桶,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用 Object Ownership 来更改此原定设置行为。使用 Object Ownership,ACL 将被禁用,而且作为存储桶拥有者,您将自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM policy、S3 存储桶策略、虚拟私有云(VPC)端点策略和 Amazon Organizations 服务控制策略(SCP)。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在需要单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 Amazon Web Services 账户 上载的对象维护存储桶。作为存储桶拥有者,您拥有存储桶中的所有对象,并可以使用策略管理对它们的访问。
对象所有权有三个设置,您可以使用它来控制上载到存储桶的对象的所有权,并禁用或启用 ACL:
已禁用 ACL
-
强制存储桶拥有者(推荐)— ACL 被禁用,存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不再影响 S3 存储桶中对数据的权限。存储桶使用策略来定义访问控制。
已启用 ACL
-
Bucket owner preferred(首选存储桶拥有者)— 存储桶拥有者拥有并完全控制其他账户使用
bucket-owner-full-control
标准 ACL 写入存储桶的新对象。 -
对象写入器(原定设置)— 该 Amazon Web Services 账户 上载对象拥有该对象,对其拥有完全控制权,并且可以通过 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 请求(例如,自定义授予某些 Amazon Web Services 账户)失败并返回 400
,其错误代码为 AccessControlListNotSupported
。
反之,具有存储桶拥有者首选设置的存储桶将继续接受和遵守存储桶和对象 ACL。有了这个设置,用 bucket-owner-full-control
标准的 ACL 编写的新对象将自动归存储桶所有者而不是对象编写器所有。所有其他 ACL 行为都保持不变。为了要求所有 Amazon S3 PUT 操作都包含 bucket-owner-full-control
标准的 ACL,您可以添加一个存储桶策略,该策略只允许使用该 ACL 上载对象。
对象所有权设置
此表显示了每个对象所有权设置对 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,对象上载将失败。有关更多信息,请参阅问题排查。
因为以下示例中使用 Amazon Command Line Interface (Amazon 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
注意
如果其他 Amazon Web Services 账户 在上载后需要对象的访问权限,您必须通过存储桶策略向这些账户授予其他权限。有关更多信息,请参阅示例演练:管理对 Amazon S3 资源的访问。
重新启用 ACL
您可以随时从存储桶拥有者强制执行的设置更改为另一个 Object Ownership 设置来重新启用 ACL。如果在应用存储桶拥有者强制执行的设置之前使用了对象 ACL 进行权限管理,并且您没有将这些对象 ACL 权限迁移到存储桶策略中,则在重新启用 ACL 后,这些权限将恢复。此外,在应用存储桶拥有者强制设置时写入存储桶的对象仍然归存储桶拥有者所有。
例如,如果您从存储桶拥有者强制设置更改为对象写入器,则作为存储桶拥有者,您将不再拥有和完全控制以前由其他 Amazon Web Services 账户 拥有的对象。反之,上载账户将再次拥有这些对象。其他账户拥有的对象使用 ACL 获取权限,因此您不能使用策略向这些对象授予权限。但是,您作为存储桶所有者,在应用存储桶所有者强制设置时,仍然拥有写入存储桶的任何对象。这些对象不归对象写入器所有,即使您重新启用 ACL 也是如此。
禁用 ACL 的先决条件
在为现有存储桶禁用 ACL 之前,请先完成以下先决条件。
查看存储桶和对象 ACL 并迁移 ACL 权限
禁用 ACL 时,存储桶和对象 ACL 授予的权限不再影响访问。在禁用 ACL 之前,请查看存储桶和对象 ACL。如果您的存储桶 ACL 向账户以外的其他人授予读取或写入权限,则必须将这些权限迁移到存储桶策略,然后才能应用存储桶拥有者强制执行的设置。如果您不迁移授予账户之外的读取或写入访问权限的存储桶 ACL,则应用存储桶拥有者强制执行的设置的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。
例如,如果要为接收服务器访问日志的存储桶禁用 ACL,则必须将 S3 日志交付组的存储桶 ACL 权限迁移到存储桶策略中的日志记录服务委托人。有关更多信息,请参阅为服务器访问日志记录授予 S3 日志交付组的访问权。
如果您希望对象编写器保持对他们上载的对象的完全控制权,则对象编写器是您使用案例的最佳 Object Ownership 设置。如果您想在单个对象级别控制访问权限,那么存储桶拥有者首选是最佳选择。这些用例不常见。
要查看 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 副本,且源和目标存储桶由不同的 Amazon Web Services 账户 拥有时,您可以禁用 ACL(存储桶所有者强制设定对象所有权)以将副本拥有权更改为拥有目标存储桶的 Amazon Web Services 账户。此设置模拟现有的所有者覆盖行为,而无需 s3:ObjectOwnerOverrideToBucketOwner
权限。在存储桶拥有者强制设置的情况下已复制到目标存储桶的所有对象都归目标存储桶拥有者所有。有关复制配置的所有者覆盖选项的更多信息,请参阅 更改副本拥有者。
如果您对 Object Ownership(对象拥有权)使用原定设置对象写入器设置,或将桶拥有者首选设置用于目标桶,则可以使用 S3 复制拥有者覆盖选项以将已复制对象的拥有权转移给目标桶拥有者。
设置对象所有权
您可以使用 S3 控制台、Amazon CLI、Amazon SDK、Amazon S3 REST API 或 Amazon CloudFormation 应用 Object Ownership 的设置。以下 REST API 和 Amazon CLI 命令支持 Object Ownership:
REST API | Amazon 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 设置的更多信息,请参阅以下主题。