keystone中的domain

深入解析Keystone中domain对象及权限管理
本文详细介绍了Keystone中与domain相关的对象及其作用,包括user、project、group和token。重点阐述了如何通过scope参数获取不同类型的token,并详细解释了如何利用domain实现权限管理。此外,还分析了不同权限规则如admin、cloud_admin等在实际应用中的作用。
部署运行你感兴趣的模型镜像

相关对象

Keystone中当前和domain相关的对象有user,project,group和token,其中user,project和group从sql driver看,这三个模型的name字段都和domain_id一起作为联合唯一键在数据库层面增加了约束。

token比较特殊,获取V3 token的时候有一个可选参数scope,来指定需要获取什么样scope的token,可以参考keystone V3 API

获取token的时候,scope分为三种:

  • domain
  • project
  • trust

其实最终keystone内部处理的时候,也会把trust转化为project。又因为获取token的时候,scope是可选参数,可以不填,所以还可以获取一种特殊的不关联scope的token,这种token的唯一的目的也就是确认一个唯一的用户。

token实际的scope最终转化为两种domain和project。

授权

keystone的授权(create_grant)过程,其实是一个三方关联的过程,三方就是:actor(被授权的主体),role(权限),target(被授权的范围)。实际授权过程可以这样理解:

为actor在target的范围内赋予role的权利。

  • actor -> user & group
  • targe -> project & domain
  • role

再说回来,domain scope token包含的roles,就是这个domain范围内的所有这个user相关的role,其中包括user本身和user所属的group的role的一个并集。而project scope token包含的roles,同上,就是范围变成了project相关的role。

怎么用domain

keystone默认的policy.json,其实是拥有admin角色的用户可以做任何的事情,可以在domainA中创建project,也可以在domainB中创建project,这样就无法做到,限制domain内的admin只可以在所属domain内创建project,也就是domain admin的概念,为了弥补这一问题,keystone引入了policy.v3cloudsample.json

我们来分析一下是怎么做到的,来看其中的一段例子,摘自policy.v3cloudsample.json

1 "admin_required": "role:admin",
2 
3 "identity:create_project": "rule:admin_required and domain_id:%(project.domain_id)s",
4 
5 "identity:get_project": "rule:admin_required and domain_id:%(target.project.domain_id)s",
6 
7 "identity:list_projects": "rule:admin_required and domain_id:%(domain_id)s",

先来看create_project,首先要求admin角色,需要注意的是and的后半句domain_id:%(project.domain_id)s,这条规则的意思就是create_project时,使用的token的domain_id必须等于project所在的domain的domain_id。

也就是如下场景:

  1. 为userA在domainA的范围内赋予admin的权限
  2. userA指定domainA作为scope,申请一个domainA scope的tokenA
  3. userA使用tokenA,去创建project,创建project时domain_id参数必须为domainA的id
  4. 创建project成功

这里有几个关键点需要注意,首先userA在domainA内必须要有admin权限,这样才能满足rule:admin_required,其次,token需要是一个domain scope的token,这样token中才会有domain_id ,再次,创建project的时候,domain_id参数必须等于domainA的id,这样才能满足domain_id:%(project.domain_id)s

这样一条规则的意义在于,可以限制只有在domainA内有权限的用户才能在domainA创建project。

get_project比较好理解,就是查询的project的domain_id必须和token的domain_id相同,也就是只能查询token所在范围内的project。

list_project是查询出所有的project,但是会根据token的domain_id过滤,然后剩下所有和token的domain_id相同的project。

keystone增加了domain这样一个概念之后,其实也就把keystone本身的资源user、project、group按照domain给做了一个划分,可以做到在domain范围内的对于user、project和group的管理。

policy.v3cloudsample.json中又增加了几种的权限规则,例如:cloud_admin、domain_admin、project_domain。大家可以自己结合policy.v3cloudsample.json来看一下它们各自的作用。

 1 "admin_required": "role:admin",
 2 
 3 "cloud_admin": "rule:admin_required and domain_id:admin_domain_id",
 4 
 5 "service_role": "role:service",
 6 
 7 "service_or_admin": "rule:admin_required or rule:service_role",
 8 
 9 "owner" : "user_id:%(user_id)s or user_id:%(target.token.user_id)s",
