我在Amazon S3上使用getObject和putObject请求,并在创建访问存储桶的策略时发现,如果我不允许listBucket,我会被拒绝访问#39;错误。
这个问题是listBucket意味着用户可以列出存储桶中的密钥并显示 安全威胁。
是否可以在不允许listBucket的情况下允许getObject和putObject? 或者有解决方法吗?
这是政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt##",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::myBucket"
]
},
{
"Sid": "Stmt##",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::myBucket/*"
]
}
]
}
答案 0 :(得分:4)
此操作需要
s3:GetObject
权限。有关更多信息,请转到Amazon Simple Storage Service开发人员指南中的在策略中指定权限。如果您请求的对象不存在,则Amazon S3返回的错误取决于您是否还具有s3:ListBucket
权限。
我通过编辑与您的政策基本相同的政策来确认此行为。
只要我拥有s3:ListBucket
权限,我就可以毫无困难地获取现有对象,无论我是否拥有s3:GetObject
权限。
只有在我没有s3:ListBucket
权限的情况下,行为才会发生变化,并且我要求一个不存在的对象。在这种情况下,S3不会向我承认该对象是否存在 - 我拒绝访问有关对象存在的知识,因为我没有被授权查看该列表。
对不存在的对象的有效请求的响应,没有 s3:ListBucket
:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>xxxx</RequestId>
<HostId>xxxx</HostId>
</Error>
对同一个不存在的对象的有效请求的响应,与 s3:ListBucket
:
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>fakefile.txt</Key>
<RequestId>xxxx</RequestId>
<HostId>xxxx</HostId>
</Error>
因此,对于实际上不存在的对象,&#34;访问被拒绝&#34;是没有s3:ListBucket
的预期回复。否则,它按预期工作。