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

1 分钟阅读
0

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

简短描述

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

如果匿名用户已将对象上传到存储桶,并且您想要更改对象的所有权,请修改对象的 ACL。更改对象的 ACL,以授予存储桶拥有者(您的 AWS 账户)对象的完全控制权。

**注意:**您还可以使用 Amazon S3 对象所有权来控制另一个 AWS 账户上传的对象的所有权。

解决方法

请按照以下步骤将对象的所有权更改为拥有存储桶的 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": [
        {
            "Grantee": {
                "DisplayName": "jane",
                "ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }]}

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。如果您删除了某个对象版本,您将无法检索到它。


相关信息

如何确保我拥有新对象的所有权?

Amazon S3 的安全最佳实践

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

AWS 官方
AWS 官方已更新 3 年前