我在Amazon S3上使用getObject和putObject请求,并在创建访问存储桶的策略时发现,如果我不允许listBucket,则会出现“访问被拒绝”错误。
这个问题是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/*"
]
}
]
}
最佳答案
从Get Object documentation:
我已通过编辑与您的政策基本相同的政策来确认此行为。
只要我具有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>
因此,在实际上不存在的对象上,没有
s3:ListBucket
的预期响应是“拒绝访问”。否则,它会按预期工作。