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