[云计算]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中的应用

  1. USER向Keystone组件申请Token。
  2. USER创建虚拟机(找nova-api创建),Head中携带Token。
  3. nova-api检验Token是否有效(找Keystone校验)。
  4. Token通过接口透传,进入到nova-compute(?horizen中携带token的vnc界面)。
  5. nova-compute进行网口相关操作(找neutron-server),Head中携带Token。
  6. 校验Token是否有效(找Keystone)。

创建Token

img

Token交互

img

  1. 用户从Keystone申请token
  2. 用户使用token访问服务
  3. 被访问组件验证token
  4. 用户得到返回消息

Token的生成和验证

  • UUID Token:每次验证需要访问Keyston服务端。

  • PKI Token:Token验证在客户端即可完成。

Token的验证流程

img

RBAC:基于角色的访问控制

RBAC原理

img

  • /etc/keystone/policy.json

img

Policy模块在检测时需要三方面的数据:

  1. policy.json策略配置文件;
  2. auth_token添加到http头部的token数据;
  3. 用户的请求数据。

Keystone通过检测上述三方面的数据,来判断权限是否满足操作的要求。

img

  • Token认证只认证token的有效性,权限控制是在各个组件代码内部做的。
  • Keystone提供统一的Policy模块供其他组件进行访问控制检测。
  • Policy模块在检测时需要三方面的数据:
  1. policy.json策略配置文件;
  2. auth_token添加到http头部的token数据;
  3. 用户的请求数。
  • 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 - 前后区别

img

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

posted @ 2021-04-25 19:49  SkyBiuBiu  阅读(650)  评论(1编辑  收藏  举报