Amazon Web Services:设置S3策略以允许putObject和getObject但拒绝listBucket

Zig*_*rth 5 security amazon-s3 amazon-web-services

我在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/*"
  ]
}
 ]
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*bot 6

获取对象文档

您需要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>
Run Code Online (Sandbox Code Playgroud)

对同一不存在对象的有效请求的响应,其中 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>
Run Code Online (Sandbox Code Playgroud)

因此,对于实际不存在的对象,“访问被拒绝”是没有s3:ListBucket. 否则,它将按预期工作。