OpenStack Identity(Keystone)服务为运行OpenStack Compute上的OpenStack云提供了认证和管理用户、账号和角色信息服务,并为OpenStack Object Storage提供受权服务。html
OpenStack的身份服务提供了集成的管理身份验证,受权和服务目录服务的单点,其余的OpenStack服务使用的身份服务做为一个通用统一的API,此外,提供有关用户的信息,但该服务不包括开栈(如LDAP服务)能够被集成到一个预先存在的基础设施,为了从身份服务中受益,其余的OpenStack服务须要与它合做。当一个开栈服务从用户接收请求时,它检查与用户是否被受权做出该请求的标识服务。数据库
能够理解为一我的、或服务所拥有的 资源集合 。在一个Project(Tenant)中能够包含多个User,每个User都会根据权限的划分来使用Project(Tenant)中的资源。好比经过Nova建立虚拟机时要指定到某个Project中,在Cinder建立卷也要指定到某个Project中。User访问Project的资源前,必需要与该Project关联,而且指定User在Project下的Role。json
表明一个个体,OpenStack以用户的形式来受权服务给它们。用户拥有证书(credentials),且可能分配给一个或多个租户。通过验证后,会为每一个单独的租户提供一个特定的令牌。后端
为了给用户提供一个令牌,须要用证书来惟一标识一个Keystone用户的密码或其它信息服务器
是一个字符串表示,做为访问资源的令牌。Token包含了在 指定范围和有效时间内 能够被访问的资源。EG. 在Nova中一个tenant能够是一些虚拟机,在Swift和Glance中一个tenant能够是一些镜像存储,在Network中一个tenant能够是一些网络资源。Token通常被User持有。网络
用于划分权限。能够经过给User指定Role,使User得到Role对应的操做权限。Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role。系统默认使用管理Role admin和成员Role member 。架构
OpenStack对User的验证除了OpenStack的身份验证之外,还须要鉴别User对某个Service是否有访问权限。Policy机制就是用来控制User对Tenant中资源(包括Services)的操做权限。对于Keystone service来讲,Policy就是一个JSON文件,默认是/etc/keystone/policy.json。经过配置这个文件,Keystone Service实现了对User基于Role的权限管理。dom
肯定用户身份的过程url
Keystone为OpenStack安装提供了一个REST API端点列表并以此做为决策参考。操作系统
Openstack service,即Openstack中运行的组件服务。
一个能够经过网络来访问和定位某个Openstack service的地址,一般是一个URL。好比,当Nova须要访问Glance服务去获取image 时,Nova经过访问Keystone拿到Glance的endpoint,而后经过访问该endpoint去获取Glance服务。咱们能够经过Endpoint的region属性去定义多个region。Endpoint 该使用对象分为三类:
public url能够被全局访问,private url只能被局域网访问,admin url被从常规的访问中分离。
问题1:在Keystone V2中,资源分配是以Tenant为单位的,这不太符合现实世界中的层级关系。如一个公司在 Openstack中拥有两个不一样的项目,他须要管理两个Tenant来分别对应这两个项目,并对这两个Tenant中的用户分别分配角色。因为在Tenant之上并不存在一个更高层的概念,没法对 Tenant 进行统一的管理,因此这给多 Tenant 的用户带来了不便。
解决:V3 利用 Domain 的概念实现真正的多租户(multi-tenancy)架构,Domain 担任 Project 的高层容器。云服务的客户是 Domain 的全部者,他们能够在本身的 Domain 中建立多个 Projects、Users、Groups 和 Roles。经过引入 Domain,云服务客户能够对其拥有的多个 Project 进行统一管理,而没必要再向过去那样对每个 Project 进行单独管理。
简而言之,Domain的引入是为了将多个Project进行封装,成为单一实体再交付给相应的一个客户使用。
问题2:在 Keystone V2中,用户的权限管理是以每个用户为单位,须要对每个用户进行角色分配,并不存在一种对一组用户进行统一管理的方案,这给系统管理员带来了额外的工做和不便。
解决:V3引入了Group的概念,Group 是一组 Users 的容器,能够向 Group 中添加用户,并直接给 Group 分配角色,那么在这个 Group 中的全部用户就都拥有了 Group 所拥有的角色权限。经过引入 Group 的概念,Keystone V3 实现了对用户组的管理,达到了同时管理一组用户权限的目的。这与 V2 中直接向 User/Project 指定 Role 不一样,使得对云服务进行管理更加便捷。
类比操做系统中的用户组,是批量便捷操做的体现。
如图所示,在一个 Domain 中包含 3 个 Projects,能够经过 Group1 将 Role Sysadmin直接赋予 Domain,那么 Group1 中的全部用户将会对 Domain 中的全部 Projects 都拥有管理员权限。也能够经过 Group2 将 Role Engineer 只赋予 Project3,这样 Group2 中的 User 就只拥有对 Project3 相应的权限,而不会影响其它 Projects。
Keystone 和其它 OpenStack service之间的交互和协同工做:
从以上过程能够看出,用户的角色管理在 Keystone 中是很重要的工做。在Keystone V3以前,用户的权限管理以每个用户为单位,须要对每个用户进行角色分配,并不存在一种对一组用户进行统一管理的方案,这给系统管理员带来了额外的工做和不便。此外,Keystone V3以前的版本中,资源分配是以 Tenant 为单位的,这不太符合现实世界中的层级关系。如一个公司在 Openstack 中拥有两个不一样的项目,他须要管理两个Tenant来分别对应这两个项目,并对这两个 Tenant 中的用户分别分配角色。因为在 Tenant 之上并不存在一个更高层的概念,没法对 Tenant 进行统一的管理,因此这给多 Tenant 的用户带来了不便。为了解决这些问题,Keystone V3 提出了新的概念Domain和Group。
以建立一个虚拟机(server)为例,结合下图简述下keystone在openstack的访问流程。
1.用户/API 想建立一个实例,首先会将本身的credentials发给keystone。认证成功后,keystone会颁给用户/API一个临时的令牌(Token)和一个访问服务的Endpoint。 PS:Token没有永久的
2.用户/API 把临时Token提交给keystone,keystone并返回一个Tenant(Project)
3.用户/API 向keystone发送带有特定租户的凭证,告诉keystone用户/API在哪一个项目中,keystone收到请求后,会发送一个项目的token到用户/API PS:第一个Token是来验证用户/API是否有权限与keystone通讯,第二个Token是来验证用户/API是否有权限访问我keystone的其它服务。用户/API 拿着token和Endpoint找到可访问服务
4.服务向keystone进行认证,Token是否合法,它容许访问使用该服务(判断用户/API中role权限)?
5.keystone向服务提供额外的信息。用户/API是容许方法服务,这个Token匹配请求,这个Token是用户/API的
6.服务执行用户/API发起的请求,建立实例
7.服务会将状态报告给用户/API。最后返回结果,实例已经建立
参考文章:
https://blog.csdn.net/Jmilk/article/details/51706583
http://www.360doc.com/content/16/0628/20/33848986_571473820.shtml
https://www.ibm.com/developerworks/cn/cloud/library/1506_yuwz_keystonev3/index.html
http://www.javashuo.com/article/p-masjixpj-hb.html