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

Posted

技术标签:

【中文标题】Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket【英文标题】:Amazon Web Services : Setting S3 policy to allow putObject and getObject but deny listBucket 【发布时间】:2015-02-21 20:31:34 【问题描述】:

我在 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/*"
  ]

 ]

【问题讨论】:

【参考方案1】:

来自Get Object documentation:

您需要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>

对相同不存在对象的有效请求的响应,with 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 的预期响应。否则,它会按预期工作。

【讨论】:

确实如此。谢谢

以上是关于Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket的主要内容,如果未能解决你的问题,请参考以下文章

text 如何使用Apache,PHP,MySQL设置Amazon Web Services EC2实例

com.amazonaws.services.s3.model.AmazonS3Exception:禁止(服务:Amazon S3;状态代码:403;错误代码:403 Forbidden;请求 ID:

对于 Amazon Web Services 上极短的流量峰值,正确的 Cloudwatch/Autoscale 设置是啥?

Amazon s3 静态 Web 托管缓存

如何为 IP 地址设置 Amazon S3 策略

导入com.amazonaws.services.s3.AmazonS3ClientBuilder无法解析