角色类似于用户,并且具有附加的权限策略,这些权限策略决定了角色可以做什么或不可以做什么。角色可以由任何需要它的身份来承担。如果用户承接了一个角色,用户就会得到一组动态创建的临时凭据。角色可以授权给没有权限访问某些s3资源的用户、应用程序和服务。
我们可以使用radosgw-admin命令进行创建/删除/更新角色以及与角色关联的权限。
下面我们来探究一下角色信息在ceph集群中的保存形式。
角色信息保存的位置:
所有角色信息均保存在xxx.rgw.meta池的roles命名空间下。
保存了哪些信息?
由下图可以看出角色在rados中分三部分存储:角色名称、角色内容和角色路径。我们以user-hac-test-1角色为例:
角色名称:
角色名称对应的raods对象名称格式为:roles_names.${role_name}。
查看角色名称的rados对象的内容,通过下图我们可以看到,角色名字对象中没有保存omap信息。我们将对象数据获取并打印出来,可以看到对象数据中保存了角色ID:
角色内容:
角色内容对应的rados对象名称格式为:roles.${role_id}。
我们再来看一下查看一下角色内容rados对象中保存的信息:
rados中角色对象的保存内容,保存有角色的role_id、所属uid、角色path、arn、创建时间以及相关权限策略等。
h$b65a558f-75a5-438b-818b-dc62f54bfef7user-hac-test-1/logservice/test/2arn:aws:iam:::role/logservice/test/user-hac-test-12022-03-28T12:46:44.214Z{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["arn:aws:iam:::user/hac"]},"Action":["sts:AssumeRole"]}]}test-bucket-hac-read_writes{"Version":"2012-10-17","Statement":{"Effect":"Allow","Action":"s3:*","Resource":"arn:aws:s3:::test-bucket-hac/*"}}test-iam-1-read_writen{"Version":"2012-10-17","Statement":{"Effect":"Allow","Action":"s3:*","Resource":"arn:aws:s3:::test-iam-1/*"}}
角色arn表示该角色在rados中的身份信息,全局唯一不可重复。
权限策略包括承接策略和权限策略。承接策略描述了该角色可以被哪些用户承接。权限策略秒数据该角色具有被授权了那些方法以及资源。
角色路径保存方式:
角色路径对应的rados对象名称格式为:role_paths.${role_path}roles.${role_id}
由下图可以看出,角色路径对象中没有保存任何内容,路径信息是通过对象名称保存的,格式为role_paths.role_path/roles.role_id:
注意事项:
- 角色是全局的,底层没有做用户隔离。所有具有roles权限的用户都可以随意操作(创建、删除、读取角色、获取角色列表、添加策略、删除策略等)角色,因此该权限只能赋予管理员用户。
- 角色是全局的,不可重名,角色名称全局唯一。
- 创建角色时,如果指定了Principal,底层不校验主体的合法性。
- 承接角色的用户不需要roles权限。
- 角色和相应的权限策略被删除后,临时凭证还可以继续使用,知道达到最大会话时长。
- 删除角色时,如果角色中权限策略非空,则不允许删除角色。
- 同一个用户可以同时承接多个角色。
- 添加权限策略时,如果权限策略已存在,则覆盖旧策略。
- 添加角色权限策略时,如果策略中包含资源,底层不校验资源是否存在。
- 使用临时权限不能创建桶。