使用 boto 库,我可以避免在 S3 中的基本存储桶上授予列表权限吗?

2024-03-12

我目前有一个 IAM 角色,其政策如下:

{
  "Version":"2008-10-17",
  "Statement": [
  {
    "Effect":"Allow",
    "Action":["s3:ListBucket"],
    "Resource":[
      "arn:aws:s3:::blah.example.com"
    ]
  },
  {
    "Effect":"Allow",
    "Action":["s3:GetObject", "s3:GetObjectAcl", "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject"],
    "Resource":[
      "arn:aws:s3:::blah.example.com/prefix/"
    ]
  }
  ]
}

Boto 似乎需要存储桶根上存在 ListBucket 权限才能执行 get_bucket 调用。如果我删除 Statement 数组中的第一个哈希, get_bucket('blah.example.com') 将失败。这是错误文本:



*** S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>xxxx</RequestId><HostId>yyyy</HostId></Error>
  

有什么方法可以在仍然使用 boto 的同时将存储桶的列表限制为某个前缀(例如“prefix/”)?

UPDATE

为了让一切正常工作,我使用了以下策略:

{
  "Version":"2008-10-17",
  "Statement": [
  {
    "Effect":"Allow",
    "Action":["s3:ListBucket"],
    "Resource":[
      "arn:aws:s3:::blah.example.com"
    ],
    "Condition":{
      "StringLike":{
         "s3:prefix":"prefix/*"
      }
    }
  },
  {
    "Effect":"Allow",
    "Action":["s3:GetObject", "s3:GetObjectAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject"],
    "Resource":[
      "arn:aws:s3:::blah.example.com/prefix/*"
    ]
  }
  ]
}

你仍然需要使用validate=False参数到get_bucket方法,但它允许在前缀内列出。


默认情况下,boto 尝试通过对存储桶执行 LIST 操作来验证存储桶是否存在,并要求零结果。如果您希望它跳过此验证步骤,只需这样调用即可:

>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('mybucket', validate=False)

这应该跳过 LIST 操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 boto 库,我可以避免在 S3 中的基本存储桶上授予列表权限吗? 的相关文章

随机推荐