首页 文章

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

提问于
浏览
4

我在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 回答

  • 3

    来自Get Object documentation

    您需要s3:GetObject权限才能执行此操作 . 有关更多信息,请转到Amazon Simple Storage Service开发人员指南中的在策略中指定权限 . 如果您请求的对象不存在,则Amazon S3返回的错误取决于您是否还具有s3:ListBucket权限 .

    我已经通过编辑与您的策略基本相同的策略来确认此行为 .

    I am able to get an existing object without trouble, whether or not I have the s3:ListBucket privilege ,只要我拥有 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>
    

    因此,对于实际不存在的对象,"access denied"是没有 s3:ListBucket 的预期响应 . 否则,它按预期工作 .

相关问题