简介
通过源码 官方文档 进行学习
官方文档
架构
identity
提供user和group的鉴权及数据
可以用这些数据处理增删改查的请求
这些服务在某些情况也可以托管在授权的服务中,有认证任务时,授权的服务会执行认证的任务,而不会把这些转发到identity再去认证
user
表示一个独立的api消费者,user必须在domain下
group
是user的container,group也必须在domain下
resource
resource服务提供project和domain数据
project
openstack所有resource必须由一个project托管,project在domain下
domain
domain是一个高层次的container,包括了user,group,project,role
domain间的资源可以通过assignment进行访问
assignment
role
user可基于role访问,即权限给role,再把role给user,user访问权限是他有的role里的所有权限
role assignment
由三元组构成:role,resource(project或domain),identity(user或group)
token
当user或group认证后,用token管理
catalog
提供endpoint注册和discover
Policy
实际部署环境中大量行为是否需要被允许,可以基于行为的用户是否被授权
用户被允许时,可以有这几种情况:1用户是admin 2用户在被授权的user列表里
keystone的policy部分逻辑由oslo.policy实现
rule
如enforce时,会检查信息在credential里是否有无,若有则pass 若无则enforce失败
一般来说,给user加一个role,常会加到user的metadata中
capability rbac(还没实现)
即基于action进行的鉴权
Authentication
keystone有多种插件支持,password是一种常用的,进行鉴权时,需要提供鉴权的resource和identity。比如对用户鉴权,需要用户名id,project id,用户密码。如果想通过用户名而不是用户id鉴权,可以添加domain信息(因为user名在domain下唯一存在),而userid在domain之间,整个部署环境中都是独一无二的
基础知识
identity相关概念
authentication
确认用户的identity。对于新的请求,keystone会进行大量useri id的鉴权
当鉴权通过时,初次认证用户需要用户名和密码,认证通过后,keysstone会给一个authenticattion| cde
credentials
确认用户身份的东西,比如username, userid,pwd或token
domain
是一个identity service v3实例。domain可以表示个人,公司,或一块地方等。
endpoint
一个网络可访问的地址,通常是个url。通过endpoint你可以访问一个service,
token
一个alpha字母组成的字符串,token可以在任意时间被废除,token在一定时间范围内有效,token可以使action有权进行其操作
user
user需要先login,然后拿着分配的token去执行操作。user可以被分配给project
用户管理
identity服务可以给user分配一个project和一个role
user在不同的project,可以拥有不同的role
每个服务配置目录下默认有个policy.yaml,可通过这个控制用户是否可进行某些动作
服务管理
包含wsgi后台 apache进程
初始identity
在keystone可以使用之前,需要拥有一些基础数据,比如第一个用户,endpoint等,这个过程叫bootstrapping identity
bootstrap可以通过命令实现keystone-manage bootstrap --bootstrap-password 123 --bootstrap-username test --bootstrap-project-name admin --bootstrap-role-name admin...
管理project user role
project也叫tenant或account,user可以是project的成员
role的分配
openstack role add --user username --project project_name role_name
检验role分配结果:
openstack role assignment list --project project_name --user user_name --names
implied role
创建role也可以继承现有的role出发,类似类的继承,可通过命令实现
openstack implied role create role_name --implied-role implied-role-name
查看implied role
openstack implied role list
创建并管理服务和服务用户
服务catalog
注册到keystone catalog的openstack服务可被keystone discover,服务catalog可通过静态模板文件或动态数据库表进行管理
当你的服务catalog不会随时间而改动很多时可以考虑使用静态模板catalog
动态数据库表的配置
服务用户
每个服务都有一个服务的用户
当不希望通过identity服务鉴权用户,而是其他service自己鉴权时,需要为每个service创建一个service user,user需要有管理员权限。然后为所有service创一个project,为每一个service创个user,给每个user-project对分配一个管理员role,这个管理员role可以让各个服务自己判断发送到各自服务的请求
创建服务用户
创建project openstack project create test_project --domain default
创建user openstack user create user-name -password xxx
给service user分配管理员role openstack role add --project project_name --user user_name
配置服务token
服务之间也存在大量相互的行为,如用户请求创镜像,galnce等镜像创完,请求才到存储服务,如果镜像太大,可能导致请求到存储时,token过期。当glance发出请求,可以带上服务自己的token,叫服务token
当服务收到其他服务的请求时,会校验请求的token是否能匹配到合适的service user。这个可以在各服务配置文件的[keystone_authtoken] section配置
当service token有效时,即使用户的token 过期,该请求也有效
service_token_roles是可以使token生效的role列表,可以设置为service user的role名
service_token_roles_required也设置为true
keystone配置
源码
api通信流程
创建告警
aodh alarm create -> # 命令创建告警
aodhclient -> # client解析+拼接参数
keystoneauth1 -> # 请求发送前调v3/auth/token生成token,放到请求header中X-Auth-Token
aodh-api -> # 将带有X-Auth-Token的创建告警请求发到aodh-api处理请求
keystonemiddleware -> # 校验token
aodh-api # 返回结果