一、Keystone介绍

    Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的Identity API。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。

Keystone主要功能:

  1. 管理用户及其权限;

  2. 维护OpenStack Services的Endpoint;

  3. Authentication(认证)和Authorization(授权)。

OpenStack —— 认证服务Keystone(二)_第1张图片

二、Keystone主要组件

1、Server

    提供一个RESTful的接口,接收用户的请求并对其进行认证以及授权。

2、Drivers

    这个已经默认集成到Server中了,主要从后端存储获取用户的身份信息,比如从数据库或者LDAP中获取。

3、Modules

    中间件模块运行在会用到Keystone服务的其他的OpenStack的组件的空间中,这些模块拦截服务请求,提取用户凭据,并将它们发送到Server进行授权。使用Python WEB接口来整合中间件模块和OpenStack其他组件的通信,比如这些模块可以运行在镜像服务的空间中,也可以运行在计算服务的空间中。

三、Keystone的重要概念

1、User(用户)

    User指代任何使用OpenStack的实体,可以是真正的用户,其他系统或者服务。当User请求访问OpenStack时,Keystone会对其进行验证。

OpenStack —— 认证服务Keystone(二)_第2张图片

    Horizon在Identity->Users管理User,除了admin和demo,OpenStack也为nova、cinder、glance、neutron服务创建了相应的User,admin也可以管理这些User。

OpenStack —— 认证服务Keystone(二)_第3张图片

2、Group(组)

    组是表示用户集合的容器。

3、Credentials(证书)

    Credentials是User用来证明自己身份的信息,可以是:

  • 用户名/密码 

  • Token 

  • API Key 

  • 其他高级方式

4、Authentication(认证)

    Authentication是Keystone验证User身份的过程。

    User访问OpenStack时向Keystone提交用户名和密码形式的Credentials,Keystone验证通过后会给User签发一个Token作为后续访问的Credential。

5、Token(令牌)

   用户从Keystone那里获取的令牌,用于访问其他服务和资源的凭证,每个令牌都有一个访问范围,允许访问OpenStack范围内的服务资源。

6、Project(项目)

    Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。 
    根据OpenStack服务的对象不同,Project可以是一个客户(公有云,也叫租户)、部门或者项目组(私有云)。

OpenStack —— 认证服务Keystone(二)_第4张图片


    这里请注意:

  • 资源的所有权是属于Project的,而不是User。

  • 在OpenStack的界面和文档中,Tenant/Project/Account 这几个术语是通用的,但长期看会倾向使用Project。

  • 每个User(包括 admin)必须挂在Project里才能访问该Project的资源。 一个User可以属于多个 Project。

  • admin相当于root用户,具有最高权限。

    Horizon在Identity->Projects中管理 Project,可以在project中调整用户。

OpenStack —— 认证服务Keystone(二)_第5张图片

7、Service(服务)

    OpenStack的Service包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。

    每个Service都会提供若干个Endpoint,User通过Endpoint访问资源和执行操作。

8、Endpoint(访问端点)

    Endpoint是一个网络上可访问的地址,通常是一个URL,Service通过Endpoint 暴露自己的API,Keystone负责管理和维护每个Service的Endpoint。

9、Role(角色)

   个性化的用户可以执行一组特定的操作,角色包括一组权利和特权,如果用户担当某一角色,就可以继承角色的权利和特权。

    在Keystone服务中,发放的令牌(Token)决定了用户的角色,包括一系列的权限,用户调用的服务诠释了用户的角色具体操作权利,即哪些操作可以,哪些操作不可以。

    Horizon 的菜单为 Identity->Project->Manage Members,可以为用户分配一个或多个role。

OpenStack —— 认证服务Keystone(二)_第6张图片

10、Domain

    域是项目、用户和组的高级容器,每个都由一个域拥有。每个域定义一个名称空间,其中API可见名称属性存在。Keystone图提供了一个默认域名,称为“Default”。

11、举个例子:

User 住宾馆的人
Credentials 开启房间的钥匙
Authentication 宾馆为了拒绝不必要的人进出宾馆,专门设置的机制,只有拥有钥匙的人才能进出
Token 也是一种钥匙,有点特别
Project 宾馆
Service 宾馆可以提供的服务类别,比如,饮食类,娱乐类
Endpoint 具体的一种服务,比如吃烧烤,打羽毛球
Role VIP 等级,VIP越高,享有越高的权限

四、管理介绍

1、用户管理

   用户身份管理有以下三个主要概念:

  • 用户

  • 项目

  • 角色

    这里的用户代表一个真实的人类用户,并有一些列相关信息,如用户名、密码、电子邮件等。

    一个用户可以在一个项目中担任多种角色,不同的角色有不同的权限,细化用户角色的权限,也是一门值得探讨的学问。

    在/etc/[SERVICE_CODENAME]/policy.json中,控制用户可以对指定服务进行哪些操作。例如,/etc/nova/policy.json中,指定计算服务的访问策略;在/etc/glance/policy.json中,指定镜像服务 的访问策略;在/etc/keystone/policy.json中,指定身份服务的访问策略等。

    在Noav、Glance、Keystone的默认policy.json中,访问策略默认只有admin角色,所有不需要admin操作的访问,将由项目中的任何用户、任何角色来完成。

2、服务管理    

    服务管理有两个主要概念:

  • 服务

  • 访问端点

五、Keystone在OpenStack中的访问流程

OpenStack —— 认证服务Keystone(二)_第7张图片

1) 用户携带证书或密码进行Keystone认证。 

2) Keystone认证通过后返回Token,此Token带有角色限制。 

3) 通过Token向Keystone获取服务访问目录。 

4) Keystone返回服务访问目录。 

5) 携带Token进行虚拟机创建,将指令传递给nova-api。

6) Nova向Keystone验证Token。 

7) Nova携带Token访问Glance,这里也需要Keystone验证Token。 

8) Glance返回镜像。 

9) Nova携带Token,向Neutron请求虚拟机网卡VIF设置参数。 

10) Neutron向Keystone验证Token。 

11) Nova携带Token验证VIF是否可以访问。 

12) Neutron返回成功的信息给Nova。 

13) Nova返回创建成功的信息给用户。 

14) 虚拟机创建成功。

六、Keystone的身份验证流程案例

OpenStack —— 认证服务Keystone(二)_第8张图片

  1. 用户Alice通过自己的户名和密码向keystone申请token,keystone认证用户名和密码后,返回临时token;

  2. Alice通过临时token发送keystone查询他所拥有的租户,keystone验证临时token成功后,返回Alice的所有租户列表;

  3. Alice选择一个租户,通过用户名和密码申请正式token,keystone认证用户名、密码、tenant后,返回正式token;

  4. Alice通过正式token发送创建server的请求,keystone验证正式token(包括该token是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到nova,最终创建虚拟机。


附录:一些解释

    Fernet Tokens是K版本的更新内容,区别于UUID tokens只能持久化存入数据库,Fernet tokens完全不需要持久化。部署人员可以通过设置keystone.conf中的[token] provider = keystone来启用Fernet token。

    Fernet Tokens需要symmetric encryption keys(对称加密密钥),这些keys可以使用keystone-manage fernet_setup建立, 并且使用keystone-manage fernet_rotate周期性地轮换。这些keys必须被在一个multi-node(或者multi-region)部署中的所有Keystone nodes共享,这样就能使一个node生成的tokens可以立即被其他节点验证。


                              OpenStack —— 认证服务Keystone(二)_第9张图片