1. 背景
1.1. 需求
A用户创建了一个桶bucket1 B用户需要能对桶bucket1进行操作 A用户上传的东西B用户可以操作,B用户上传的东西A用户可以操作
1.2. 存在的问题
- ceph rgw 多租户不能实现这个功能,且多租户功能还没补齐
- bucket link 只能替换存储桶的owner
- Policy
- ceph文档太少
- aws文档是否适用于ceph
- ACL 权限控制稍弱
2. 几种已有方式的使用
2.1. 更改用户
更改owner,将一个桶的owner变成 user2,这样原来的owner就不具备对桶所有权限了,他的权限全部转移到user2
# 修改
radosgw-admin bucket link --bucket bucketusage --uid user2 --bucket_id e5162bfb-bb2f-46e0-bc9a-1d067d672f73.202155490.1
# unlink 没啥用,用link即可
radosgw-admin bucket unlink --bucket bucketusage --uid user2 --bucket_id e5162bfb-bb2f-46e0-bc9a-1d067d672f73.202155490.1
2.2. policy授权
授权桶和对象给别的用户,这种方式权限控制最细,下面的例子只实现背景中的需求
2.2.1. example
允许 test用户 s3的所有操作 对桶bucketusage、对象bucketusage/*
bucketusage 的owner是user1
cat examplepol
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam:::user/user2"]},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketusage",
"arn:aws:s3:::bucketusage/*"
]
},
{
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam:::user/user1"]},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketusage",
"arn:aws:s3:::bucketusage/*"
]
}]
}
2.2.2. 设置
# 设置
s3cmd -c .s3cfg-user1 setpolicy examplepol s3://bucketusage
# 删除
s3cmd -c .s3cfg-user1 delpolicy examplepol s3://bucketusage
2.2.3. 设置效果
# 使用user2上传一个对象到user1的桶
s3cmd -c .s3cfg-user2 put xxx s3://bucketusage
# user1可以访问这个对象,user2也可以访问这个对象
[root@ceph01 ~]# s3cmd -c .s3cfg-x x x x x x x x info s3://bucketusage/xxx
s3://bucketusage/xxx (object):
File size: 354
Last mod: Thu, 20 Jan 2022 06:00:33 GMT
MIME type: text/plain
Storage: STANDARD
MD5 sum: 456a2de120feb6d9371e95a54ddb7a35
SSE: none
Policy: {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam:::user/user1"]},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketusage",
"arn:aws:s3:::bucketusage/*"
]
},
{
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam:::user/user2"]},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketusage",
"arn:aws:s3:::bucketusage/*"
]
}]
}
CORS: none
ACL: display user2: FULL_CONTROL
x-amz-meta-s3cmd-attrs: atime:1642658418/ctime:1642647563/gid:0/gname:root/md5:456a2de120feb6d9371e95a54ddb7a35/mode:33188/mtime:1642618683/uid:0/uname:root
2.2.4. 参考示例
ceph源码
- 文档
- doc/radosgw/bucketpolicy.rst
- doc/radosgw/role.rst
- qa/tasks/rgw_multi/tests.py
- 数据结构
- src/rgw/rgw_iam_policy.h
2.3. acl
acl针对对象用的比较多,桶层级作用相对小,例如给某个对象生成一个http url
# 设置ACL,设为public
s3cmd -c .s3cfg-user2 setacl s3://bucketusage/xxx -P
# 设置好之后info里面会多一条 URL
s3cmd -c .s3cfg-xxxxxxxx info s3://bucketusage/xxx
# URL: http://172.16.10.16:8080/bucketusage/xxx
也可以做用户权限控制,录入把aaa桶和对象的所有权限授予bbb用户
如果桶里对象特别的多的话 -r会遍历每一个对象,画的时间很长,用policy更方便
s3cmd setacl --acl-grant=all:bbb s3://aaa -r
数据结构
<AccessControlPolicy>
<Owner>
<ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
<DisplayName>mtd@amazon.com</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
<DisplayName>mtd@amazon.com</DisplayName>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
3. 关于s3文档
ceph的s3相关文档相对较少,使用时有两个路径可以找到比较多的说明材料
- aws s3文档: 文档齐全,但是有些功能ceph没有
- ceph 源码: 包括文档和测试用例、还有数据结构
使用时文档可参考aws s3,但要看下ceph里面有没有相关的例子