如何在 Amazon S3 存储桶中更改公开(匿名)拥有的对象的所有权?

上次更新时间:2020 年 12 月 23 日

我的 Amazon Simple Storage Service (Amazon S3) 存储桶拥有具公有(匿名)所有权的对象。如何更改对象的所有权,以便我的 AWS 账户拥有此对象?

简短描述

默认情况下,S3 对象归上传此对象的身份所有。这意味着,如果您允许对存储桶的公有写入访问权限,则公开拥有公有(匿名)用户上传的对象。要防止安全问题,最佳实践是阻止对存储桶的公有访问权限。

如果匿名用户已将某个对象上传到存储桶,且您希望 AWS 账户拥有此对象,您必须修改对象的访问控制列表 (ACL)。更改对象的 ACL,以授予存储桶拥有者(您的账户)对象的完全控制权。

解决方法

请按照以下步骤将对象的所有权更改为拥有存储桶的 AWS 账户:

1.要添加对象 ACL,请使用 AWS 命令行界面 (AWS CLI) 运行 put-object-acl 命令。包括 --acl 选项与值 bucket-owner-full-control,以添加 ACL 来授予对象的存储桶拥有者控制权。然后,包括 --no-sign-request 选项以对请求使用匿名凭证。完整 put-object-acl 命令和您所需的选项类似于以下内容:

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject  --acl bucket-owner-full-control   --no-sign-request

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。

2.要应用所有权更改,您必须将对象复制在同一位置上。为此,您可以运行 cp 命令,类似于以下内容:

aws s3 cp s3://DOC-EXAMPLE-BUCKET/awsexampleobject  s3://DOC-EXAMPLE-BUCKET/awsexampleobject --storage-class STANDARD

注意:确保将示例命令中的 --storage-class 值更改为适用于您的使用案例的存储类别。此外,请确保包含对象所需的其他 cp 命令选项。

3.要检查所有权更改,请运行 get-object-acl 命令,类似于以下内容:

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject

该命令会返回输出,其中显示对象的所有者,类似于以下内容:

{
    "Owner": {
        "DisplayName": "jane",
        "ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099"
    },
    "Grants": }

4.如果在存储桶上启用了版本控制,则还必须删除在步骤 2 中通过 cp 命令所生成对象的先前版本。先前对象版本具有公共(匿名)所有权。要删除此对象版本,请首先在存储桶上运行 list-object-versions 命令。包括命令的 --prefix 选项,以将结果过滤到拥有公共所有权的对象:

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix example.txt

从命令输出中,复制拥有公共所有权的对象版本的版本 ID。然后,对要删除的版本 ID 运行 delete-object 命令:

aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'

警告:请仔细检查版本 ID,确保选对拥有公共所有权的对象版本的版本 ID。如果您删除了某个对象版本,您将无法检索到它。