为何我无法访问由其他 AWS 账户上载到我的 Amazon S3 存储桶的对象?

上次更新时间:2022 年 1 月 24 日

来自其他 AWS 账户的 AWS Identity and Access Management(IAM)用户将一个对象上载到我的 Amazon Simple Storage Service(Amazon S3)存储桶。当我尝试访问该对象时,我收到 403 访问被拒绝错误。如何修复此问题?

简短描述

对于具有默认对象所有权设置的现有 Amazon S3 存储桶,对象拥有者是将对象上载到存储桶的 AWS 账户。对于这些现有存储桶,对象拥有者必须明确授予对象权限(通过附加访问控制列表)。否则,存储桶拥有者将无法访问该对象。

借助 S3 对象所有权,存储桶拥有者现在可以管理上载到其存储桶的任何对象的所有权。默认情况下,任何新创建的 S3 存储桶都启用了存储桶拥有者强制设置。启用存储桶拥有者强制设置后,存储桶拥有者将成为存储桶内所有对象的对象拥有者。此外,存储桶及其对象上的任何 ACL 都已禁用。

您还可以通过启用存储桶拥有者强制设置或存储桶拥有者首选设置,设置现有存储桶上的 S3 对象所有权。启用存储桶拥有者首选设置后,ACL 仍处于启用状态。此外,只有上载到具有 bucket-owner-full-control ACL 权限的存储桶的对象才归存储桶拥有者所有。如果您在现有存储桶上启用存储桶拥有者强制设置,则请注意,您也可以随时禁用该设置。(在现有存储桶上禁用存储桶拥有者强制设置,会重新启用之前应用的所有存储桶和对象 ACL。)

最佳实践是,存储桶拥有者在新存储桶和现有存储桶上使用存储桶拥有者强制设置,同时通过 IAM 和存储桶策略管理权限。

重要提示:在禁用现有存储桶上的任何 ACL 之前,请评估其潜在影响。如果对象或存储桶上有多个 ACL,请查看并更新您的存储桶和 IAM 策略以授予所需的权限。

解决方法

要对存储桶禁用 ACL 并获取存储桶中所有对象的所有权,请运行以下命令:

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

如果您无法在存储桶上禁用 ACL,请使用以下选项授予对存储桶中对象的访问权限。

放置或复制操作期间授予访问权限

在放置或复制操作期间,对象拥有者可以指定对象的 ACL 向存储桶拥有者授予完全控制权。

对于放置操作,对象拥有者可以运行以下命令:

aws s3api put-object --bucket destination_DOC-EXAMPLE-BUCKET --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --acl bucket-owner-full-control

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

对于单个对象的复制操作,对象拥有者可以运行以下命令之一:

aws s3api copy-object --bucket destination_DOC-EXAMPLE-BUCKET --key source_DOC-EXAMPLE-BUCKET/myobject --acl bucket-owner-full-control

-或者-

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/myobject s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control

对于多个对象的复制操作,对象拥有者可以运行以下命令:

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/ s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control --recursive

对象添加到存储桶之后授予访问权限

如果另一个账户的存储桶中已存在的对象,则对象拥有者可以通过 put-object-acl 命令授予存储桶拥有者访问权限:

aws s3api put-object-acl --bucket destination_DOC-EXAMPLE-BUCKET --key keyname --acl bucket-owner-full-control

要求对象授予存储桶拥有者完全控制权

您可以使用存储桶策略要求由另一个账户上传到存储桶的所有对象都必须将 ACL 设置为“bucket-owner-full-control”。如需查看示例,请参阅当其他 AWS 账户向我的 S3 存储桶上传对象时,如何要求他们向我授予对象的所有权?