1.OpenStack组件
OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack是一个不断发展的系统,在它的发展历程之中,它的组件个数在增加,服务质量在提升。下图为OpenStack的核心组件:
OpenStack核心组件的作用:
Nova:管理VM的生命周期,是OpenStack的最核心服务。
Neutron:提供网络连接服务。
Glance:管理VM的启动镜像。
Cinder:为VM提供块存储服务。
Swift:提供对象存储服务。
Keystone:为OpenStack提供认证与权限管理服务。
Horizon:为OpenStack用户提供一个Web自服务Portal。
2.Keystone功能
Keystone是 OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。
在图2中,我们可以看到OpenStack中的每一个组件的运作都离不开Keystone的身份认证与权限管理。用户每一次向系统发送请求的时候,在发送信息中,都会加上token。而每一个组件,在提供相应的服务之前,都会把token发给keystone确认,只要在keystone确认了token的真实性之后,才会给用户提供相应的服务。所以说其请求都需要经过Keystone的认证,才能得到相应的权限。
3.keystone管理的相关概念
Keystone 中主要涉及到如下几个概念:User、Project、Role、Token、Domain、Group。下面对这几个概念进行简要说明。
3.1User:用户
顾名思义就是使用服务的用户,可以是人、服务或者是系统,只要是使用了 Openstack 服务的对象都可以称为用户。一个项目可以有多个用户,一个用户也可以属于一个或多个项目。
用户对项目的操作权限由用户在项目中承担的角色来决定。
3.2Project:项目
它是各个服务中的一些可以访问的资源集合或者说叫资源组。它是一个容器,用于组织和隔离资源,或标识对象。
3.3Token:令牌
Token即是信物、令牌,用户通过用户名和密码获取在某个项目下的token,通过token,可以实现单点登录。
令牌是用来访问资源的任意比特的文本。每个令牌有一个访问范围。令牌可在任意时间收回,并在一个有限的时间内有效。在长时间没有进行操作的时候,我们常需要重新登陆获取新的token才能进行访问。
3.4Role:角色
Role的本质就是一堆ACL的集合,用于划分权限。
它代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像可执行特定系列操作的用户特性。角色包括一系列权利和特权。用户可继承其所属角色的权利和特权。在身份服务中,颁发给用户的令牌包括用户能承担的角色列表。这个用户调用的服务决定他们怎样解释这个用户所属的角色,以及每个角色授予访问的操作和资源。
角色可以被指定给用户,使得该用户获得角色对应的操作权限。
role 的名称没有意义,其意义在于 policy.json 文件根据 role 的名称所指定的允许进行的操作。系统默认使用管理Role admin和成员Role user(过去的普通用户角色是:_member_)。所以最简单地情况就是,role只有 admin 和user(member)两个,前者表示管理员,后者表示普通用户。
3.5Domain:域
V3 利用 Domain 实现真正的多租户(multi-tenancy)架构,Domain 担任 Project 的高层容器。云服务的客户是 Domain 的所有者,他们可以在自己的 Domain 中创建多个 Projects、Users、Groups 和 Roles。通过引入 Domain,云服务客户可以对其拥有的多个 Project 进行统一管理,而不必再向过去那样对每一个 Project 进行单独管理。
3.6 Group:组
Group 是一组 Users 的容器,可以向 Group 中添加用户,并直接给 Group 分配角色,那么在这个 Group 中的所有用户就都拥有了 Group 所拥有的角色权限。通过引入 Group 的概念,Keystone V3 实现了对用户组的管理,达到了同时管理一组用户权限的目的。这与 V2 中直接向 User/Project 指定 Role 不同,使得对云服务进行管理更加便捷。
Group与Domain是在keystoneV3版本才引进的新概念。
4.身份管理层次
如图中所示,在一个 Domain 中包含 3 个 Projects,可以通过 Group1 将 Role Sysadmin直接赋予 Domain,那么 Group1 中的所有用户将会对 Domain 中的所有 Projects 都拥有管理员权限。也可以通过 Group2 将 Role Engineer 只赋予 Project3,这样 Group2 中的 User 就只拥有对 Project3 相应的权限,而不会影响其它 Projects。
4.1 domain、project、group、user层次
4.1.1 user与group
User用户和group组是包含关系,但是却不是一定的上下级,用户可以是组中成员,也可以是单独的一个用户,就如上图中的user2、user3、user4,他是系统中的用户,但是它不属于任何一个组。他可以直接属于某一个项目,对于项目存在管理权。User只有在直接或者间接的与某一个项目存在对应关系,才能登陆Openstack系统。
4.1.2 group与project
Group组与project之间,我们可以选择赋予group组对应project的权限,就如上图中,我们赋予group1对project1、project2这俩个项目的管理权限,在此同时,我们也可以把project1和project2的管理权限赋予group2,这样的话,group1和group2两组同时都拥有了project1和project2的管理权。从这个管理权限的赋予关系上,我们可以看到,group组与project项目之间的是一个多对多的关系。
4.1.3 project与domain
Project与domain之间也是包含关系,Domain 担任 Project 的高层容器。云服务的客户是 Domain 的所有者,他们可以在自己的 Domain 中创建多个 Projects、Users、Groups 和 Roles。通过引入 Domain,云服务客户可以对其拥有的多个 Project 进行统一管理,而不必再向过去那样对每一个 Project 进行单独管理。
4.2 role、project、user层次
每一个user都会对某一些project存在管理权,如果没有管理权的话,user将会无法正常登陆Openstack系统。同时,每一个用户都会有一个对应的角色,这个角色就是ACL的集合。在系统默认中,存在俩个角色,admin-管理员与user(member)普通用户。
5.keystone 的访问流程
下面通过本文上面的图2来说明 Keystone 和其它 OpenStack 服务之间是如何交互和协同工作的。首先用户向 Keystone 提供自己的身份验证信息,如用户名和密码。Keystone 会从数据库中读取数据对其验证,如验证通过,会向用户返回一个 token,此后用户所有的请求都会使用该 token 进行身份验证。如用户向 Nova 申请虚拟机服务,nova 会将用户提供的 token 发给 Keystone 进行验证,Keystone 会根据 token 判断用户是否拥有进行此项操作的权限,若验证通过那么 nova 会向其提供相对应的服务。其它组件和 Keystone 的交互也是如此。