layout: post
title: 对象存储S3权限控制
catalog: true
tag: [Ceph, S3]
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授权
授权桶和对象给别的用户,这种方式权限控制最细,一般是deny all,然后根据需求access,下面的例子只实现背景中的需求
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-xxxxxx 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.10:8080/bucketusage/xxx
3. 关于s3文档
ceph的s3相关文档相对较少,使用时有两个路径可以找到比较多的说明材料
- aws s3文档: 文档齐全,但是有些功能ceph没有
- ceph 源码: 包括文档和测试用例、还有数据结构
使用时文档可参考aws s3,但要看下ceph里面有没有相关的例子