一、Keystone介绍
OpenStack Identity(Keystone)服务为运行OpenStack Compute上的OpenStack云提供了认证和管理用户、帐号和角色信息服务,并为OpenStack Object Storage提供授权服务。
OpenStack的身份服务提供了集成的管理身份验证,授权和服务目录服务的单点,其他的OpenStack服务使用的身份服务作为一个通用统一的API,此外,提供有关用户的信息,但该服务不包括开栈(如LDAP服务)可以被集成到一个预先存在的基础设施,为了从身份服务中受益,其他的OpenStack服务需要与它合作。当一个开栈服务从用户接收请求时,它检查与用户是否被授权作出该请求的标识服务。
1.Keystone的组件
- 服务器:*服务器提供了一种使用RESTful接口验证和授权服务。
- 驱动程序:驱动程序或服务后端被集成到*服务器。它们被用于在库外的OpenStack访问身份信息,并且可以在开栈中部署(例如,SQL数据库或LDAP服务器)的基础设施已经存在。
- 模块:中间件模块中正在使用该标识服务的开栈组件的地址空间中运行。这些模块拦截服务请求,提取用户凭据,并将它们发送到*服务器进行授权。中间件模块和OpenStack的组件之间的集成使用Python的Web服务器网关接口。
当安装OpenStack的身份服务,您必须在您的OpenStack安装注册的每个服务。然后身份服务可以跟踪安装哪些开栈的服务,并且它们的位置在网络上。
OpenStack的身份服务提供了集成的管理身份验证,授权和服务目录服务的单点。 - 用户与认证:用户权限与用户登录密码认证等。。
- 服务目录:提供一个服务目录,记录所有服务对应的IP地址信息。
2.Keystone的管理对象
项目(V3版Project(早期版本Tenant))
可以理解为一个人、或服务所拥有的 资源集合 。在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。比如通过Nova创建虚拟机时要指定到某个Project中,在Cinder创建卷也要指定到某个Project中。User访问Project的资源前,必须要与该Project关联,并且指定User在Project下的Role。
用户(User)
代表一个个体,OpenStack以用户的形式来授权服务给它们。用户拥有证书(credentials),且可能分配给一个或多个租户。经过验证后,会为每个单独的租户提供一个特定的令牌。
证书(credentials)
为了给用户提供一个令牌,需要用证书来唯一标识一个Keystone用户的密码或其它信息
令牌(token)
是一个字符串表示,作为访问资源的令牌。Token包含了在 指定范围和有效时间内 可以被访问的资源。EG. 在Nova中一个tenant可以是一些虚拟机,在Swift和Glance中一个tenant可以是一些镜像存储,在Network中一个tenant可以是一些网络资源。Token一般被User持有。
角色(Role)
用于划分权限。可以通过给User指定Role,使User获得Role对应的操作权限。Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role。系统默认使用管理Role admin和成员Role member 。
Policy
OpenStack对User的验证除了OpenStack的身份验证以外,还需要鉴别User对某个Service是否有访问权限。Policy机制就是用来控制User对Tenant中资源(包括Services)的操作权限。对于Keystone service来说,Policy就是一个JSON文件,默认是/etc/keystone/policy.json。通过配置这个文件,Keystone Service实现了对User基于Role的权限管理。
Authentication
确定用户身份的过程
服务目录(Service Catalog)
Keystone为OpenStack安装提供了一个REST API端点列表并以此作为决策参考。
Service
Openstack service,即Openstack中运行的组件服务。
Endpoint
一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。比如,当Nova需要访问Glance服务去获取image 时,Nova通过访问Keystone拿到Glance的endpoint,然后通过访问该endpoint去获取Glance服务。我们可以通过Endpoint的region属性去定义多个region。Endpoint 该使用对象分为三类:
- admin url –> 给admin用户使用,Post:35357
- internal url –> OpenStack内部服务使用来跟别的服务通信,Port:5000
- public url –> 其它用户可以访问的地址,Post:5000
public url可以被全局访问,private url只能被局域网访问,admin url被从常规的访问中分离。
3.Keystone管理对象之间的关系
二、Keystone V3版的改进
- Tenant 重命名为 Project
- 添加了 Domain 的概念
- 添加了 Group 的概念
问题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、Group、Project、User 和 Role 的关系图
如图所示,在一个 Domain 中包含 3 个 Projects,可以通过 Group1 将 Role Sysadmin直接赋予 Domain,那么 Group1 中的所有用户将会对 Domain 中的所有 Projects 都拥有管理员权限。也可以通过 Group2 将 Role Engineer 只赋予 Project3,这样 Group2 中的 User 就只拥有对 Project3 相应的权限,而不会影响其它 Projects。
三、Authentication认证功能的应用过程
Keystone 和其它 OpenStack service之间的交互和协同工作:
- 首先User向Keystone提供自己的Credentials(凭证:用于确认用户身份的数据,EG. username/password)。
- Keystone会从SQL Database中读取数据对User提供的Credentials进行验证,如验证通过,会向User返回一个Token,该Token限定了可以在有效时间内被访问的 OpenStack API Endpoint和资源 。
- 此后User所有的Request都会使用该Token进行身份验证。
- 如用户向Nova申请虚拟机服务,Nova会将User提供的Token发送给Keystone进行Verify验证,Keystone会根据Token判断User是否拥有执行申请虚拟机操作的权限,若验证通过那么Nova会向其提供相对应的服务。
- 其它Openstack和Keystone的交互也是如此。
从以上过程可以看出,用户的角色管理在 Keystone 中是很重要的工作。在Keystone V3之前,用户的权限管理以每一个用户为单位,需要对每一个用户进行角色分配,并不存在一种对一组用户进行统一管理的方案,这给系统管理员带来了额外的工作和不便。此外,Keystone V3之前的版本中,资源分配是以 Tenant 为单位的,这不太符合现实世界中的层级关系。如一个公司在 Openstack 中拥有两个不同的项目,他需要管理两个Tenant来分别对应这两个项目,并对这两个 Tenant 中的用户分别分配角色。由于在 Tenant 之上并不存在一个更高层的概念,无法对 Tenant 进行统一的管理,所以这给多 Tenant 的用户带来了不便。为了解决这些问题,Keystone V3 提出了新的概念Domain和Group。
keystone的访问流程
以创建一个虚拟机(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.****.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
https://www.cnblogs.com/charles1ee/p/6293387.html