【发布时间】:2016-09-18 19:12:03
【问题描述】:
我在 AWS S3 上有一个存储桶(我们称之为 bucket-1),我无法从中读取。我有另一个存储桶(我们称之为 bucket-2),我可以从中读取。
我可以列出两个存储桶的内容,但我无法复制存储桶 1 的任何内容。
% aws s3 ls s3://bucket-1/ | grep 0046
2016-03-09 15:39:50 4413909 0046f326-6e7d-4c16-80e4-491fa0b19dd7
% aws s3 cp s3://bucket-1/0046f326-6e7d-4c16-80e4-491fa0b19dd7 .
A client error (403) occurred when calling the HeadObject operation: Forbidden
在试图弄清楚这一点的过程中,我切换回使用 AWS 账户的访问密钥而不是 IAM 用户(假设 AWS 账户基本上拥有所有权限)。
开始挖掘
假设原因是权限,我运行
% aws s3api get-bucket-acl --bucket my-bucket-1
% aws s3api get-bucket-acl --bucket my-bucket-2
常见
它将我的 AWS 账户显示为两个存储桶的所有者。
不同
bucket-2 拥有一项权限:我的 AWS 账户的 FULL_CONTROL。
bucket-1 列出了几个权限,其中 FULL_CONTROL不是。它列出了
- 阅读
- 写
- READ_ACP
- WRITE_ACP
我的 AWS 账户。
在 Web 控制台中,bucket-1 中的对象没有任何权限集。 bucket-2中的对象与所在的bucket拥有相同的权限。
很可能使用了不同的方法将文件存储在两个存储桶中。 bucket-2 中的对象可能是通过 API 创建的,而 bucket-1 中的对象来自匿名 POST。 (是的,bucket-1 拥有 WRITE for Everyone 的权限。)
深入挖掘
即使使用我的 AWS 账户的凭证,我也无权查询对象的 acl。
% aws s3api get-object-acl --bucket bucket-1 --key 0046f326-6e7d-4c16-80e4-491fa0b19dd7
A client error (AccessDenied) occurred when calling the GetObjectAcl operation: Access Denied
% aws s3api get-object --bucket bucket-1 --key 0046f326-6e7d-4c16-80e4-491fa0b19dd7 local.file
A client error (AccessDenied) occurred when calling the GetObject operation: Access Denied
% aws s3api head-object --bucket bucket-1 --key 0046f326-6e7d-4c16-80e4-491fa0b19dd7
A client error (403) occurred when calling the HeadObject operation: Forbidden
问题
在helpful site on the internet 上,我发现可以使用put-object-acl 将acl 设置为bucket-owner-full-control。我试过了。但是您必须使用文件所有者的凭据来执行此操作 - 如果文件是匿名发布的,您怎么能这样做?
- 我还能尝试什么?
- S3 上的对象(如存储桶)是否有所有者?
- 如果是这样,我可以在 Web 控制台的什么位置找到该信息?
【问题讨论】:
-
检查存储桶策略应该会有所帮助。