我在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的预期响应是“拒绝访问”。否则,它会按预期工作。

10-07 20:11