我在 Amazon S3 上使用 getObject 和 putObject 请求,并在创建存储桶访问策略时发现,如果我不允许 listBucket,则会收到“访问被拒绝”错误。
这样做的问题是 listBucket 意味着用户可以列出存储桶中的键,这呈现 安全威胁。
是否可以允许getObject和putObject而不允许listBucket? 或者有解决方法吗?
政策如下:
{
"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/*"
]
}
]
}
最佳答案
You need the
s3:GetObject
permission for this operation. For more information, go to Specifying Permissions in a Policy in the Amazon Simple Storage Service Developer Guide. If the object you request does not exist, the error Amazon S3 returns depends on whether you also have thes3:ListBucket
permission.
我已通过编辑与您的政策基本相同的政策来确认此行为。
无论我是否拥有 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
的预期响应。否则,它将按预期工作。
关于security - 亚马逊网络服务 : Setting S3 policy to allow putObject and getObject but deny listBucket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624762/