S3:如果由另一个用户创建,用户无法访问自己 S3 存储桶中的对象

25

一个外部用户可以通过我们的S3存储桶访问,使用以下操作在我们的存储桶策略中:

"Action": [
            "s3:GetObjectAcl",
            "s3:GetObject",
            "s3:PutObjectAcl",
            "s3:ListMultipartUploadParts",
            "s3:PutObject"
        ]

那个用户生成了临时凭证,然后用它上传文件到我们的存储桶中。
现在,我无法访问该文件。在s3 UI中,如果我尝试下载该文件,我会得到403错误。如果我尝试更改该对象的权限,我会看到消息:“抱歉!您没有权限查看此存储桶。”如果外部用户在使用临时凭证上传文件时设置了适当的标头(x-amz-acl bucket-owner-full-control),我就可以正常访问该文件。我觉得很奇怪,即使我拥有这个存储桶,外部用户也能够将文件放入其中,而我却无法访问。
是否可能有一些策略我可以设置,以便我可以访问该文件,或者以便我能够访问添加到我的存储桶中的任何文件,而不管如何添加?谢谢!
3个回答

29

我认为您需要联系对象所有者更新ACL或重新编写对象并指定桶所有者完全控制。 最简单的实验方法是使用CLI:

aws s3api put-object-acl --acl bucket-owner-full-control --bucket some-bucket --key path/to/unreadable.txt

是的,我认为您需要为每个对象执行一次操作,我不认为有递归选项。

AWS发布了一个示例存储桶策略,以防止在未授予存储桶所有者完全控制权限的情况下添加对象到存储桶中。但这并不能解决已经存在于您的存储桶中的对象的所有权问题。

我不知道是否有任何政策可以自动将所有权转移给存储桶所有者。


11
你说得对,这是有意为之。如果你允许其他用户向你的存储桶上传文件,并且在存储桶策略中没有强制执行“bucket-owner-full-control”权限,则存储桶所有者唯一可用的操作就是删除该对象。其他所有操作都需要由对象拥有者授予权限。 - Michael - sqlbot
2
作为脚注,要使cpmv命令正常工作,用户还需要具备PutObjectAcl操作的权限,这个知识可以为我节省一小时的时间;) - Paweł Prażak

21

你可以使用复制和递归选项将所有对象复制回存储桶,并使用以下语法设置 ACL 为 bucket-owner-full-control:

实际上,您可以使用复制和递归选项将所有对象复制回存储桶并设置 ACL 为 bucket-owner-full-control,具体操作如下:

aws s3 cp s3://myBucket s3://myBucket --recursive --acl bucket-owner-full-control --storage-class STANDARD

3
使用此命令并使用原始上传账户的凭证,以授权“桶所有者完全控制”权限,但此时执行原始上传的账户仍然拥有 S3 对象的所有权。如需更改,请使用持有该桶所有权的账户的凭证,重复执行此命令,以将 S3 对象的所有权授予该账户。 - davidvandebunte

7

现在,AWS已经解决了这个普遍情况,允许存储桶所有者配置其存储桶以控制放置在其中的所有对象,而无论作者是谁。这是一个好消息,因为您不再需要要求作者在写入期间放置其他标志。

要将您的存储桶更改为此设置(这也是现在推荐的默认设置),您可以使用以下命令:

aws s3api put-bucket-ownership-controls --bucket <bucketname> --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]

另一个好消息是,这会对以前没有ACL限制写入的对象进行追溯性控制。 有关更多信息,请参见:https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html

这应该被标记为正确答案。 命令中还有一个小错字 :P aws s3api put-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET --ownership-controls="Rules=[{ObjectOwnership=BucketOwnerEnforced}]" - Josh
谢谢!实际上,我有点困惑于--ownership-controls标志的正确语法...您的示例与此处找到的匹配 https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-ownership-controls.html - Eric from B'more
哎呀...我按下回车键太早了。我的意思是...你的示例与此处找到的匹配:https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-existing-bucket.html但是关于标志本身的文档并不显示需要等号:https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-ownership-controls.html我进行了一些实验,显然 - 两者都可以接受!(它们都改变了测试存储桶的状态。) - Eric from B'more

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接