[云计算]OpenStack - Keystone
Keystone在OpenStack中的位置
keystone作为openstack的Identity Service,提供了用户信息管理和完成各个模块认证服务。
用户确认身份->角色->请求->指引(服务的链接)->服务
认证鉴权、服务目录
Keystone对象模型
- Domain:域,keystone中资源(project、user、group)的持有者
- Project:租户,其他组件中资源(计算|存储|网络资源)的持有者
- 华为的区别:
- 6.3以前,domain=组织,project=vdc、租户;
- 6.3以后,domain=区域,project=vdc,最多可以有五级的VDC
- 华为的区别:
- User:用户,云系统的使用者
- Group:用户组,可以把多个用户作为一个整体进行角色管理
- Role:角色,基于角色进行访问的控制
- Trust:委托,把自己拥有的角色临时授权给别人
- Service:服务,一组相关功能的集合,比如计算|网络|镜像|存储服务等
- Endpoint:必须和一个服务关联,代表这个服务器的访问地址,一般一个服务需要提供三种类型的访问地址:public、internal、admin
- Region:区域,在 Keystone里基本代表一个数据中心
- Policy:访问控制策略,定义接口访问控制规则
- Assignment:一个(actor,target,role)三元组叫一个assignment,其中actor包括user、group;target包括domain、project。每个assignment代表一次赋权操作
- Token:令牌,用户访问服务的凭证,代表着用户的账户信息,一般需要包含user信息、scope信息(project、domain或者trust)、role信息。分别为PKI、UUID、PKIZ、Fernet几种类型。
Keystone对象模型 - user|project|domain|role|assignment
Keystone对象模型 - Assignment
- user, group, project, domain, role绑定关系
Keystone对象模型 - Region|service|endpoint
Keystone对象模型 - Region|service|endpoint关系
Token的概念
- Token是什么?
- 用户向Keystone提供一组有效的用户信息,Keystone向用户返回一个token。
- token包含这个用户的信息,用户的角色信息(role),token的作用域(scope),token的有效期(expiration)。
- 使用这个token可以访问其他的openstack服务。
- 为什么使用Token?
- 使用token访问api服务比用户名+密码访问更方便。
- Token具有有效期,在客户端缓存token比缓存用户名密码更安全。
Token在Openstack中的应用
- USER向Keystone组件申请Token。
- USER创建虚拟机(找nova-api创建),Head中携带Token。
- nova-api检验Token是否有效(找Keystone校验)。
- Token通过接口透传,进入到nova-compute(?horizen中携带token的vnc界面)。
- nova-compute进行网口相关操作(找neutron-server),Head中携带Token。
- 校验Token是否有效(找Keystone)。
创建Token
Token交互
- 用户从Keystone申请token
- 用户使用token访问服务
- 被访问组件验证token
- 用户得到返回消息
Token的生成和验证
-
UUID Token:每次验证需要访问Keyston服务端。
-
PKI Token:Token验证在客户端即可完成。
Token的验证流程
RBAC:基于角色的访问控制
RBAC原理
- /etc/keystone/policy.json
Policy模块在检测时需要三方面的数据:
- policy.json策略配置文件;
- auth_token添加到http头部的token数据;
- 用户的请求数据。
Keystone通过检测上述三方面的数据,来判断权限是否满足操作的要求。
- Token认证只认证token的有效性,权限控制是在各个组件代码内部做的。
- Keystone提供统一的Policy模块供其他组件进行访问控制检测。
- Policy模块在检测时需要三方面的数据:
- policy.json策略配置文件;
- auth_token添加到http头部的token数据;
- 用户的请求数。
- policy.json的修改实时生效,不需要重启服务。
policy.json
-
格式:
: 或者
-
两种写法:
- "identity:get_user":"role:admin or user_id:%(user_id)s"
- "identity:get_user":"role:admin and user_id:%(user_id)s"
- "identity:get_user":"role:admin not user_id:%(user_id)s"
或者(逗号隔开的为或,一括号内为与):
-
"identity:get_user":[["role:admin"],["user_id":"%(user_id)s"]]
-
"identity:get_user":[["role:admin","user_id:%(user_id)s"]]
-
Match statement规则:
: or - "user_id:$user_id"
- token中用户id为$user_id。
- "user_id":%(user_id)s"
- token中用户id与url中的user_id匹配 如: GET /v3/users/$user_id。
- "domain_id:%(user.domain_id)s"
- token的domain与请求body体中用户domain_id匹配,创建某个domain下的用户必须使用该domain的管理员。
- “user_id:%(target.credential.user_id)s”
- token的用户与要操作的数据库中对象的user_id匹配,用户只能查询属于自己的credential。
Keystone对接AD
Keystone对接AD - 前后区别
Keystone对接AD - 配置
配置项 | 说明 |
---|---|
ldap_domain | 对接LDAP的domain名称 |
ldap_url | LDAP服务器url |
ldap_user | 连接LDAP服务器所使用的用户 |
ldap_password | 连接LDAP服务器所使用的密码 |
ldap_suffix | LDAP域名 |
ldap_user_tree_dn | LDAP上用户所在的路径 |
ldap_group_tree_dn | LDAP上用户组所在的路径 |
ldap_dumb_member | 创建LDAP用户组时的默认成员用户 |
ldap_user_objectclass | 用户对应的LDAP对象类,keystone只会认为包含该属性的对象为用户 |
ldap_user_id_attribute | 映射到keystone用户id的LDAP用户属性 |
ldap_user_name_attribute | 映射到keystone用户名的LDAP用户属性 |
ldap_user_pass_attribute | 映射到keystone用户密码的LDAP用户属性 |
配置项 | 说明 |
---|---|
ldap_user_mail_attribute | 映射到keystone用户邮箱的LDAP用户属性 |
ldap_user_enabled_attribute | 映射到keystone用户enable的LDAP用户属性 |
ldap_user_enabled_mask | 当ldap_user_enabled_attribute 配置为userAccountControl时需要指定,两者共同确定用户是否启用 |
ldap_user_enabled_default | 默认的用户是否可用的值,默认为512 |
ldap_user_allow_create | 是否允许keystone在LDAP上创建用户 |
ldap_user_allow_update | 是否允许keystone在LDAP上更新用户 |
ldap_user_allow_delete | 是否允许keystone删除LDAP上的用户 |
配置项 | 说明 |
---|---|
ldap_group_objectclass | 用户组对应的LDAP对象类 |
ldap_group_id_attribute | 映射到keystone用户组id的LDAP用户组属性 |
ldap_group_name_attribute | 映射到keystone用户组名的LDAP用户组属性 |
ldap_group_member_attribute | 映射到keystone用户组成员的LDAP用户组属性 |
ldap_group_desc_attribute | 映射到keystone用户组描述的LDAP用户组属性 |
ldap_group_allow_create | 是否允许keystone在LDAP上创建用户组 |
ldap_group_allow_update | 是否允许keystone在LDAP上更新用户组 |
ldap_group_allow_delete | 是否允许keystone在LDAP上删除用户组 |
ldap_use_dumb_member | 在LDAP上创建用户组时是否需要加默认成员,当这个配置项为true时,需要配置ldap_dumb_member |
配置需要通过CPS配置命令来完成:
cps template-params-update --parameter ldap_domain=*** ldap_url=*** …… --service keystone keystone
LDAP:轻量目录访问协议,英文全称是Lightweight Directory Access Protocol