如何使用boto编程方式检查Amazon S3权限?

9
我们在Amazon S3上有一个带有大量文件的树状结构桶。我刚刚发现,虽然某些文件有两个权限条目(如果单击AWS管理控制台中的文件,然后选择属性 -> 权限,可以看到),一行是“everyone”,另一行是某个特定用户,但其他文件只有一个该用户的条目。因此,我们使用boto或curl下载这些文件到Amazon EC2实例时出现问题。
我需要做的是检查桶中的所有文件。我知道如何获取前缀的完整密钥列表。我可以使用boto提取密钥的权限吗?是否有一种标准方法来测试这些权限是针对所有人还是某个特定人,并且它们是什么?
另外,一旦确定了密钥具有限制性权限,我可以通过向“everyone”添加读取权限来以编程方式更改它们吗?
谢谢。
1个回答

13

这里有一些使用boto的Python代码,可以查看存储桶中所有密钥。如果某个密钥不允许"所有人"读取其内容,则将public-read权限添加到该密钥:

import boto

all_users = 'http://acs.amazonaws.com/groups/global/AllUsers'
conn = boto.connect_s3()
bucket = conn.get_bucket('mybucket')

for key in bucket:
    readable = False
    acl = key.get_acl()
    for grant in acl.acl.grants:
        if grant.permission == 'READ':
            if grant.uri == all_users:
                readable = True
    if not readable:
        key.make_public()

这段代码尚未经过充分测试,所以您应该先尝试一些东西。 此外,请明确,其净结果是使存储桶中的所有对象均可被任何人读取。还要记住,此脚本正在获取存储桶中每个对象的当前 ACL,因此,如果有数百万个对象,那就是数百万个请求,可能需要很长时间,并伴随着一些费用。

另一种方法是调用 make_public() 关于存储桶中每个键而言,无论它的当前 ACL 如何。


1
我的存储桶中有很多对象,所以我想让这个过程变成多线程的。以下是我的代码,如果其他人也觉得有用,可以参考一下:http://www.pixelchef.net/working-amazon-s3-using-boto-multithreaded-edition - northben
你是否有适用于boto3的类似解决方案? - Kshitij Marwah

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