本文包含以下三个方面的内容。
1. keystone数据模型的术语解释
2. keystone的openstack命令解析
3. keystone的主要工作过程
1. keystone数据模型中的一些术语
在keystone中定义的数学模型,其核心思想是定义了有哪些使用者(user/group)、这些使用者能使用哪些范围内的资源(domain/project)、这些用户可以怎样使用这些资源(role)。
使用者相关术语:user & group
user是拥有账号的独立个体,group表示一组有着共同点的user,这里的共同点是指对某个资源具有相同的权限。
资源相关术语:domain & project
project也是以前版本中的tenant,它包含了一个资源集合,这里的资源包括image、server、network等等(注意每一个资源都属于某个service,例如一个image资源肯定属于glance service,server资源也就是虚拟机属于nova service);
domain是project、user和group的一个大的容器,包含了project集合和使用者集合;domain可以看做一个命名空间,全局唯一。
权限赋予相关术语:role & role assignment
role定义了role或者group可获得的操作权限;当role指派给一个user或group时,必须同时指定这个权限作用于哪个资源;role可以分为project级别和domain级别;role常见值为admin和user,你也可以在各个服务的policy.js中自定义一个新的权限。我会在之后解释rule的部分解读部分/etc/keystone/policy.js的内容;
role assignment 可看做一个三元组<role,resource,identity>,将使用者与特定资源进行映射,并定义了这个映射的权限;举个例子,一个三元组<admin,project1, user1> 表达的意思是user1对project1内资源的操作权限为admin,这个权限赋予中的role是project级别的;换个例子,一个三元组<user, default domain, group1={u1,u2,u3}>所表达的意思是一组用户u1,u2,u3对default domain中的所有资源具备user权限。
使用者-资源-权限之间关系的补充说明
定义一个user或group时,必须指定其所属domain,user和group的命名只需要保证在所属domain内唯一即可;
user或group在进行权限赋予时,是可以赋予其他domain内资源的操作权限;
在定义project时,必须指明其所属domain,否则默认为default domain,一个project的命名在domain内部唯一;
我们在创建资源(image, server, network等)时,必须指明其所属的project与domain;
role的命名必须全局唯一。
数据模型中的其他术语-TOKEN
Token:user在提交请求的同时提交用户名和密码用于认证,身份认证通过后keystone就会返回给用户一个具有有效期的token(一长串字符串),在用户本地缓存这个token,在有效期范围内,用户可以通过token直接实现对授权资源的单点登陆;token有4种:UUID、PKI、PKIZ 和 fernet token;下面简单介绍一下这四种token,目前Mitaka官网安装说明中配置的是fernet token;
UUID token:每个服务API收到带有UUID token的请求时,必须拿着这个token到keystone进行验证token的合法性,验证通过之后才能响应用户请求;随着集群规模的扩大,Keystone 需处理大量验证UUID token 的请求,在高并发下容易出现性能问题;
PKI token:携带更多用户信息并附上了数字签名,服务API收到PKI token时无需再去keystone验