Keystone简介
Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的IdentityAPI。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。
Keystone基本概念介绍
1. User
User即用户,他们代表可以通过keystone进行访问的人或程序。Users通过认证信息(credentials,如密码、API Keys等)进行验证。
2. Tenant
Tenant即租户,它是各个服务中的一些可以访问的资源集合。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜
像存储,在Quantum中一个tenant可以是一些网络资源。Users默认的总是绑定到某些tenant上。
3. Role
Role即角色,Roles代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的 或 租户内的角色中。
在全局的role中,用户的role权限作用于所有的租户,即可以对所有的租户执行role规定的权限;在租户内的role中,用户仅能在当前租户内执行role规定的权限。
4. Service
Service即服务,如Nova、Glance、Swift。根据前三个概念(User,Tenant和Role)一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个user尝试着访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。例如,当swift需要一个管理员权限的访问进行对象创建时,对于相同的role我们并不一定也需要对nova进行管理员权限的访问。为了实现这个目标,我们应该创建两个独立的管理员role,一个绑定到swift,另一个绑定到nova,从而实现对swift进行管理员权限访问不会影响到Nova或其他服务。
5. Endpoint
Endpoint,翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。因此,在keystone中包含一个endpoint模板(endpoint template,在安装keystone的时候我们可以在conf文件夹下看到这个文件),这个模板提供了所有存在的服务endpoints信息。一个endpoint template包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。public url可以被全局访问(如http://compute.example.com),private url只能被局域网访问(如http://compute.example.local),admin url被从常规的访问中分离。
服务目录(Service Catalog)
Keystone为OpenStack安装提供了一个REST API端点列表并以此作为决策参考。主要的概念包括:
服务(Service)
一个OpenStack服务,例如nova、swift、glance或keystone。一个服务可以拥有一个或多个端点,通过它用户可以与OpenStack的服务或资源交互。
端点(Endpoint)
一个可以通过网络访问的地址(典型地,一个URL),代表了OpenStack服务的API接口。端点也可以分组为模板,每个模板代表一组可用的OpenStack服务,这些服务是跨区域(regions)可用的。
模板(Template)
一个端点集合,代表一组可用的OpenStack服务端点。
Keystone的组件
Keystone包含一个命令行接口,可以与Keystone API交互以管理keystone和相关服务。
keystone - 运行keystone-admin和keystone-service
keystone-admin - 操作keystone的管理API
keystone-service - 用于验证的,面向用户的AP
keystone-manage - 管理keystone的命令行接口
Keystone还包括WSGI中间件以为Nova和Swift提供验证服务。
Keystone使用一个内置的SQLite数据库 - 为验证用户,将来也可能使用一个外部LDAP服务来代替存储证书
中间件(Middleware)
Keystone中间件位于OpenStack服务前面,处理进来的请求验证。中间件的设计遵循如下的规范。
中间件的源代码位于Keystone/middleware。
中间件支持两个接口:WSGI和REST/HTTP。
REST & HTTP API
如果进来一个未经认证的调用,中间件将响应一个401 Unautorized错误。根据每HTTP的标准,它也会返回一个WWW-Authenticate包头以通知调用者支持哪个协议。对于Keystone验证,响应的语法格式如下:
WWW-Authenticate: Keystone uri="url to Keystone server"The client can then make the necessary calls to the Keystone server, obtain a token, and retry the call with the token.
令牌使用 X-Auth-Toke包头传递。
WSGI API(包头)
当成功验证后中间件经为下行的WSGI应用发送如下包头:
X-Identity-Status
提供请求是否被验证的信息。
X-Tenant
提供了租户ID(在Keystone中以URL的形式出现)。在Keysotne转为采用ID/Name模式之前,它为租户提供了对任意遗留实现的支持。
X-Tenant-Id
唯一不变的租户ID。
X-Tenant-Name
唯一但可变的租户名字。
X-User
用于登录的用户名。
X-Roles
分配给用户的角色。