OpenStack:KeyStone原理介绍

来自CloudWiki
跳转至: 导航搜索

KeyStone 在OpenStack中的位置

每项多用户服务都需要一些机制来管理哪些人可以访问应用程序,以及每个人可以执行哪些操作。私有云也不例外,在 OpenStack 中,将这些功能简化为一个单独的称为 Keystone 的项目。通过KeyStone,为OpenStack中的其他服务提供身份验证。

Openstack5-1.png

Keystone是Openstack框架中的一个重要组成部分,负责身份认证、服务管理、服务规则和服务令牌的功能, 它实现了Openstack的Identity API。Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过Keystone来注册其服务,任何服务之间相互 的调用,都需要经过Keystone的身份验证来获得目标服务。[1]

Keystone包含两个主要部件:验证部件与服务目录部件。

验证部件主要用于用户身份验证,服务目录部件主要用于服务注册。

下面一一介绍。

KeyStone的验证组件

验证部件提供了一套基于令牌的验证服务,主要包含以下几个概念:[2]

租户Tenant(Project)

  • Tenant:,它是各个服务中的一些可以访问的资源集合。租户是资源的集合,资源的容器,资源的拥有者,包括计算机资源、存储资源、网络资源、镜像资源等等;例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜像存储,在Neutrons中一个tenant可以是一些网络资源。在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源。

用户User

  • User:顾名思义就是使用服务的用户,可以是人、服务或者是系统,只要是使用了 Openstack 服务的对象都可以称为用户。

角色Role

  • Role:角色,用于分配操作的权限。角色可以被指定给用户,使得该用户获得角色对应的操作权限。

组Group

Group 是一个 domain 部分 user 的集合,其目的是为了方便分配 role。给一个 group 分配 role,结果会给 group 内的所有 users 分配这个 role。

域Domain

Domain 可以认为是 project,user,group 的 命名空间 namespace。 一个 domain 内,这些元素的名称不可以重复,但是在两个不同的domain内,它们的名称可以重复。因此,在确定这些元素时,需要同时使用它们的名称和它们的 domain 的 id 或者 name。

Keystone API 的版本3 中支持域。如果没有创建域,所有项目和用户都使用default 域

参考文档:http://dy.163.com/v2/article/detail/D2ISUN3L0511Q0OL.html

KeyStone的验证过程

令牌Token

  • Token:令牌,(实际就是一串比特值或者字符串)申请一项资源时,需要提供令牌并验证通过才能访问。令牌是进行资源访问的通行证。令牌 中含有可访问资源的范围和有效时间。

证书Credentials

  • Credentials:证书,在给用户提供一个令牌之前,需要用一个字符串(比特值)来唯一标识用户的密码或其它信息,这个字符串(比特值)就是证书。

Openstack5-2.png

下面通过 图 1 来说明 Keystone 和其它 OpenStack 服务之间是如何交互和协同工作的。

  • 首先用户向 Keystone 提供自己的身份验证信息,如用户名和密码。Keystone 会从数据库中读取数据对其验证,如验证通过,会向用户返回一个 token
  • 此后用户所有的请求都会使用该 token 进行身份验证。如用户向 Nova 申请虚拟机服务,nova 会将用户提供的 token 发给 Keystone 进行验证,Keystone 会根据 token 判断用户是否拥有进行此项操作的权限,若验证通过那么 nova 会向其提供相对应的服务。
  • 其它组件和 Keystone 的交互也是如此。

总结概括一下,就是:

用户(User)向系统提供证书(Credentials),被系统授予令牌(Token),
系统给用户分配角色(Role),
根据角色(Role)的不同,用户被授权访问租户(Tenant)中的不同资源。

Keystone V3 API 新特性

Keystone V3 做出了许多变化和改进,我们选取其中较为重要的进行阐述:

  • 将 Tenant 改称为 Project
  • 引入 Domain 的概念
  • 引入 Group 的概念

KeyStone其他概念

地域Region

每个region都有个完整的Openstack部署环境, 有自己的一套服务的endpoint(服务入口)。

不同的region共享一套keystone和horizon来提供访问控制与web操作,regions之间完全隔离,但是多个regions之间共享同一个keystone和dashboard。

参考文档:https://www.cnblogs.com/zhoumingang/p/5514853.html

可用区AZ(Availability Zones)

region中的计算结点可以被逻辑上划分为不同的availability zones,具有独立的电力供应设备,如下图。用户可见,在启动虚拟机时,可以指定特定的AZ来启动该虚拟机实例,通常你看到的就是默认nova。


参考文档:http://www.cnblogs.com/sammyliu/p/5955984.html

KeyStone服务目录组件

服务目录列表(Service Catalog):提供一个服务目录,包括服务与服务入口的位置,以为用户提供参考,主要包含以下几个概念:

服务

服务(Service):一个OpenStack服务,例如Nova、Swift、Glance或Neutron。

服务入口

服务入口(endpoints):一个可以通过网络访问的地址(例如一个URL),代表了OpenStack服务的入口。一个服务可以拥有一个或多个入口,用户可以通过获取OpenStack的某项服务。如Nova、Swift和Glance。比如,当 Nova 需要访问 Glance 服务去获取镜像 时,Nova 通过访问 Keystone 拿到 Glance 的 服务入口,然后通过访问该入口去获取Glance服务。[3]

服务入口按使用对象可以分为三类:[3]

  • adminurl 给 admin 用户使用
  • internalurl 给 OpenStack 内部服务使用来跟别的服务通信
  • publicurl 其它用户可以访问的地址

域(region),也叫Endpoint region : 表示不同的范围,类似c++中命名空间,把服务“隔离“。

模板

模板(Template):端点也可以分组为模板,每个模板代表一组可用的 OpenStack服务,这些服务是跨区域(regions)可用的,例如将多个Swift Proxy Server分别配置为不同的域(regionOne、regionTwo等)。


keystone 的访问流程

以创建一个虚拟机(server)为例,结合下图简述下keystone在openstack的访问流程。

  • 用户Alice通过自己的户名和密码向keystone申请token,keystone认证用户名和密码后,返回token1
  • Alice通过token1发送keystone查询他所拥有的租户,keystone验证token1成功后,返回Alice的所有Tenant
  • Alice选择一个租户,通过用户名和密码申请token,keystone认证用户名、密码、tenant后,返回token2。(其实1、2步仅仅是为了查询tenant,如果已经知道tenant,可以忽略1、2步)
  • Alice通过token2发送创建server的请求,keystone验证token2(包括该token是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到nova,最终创建虚拟机

Openstack5-3.png