10 
11 "admin_or_owner": "(rule:admin_required and domain_id:%(target.token.user.domain.id)s) or rule:owner",
12 
13 "admin_or_cloud_admin": "rule:admin_required or rule:cloud_admin",
14 
15 "user_domain_id": "domain_id:%(target.user.domain_id)s or domain_id:%(user.domain_id)s",
16 
17 "project_domain_id": "domain_id:%(target.project.domain_id)s or domain_id:%(project.domain_id)s",
18 
19 "groups_domain_id": "domain_id:%(group.domain_id)s or domain_id:%(target.group.domain_id)s",
20 
21 "same_domain_id": "domain_id:%(domain_id)s or domain_id:%(target.domain.id)s",
22 
23 "match_domain_id": "rule:same_domain_id or rule:user_domain_id or rule:project_domain_id or rule:groups_domain_id",
24 
25 "domain_admin": "rule:admin_required and rule:match_domain_id",
26 
27 "project_admin": "rule:admin_required and project_id:%(target.project.id)s",

具体policy规则的配置可以参考keystone的官方文档

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>嗯,用户想在openEuler系统中安装和配置Keystone,这属于OpenStack的身份认证服务。首先,我需要回忆一下之前在OpenEuler上安装服务的步骤,可能需要先安装依赖包,然后配置数据库、Fernet密钥等。 记得之前的引用提到过Fernet密钥的初始化命令,比如用keystone-manage fernet_setup,可能需要调整用户和组。用户之前的问题可能已经涉及到一些安装步骤,所以需要结合之前的回答,确保一致性。 接下来,安装Keystone通常需要配置Apache和mod_wsgi,修改配置文件,同步数据库,然后启动服务。需要检查配置文件中的数据库连接、令牌提供者是否正确,特别是Fernet的设置。 还要注意权限问题,比如创建keystone用户和组,确保日志目录的权限正确。另外,验证安装是否成功,可能需要创建域、项目、用户和角色,并获取令牌。 用户可能会遇到哪些问题呢?比如依赖包缺失,数据库连接错误,或者服务启动失败。需要在步骤中详细说明每个环节的注意事项,比如检查防火墙设置,SELinux状态,以及日志文件的查看方法。 最后生成相关问题的时候,要考虑用户可能进一步的需求,比如故障排查、与其他服务集成,或者高可用配置,这些都可以作为相关问题提出,帮助用户更深入地了解Keystone的安装和配置。</think>在openEuler系统中安装和配置KeystoneOpenStack身份服务)需按照以下步骤进行: ### 一、环境准备 1. 更新系统软件包: ```bash sudo dnf update -y ``` 2. 安装必要依赖: ```bash sudo dnf install python3-openstackclient httpd mod_wsgi -y ``` ### 二、安装Keystone 1. 通过RPM包安装: ```bash sudo dnf install openstack-keystone python3-keystone -y ``` ### 三、数据库配置 1. 创建MySQL数据库(需提前安装MariaDB): ```sql CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '自定义密码'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '自定义密码'; ``` ### 四、密钥初始化 ```bash sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone # [^1] sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone # [^2] ``` ### 五、配置文件修改 1. 修改`/etc/keystone/keystone.conf`: ```ini [database] connection = mysql+pymysql://keystone:密码@控制器IP/keystone [token] provider = fernet ``` ### 六、数据库同步 ```bash sudo keystone-manage db_sync ``` ### 七、Apache配置 1. 创建wsgi配置文件: ```bash sudo cp /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ ``` ### 八、服务启动 ```bash sudo systemctl enable httpd sudo systemctl restart httpd ``` ### 九、验证安装 1. 创建管理员账户: ```bash openstack domain create --description "Admin Domain" admin openstack project create --domain default --description "Service Project" service ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值