如何在特定前缀下限制对S3密钥的访问?(使用Python/boto)

4
我希望您可以将一个 boto 程序的权限限制为仅能够从 S3 存储桶中特定文件夹(前缀)中列出和获取密钥。
我有一个 IAM 角色,其中包含以下访问策略(当然使用真实名称)。这是 IAM 文档中一个允许用户访问“主目录”的示例策略的变体。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:Get*", "s3:List*"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::my-bucket"],
      "Condition":{"StringLike":{"s3:prefix":["my-prefix/*"]}}
    },
    {
       "Action":["s3:Get*", "s3:List*"],
       "Effect":"Allow",
       "Resource": ["arn:aws:s3:::my-bucket/my-prefix/*"]
    }
  ]
}

在boto中,我连接到S3并获取临时凭证。然后我运行这个命令:
bucket = s3_connection.get_bucket('my-bucket')
all_keys = bucket.get_all_keys()
for key in all_keys:
    print key

这个操作失败在get_bucket调用上。到目前为止,我能让它工作的唯一方法是删除s3:Prefix条件(基本上,删除策略中的第一个语句)。但是这样就允许脚本列出整个存储桶中的密钥,而不仅仅是具有特定前缀的密钥。我使用获取密钥的错误方法吗?所有S3访问似乎都始于get_bucket
我可以使用AWS CLI使其工作,如下所示:
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/my-role --role-session-name "role1" --profile other-account-admin-user > temp-creds.txt
# ... copy temp-creds into credentials file using profile name "temp-creds", then ...
# works
aws s3api list-objects --bucket my-bucket --prefix my-prefix/ --profile temp-creds 
# fails, as expected
aws s3api list-objects --bucket my-bucket --profile temp-creds 

这让我想到在boto中有一种方法可以实现这个,只是我还没想出来。(当然,我的测试可能存在缺陷,这种情况经常发生,哈哈。)
1个回答

5

默认情况下,boto中的get_bucket方法尝试通过在桶URL上执行HEAD请求来验证存储桶是否存在。我认为在您的情况下这将失败,因为用户无权访问存储桶的根目录。

所以,我认为像这样的方式适合您:

bucket = s3_connection.get_bucket('my-bucket', validate=False)
for key in bucket.list(prefix='my-prefix'):
    print(key)

哦,哇,那个有效。我实际上已经尝试使用验证标志,但在愚蠢的时刻,我将False作为字符串而不是布尔值传递了。唉。无论如何,谢谢! - mike
对于我的负评,我感到抱歉;那是个意外,直到它被锁定之前我都没有意识到... - Nick Mitchinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接