Ceph radosgw 的访问权限控制
介绍
ACL(Access Control List),访问控制列表。用于控制用户或组对资源的访问权限,资源指的是桶、对象。任何情况下桶或对象的所有者都对其拥有所有的权限。
可以通过两种方式来操作权限:
- 直接对桶、对象的ACL进行操作
- 在创建桶、对象的时候设置权限
直接操作ACL
角色
角色是用来被赋予资源的权限。有组和用户之分。
- 用户,radosgw中的用户,通过ID和DisplayName来指定。
- 组,一系列的用户,通过一个URL来指定。
有如下:
角色 | 描述 | 示例 |
---|---|---|
认证用户 | radosgw中注册的用户。 | <ID>user</ID><DisplayName>user</DisplayName> |
认证的用户组 | 即所有的radosgw的用户 | <URI>http://acs.amazonaws.com/groups/global/AuthenticatedUsers</URI> |
所有的用户组 | 包括radosgw用户和匿名用户。 | <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> |
权限
对于资源的权限有5种:
权限 | 授权给桶 | 授权给对象 |
---|---|---|
READ | 列出对象、元数据 | 获取对象内容和元数据 |
WRITE | 上传、删除对象 | N/A |
READ_ACP | 获取桶的ACL | 获取对象的ACL |
WRITE_ACP | 创建、修改桶的ACL | 创建、修改对象的ACL |
FULL_CONTROL | 拥有以上所有权限 | 拥有以上所有权限 |
消息体
请求的消息体的格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?xml version=”1.0” encoding=”UTF-8”?>
<AccessControlPolicy xmlns=“http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>{id}</ID>
<DisplayName>{displayname}</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:type=“Canonical User”>
{grantee}
</Grantee>
<Permission>{permission}</Permission>
</Grant>
…
</AccessControlList>
</AccessControlPolicy>
其中<Owner>
指其所有者;<Grant>
对应一个ACL,可以有多个;<Grantee>
对应用户或用户组,<Permission>
对应权限。
<Grantee>
的四种格式:
认证用户
1
2
3
4<Grantee xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:type=“CanonicalUser”>
<ID>{id}</ID>
<DisplayName>{displayname}</DisplayName>
</Grantee>认证的用户组
1
2
3<Grantee xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:type=“Group”>
<URI>http://acs.amazonaws.com/groups/global/AuthenticatedUsers</URI>
</Grantee>所有的用户组
1
2
3<Grantee xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:type=“Group”>
<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
</Grantee>
创建时设置ACL
创建桶、对象的时候可以使用一组标准的ACL,每个标准的ACL都包含也线设定好的控制策略。通过请求头x-amz-acl来指定。
对应描述如下:
标准ACL | 适用资源 | 描述 |
---|---|---|
private | 桶、对象 | 除了所有者拥有所有权限,其他用户都没有权限 |
public-read | 桶、对象 | 除了所有者拥有所有权限,所有的用户组拥有对其的READ权限 |
public-read-write | 桶、对象 | 除了所有者拥有所有权限,所有的用户组拥有对其的READ、WRITE权限 |
authenticated-read | 桶、对象 | 除了所有者拥有所有权限,认证的用户组拥有对其的READ权限 |
bucket-owner-read | 对象 | 除了所有者拥有所有权限,该对象所在桶的所有者拥有READ权限 |
bucket-owner-full-control | 对象 | 除了所有者拥有所有权限,该对象所在桶的所有者拥有所有权限 |
log-delivery-write | 桶 | 日志传输组拥有对其WRITE、READ_ACP权限 |
总结
- 桶、对象的访问控制是平级的,相互没有包含关系。
也就是说若限制了桶的权限,并不代表不能操作桶内的对象;
若放开了桶的权限,并不代表就能操作桶内的对象。 - 系统默认给桶、对象的权限是其所有者拥有所有权限,也就是标准ACL中的private。
- 标准ACL中bucket-owner-read的意义。
当其他用户对你开放了其某个桶的写权限,你在其创建的对象的所有者是你,
你对这个对象拥有所有权限,而桶的所有者对这个对象没有任何权限,这个时候就需要这个标准ACL。
bucket-owner-full-control类似。
参考
AmazonS3 Doc:http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/acl-overview.html