如何实现多用户间的Ceph/S3对象访问权限共享?
问题分析与解决方案
问题根源
你遇到的问题核心是Ceph S3的默认对象ACL规则:用户通过常规方式上传对象且未指定ACL时,对象会被自动设置为私有状态——只有上传者(user-02)拥有完全控制权。尽管你的桶策略允许所有认证用户访问,但S3兼容的权限评估逻辑中,对象级ACL的优先级高于桶策略,因此user-01执行复制操作时会被拒绝。
解决方案(无需实时修改对象ACL)
方案1:配置桶的默认对象ACL
给目标桶设置默认对象ACL,让所有新上传的对象自动继承该权限规则,无需用户手动指定。适合需要保留对象所有者为上传用户,但开放给所有认证用户访问的场景:
- 执行AWS CLI命令设置默认ACL为
authenticated-read(所有认证用户拥有对象读权限,若需支持修改/复制操作,可结合桶策略或使用更宽松的自定义ACL):
aws s3api put-bucket-acl --bucket mybucket --default-object-acl authenticated-read
- 效果:后续所有用户上传的对象,默认ACL会自动包含所有认证用户的读权限,结合你现有的桶策略,user-01即可正常完成对象复制操作。
方案2:启用桶所有者强制控制(Bucket Ownership Controls)
若可以接受所有上传对象的所有者归桶所有者(user-00),此方案更彻底,能让桶策略完全覆盖对象级权限限制:
- 执行以下命令开启
BucketOwnerEnforced模式:
aws s3api put-bucket-ownership-controls --bucket mybucket --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]
- 效果:开启后,任何用户上传的对象都会自动归桶所有者user-00所有,对象自身的ACL会被忽略,直接遵循桶策略的规则。你的现有桶策略已允许所有认证用户完全访问,因此user-01可直接复制对象,无需再关注对象级ACL。
补充说明
- 上述方案均针对新上传对象自动生效,无需实时修改已存在的对象ACL;若需处理历史对象,可批量修改ACL,但你明确无需此操作,因此无需额外处理。
- 注意Ceph版本兼容性:
BucketOwnershipControls需要Ceph Nautilus及以上版本支持,default-object-acl为基础特性,多数Ceph版本均兼容。
内容的提问来源于stack exchange,提问作者David Parks
相关产品推荐
相关产品推荐

