如何用Boto设置Ceph RadosGW存储桶默认对象public-read权限?
解决Ceph RadosGW上传对象默认Public-Read的问题
我明白你的痛点——非开发团队成员没法手动给每个上传的对象加权限,但又需要所有上传的内容自动公开可读。之前你设置的桶public-read policy其实只是控制了桶的访问权限(比如允许别人列出桶里的内容),但对象的权限是独立的,不会自动继承桶的设置。下面给你两个靠谱的解决方案,都能实现你要的效果:
方案一:设置桶的默认Canned ACL(推荐)
这个方案会让所有新上传到桶里的对象自动继承public-read权限,完全不需要上传者做额外操作,最适合你的场景。
操作步骤:
- 如果你已经创建了目标桶,先通过Boto获取桶对象;如果是新建桶,可以在创建后直接设置:
#!/usr/bin/env python import boto import boto.s3.connection access_key = "SAMPLE3N84XBEHSAMPLE" secret_key = "SAMPLEc4F3kfvVqHjMAnsALY8BCQFwTkI3SAMPLE" conn = boto.connect_s3( aws_access_key_id = access_key, aws_secret_access_key = secret_key, host = '10.1.1.10', is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) # 方式1:新建桶后设置默认ACL bucket = conn.create_bucket('public-bucket') bucket.set_acl('public-read', default=True) # 方式2:修改已存在的桶的默认ACL # bucket = conn.get_bucket('public-bucket') # bucket.set_acl('public-read', default=True)
- 验证效果:
上传任意文件到桶里后,用以下代码检查对象的ACL:
key = bucket.get_key('your-uploaded-file.tgz') print(key.get_acl())
你应该能看到http://acs.amazonaws.com/groups/global/AllUsers = READ的权限,说明对象已经自动变成公开可读了。
方案二:用桶Policy强制所有对象公开可读
如果你不想修改对象的ACL,也可以通过桶Policy直接授权所有用户读取桶内的所有对象。这种方式下,对象本身的ACL还是私有,但桶的Policy会覆盖这个限制,允许公开访问。
操作步骤:
用Boto设置桶Policy:
import json # 获取桶对象 bucket = conn.get_bucket('public-bucket') # 定义桶Policy bucket_policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": f"arn:aws:s3:::{bucket.name}/*" }, { "Effect": "Allow", "Principal": "*", "Action": "s3:ListBucket", "Resource": f"arn:aws:s3:::{bucket.name}" } ] } # 应用Policy bucket.set_policy(json.dumps(bucket_policy))
设置完成后,所有上传到这个桶的对象都会自动被允许公开访问,即使上传者没设置任何权限。
两种方案的区别
- 默认ACL方案:对象本身的ACL会被设置为
public-read,在对象的权限列表里能直接看到所有用户的读取权限,更直观。 - 桶Policy方案:对象的ACL保持私有,但桶Policy授权了所有用户的读取权限,适合需要保留对象私有属性但又要公开访问的场景。
对于你的需求(非开发人员上传后自动公开),方案一的默认ACL是最直接且符合预期的选择。
内容的提问来源于stack exchange,提问作者Josh Worley




