Keystone 作为 OpenStack 的身份(Identity)、认证(Authentication)及访问管理(授权,Authorization)模块,是所有其他模块都要使用的模块,其重要性不言而喻。
下文主要参考自书籍 《Identity, Authentication and Access Management in OpenStack》。
对于身份,指的是访问者的身份信息。在 OpenStack 中,身份用用户来表示。这些用户信息可以存在 Keystone 自己的数据库,也可以存在外部。
对于认证,指的是对访问者身份的验证(validate),确认访问者是否合法。认证可通过密码或者 Token 进行。
对于授权,指的是 OpenStack 通过角色(Role),再结合具体模块(如 Nova)的策略(Policy)机制,来限定访问者可以访问的资源(如查看、新建虚拟机)。
基本概念
租户(Project/Tenant)
在 Keystone 中,租户是对资源(如虚拟机、镜像)的集合(group)和隔离(isolate)的抽象(abstraction)。从这个定义,我们可以看出两点:
- 租户是一种抽象,它的出现只是为了方便对资源进行管理
- 一个租户表示一个隔离的资源集合,不与其他租户共享资源
那谁来使用租户的资源呢?用户和用户组。通过角色赋予(role assignment),用户或用户组就可以访问或操作租户的一些资源。具体能访问或操作的资源类型取决于他们被赋予的角色。
域(Domain)
域是租户、用户及用户组的集合,是为了跟其他租户、用户及用户组隔离开来而提出来的抽象。这样一来,不同的域就可以有名字相同的租户、用户或用户组而不用担心冲突(不过 UUID 跨域唯一)。例如,一个云可以有多个域,每个域可以代表一个公司,也可以代表一个部门。
因为租户和域都是角色赋予(assigned on)的实体,因此统称为 Targets。
用户和用户组(Actor)
用户和用户组是访问由租户和域隔离开来的资源的实体(entity)。用户组是用户的集合,而用户是最终使用云资源的个体。用户和用户组统称为 Actors,表示它们是被赋予(assigned to)角色的实体。
域、租户及用户和用户组的关系如下图所示:
图片来源
角色(Role)
角色用于表示授权。一个 Actor 可以有多个角色。
凭证(Credidential)
用户身份的确认数据,例如,用户名和密码,或者是一个由 Identity(身份)服务提供的授权令牌。
令牌(Token)
令牌(Token)用于认证和授权。当用户认证成功后就可以得到一个 Token,接下来的请求就可以直接使用该 Token 而不是用户名密码进行认证;同时,Token 也包含了用户在云上的授权信息(如用户能访问的的租户、域)。一个 Token 拥有一个 ID 和一个载体(payload)。不过,随请求一起发送的一般只有 Token ID,然后 OpenStack 在认证 Token 的时候再把 Token 载体取出来。一个 Identity V3 的 Token 例子为:
1 | { |
对于 Token,如果想再进一步了解,一定要看《Identity, Authentication and Access Management in OpenStack》第 3 章“Token Formats”,里边除了介绍各种各样的 Token (UUID Token、PKI Token 及 Fernet Token),还介绍了遇到问题时的处理(如性能下降)。
另外,博文基于 Token 的 WEB 后台认证机制真的是写的太好了,工作原理、过程都很详细,特别摘录文中的认证和请求过程的两张图(看懂了就理解了 OpenStack 的用户名密码和 Token 认证过程。应该说,OpenStack 的认证就是参照已有 Web 认证写的。):
图片来源
服务目录(Service Catalog)
在 OpenStack 服务目录尤其重要,它包含了不同云服务(如 Nova)的 URLs 和端点(Endpoints)。没有服务目录,用户和应用不知道如果路由请求到正确的服务。服务目录可以拆分成端点列表,每一个端点能够进一步拆分成 admin URL,internal URL 和 public URL。这些 URL 可以相同。一个拥有 Identity 和对象存储(Object Storage)服务的服务目录例子如下:
1 | { |
身份
Identity 服务提供了 Actors(用户和用户组)(当然还有其他的功能)。Actors 可以存储在不同后端上,如下图。比较常用的是 SQL。
图片来源
认证
我们前文多多少少也提到,Keystone 有两种认证方式,用户名密码和 Token。前者主要是在登录的时候使用,后者则更多地跟请求一起使用。
例如,我们可以在 POST 请求主体中添加上用户名密码:
1 | { |
Token 的例子我们前边已经举过,这里就不重复了。
访问管理和授权
Keystone 授权分成两个部分,一个是 Token,限制的是相对较大的范围,如用户可以访问的租户、域、服务目录;另一个是基于角色的访问控制机制(Role-Based Access Control, RBAC),限制的范围可以具体到 API,一般用一个 policy.json 配置文件来配置 API 的访问权限,用于在 API 调用的时候实时读取并确定请求者是否有权限操作某一个 API。一个 policy.json 文件样例如下:
1 | { |
下边有几点说明:
- 对于 policy.json 文件,官方有提供了样例和语法说明。
该文件的 API 的映射源码文档有详细说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# doc/source/policy_mapping.rst
===============================
Mapping of policy target to API
===============================
The following table shows the target in the policy.json file for each API.
========================================================= ===
Target API
========================================================= ===
identity:get_region GET /v3/regions/{region_id}
identity:list_regions GET /v3/regions
identity:create_region POST /v3/regions
identity:update_region PATCH /v3/regions/{region_id}
identity:delete_region DELETE /v3/regions/{region_id}
......关于 Policy 工作原理,可参考如下博文:
Nova 中的 policy
OpenStack Nova 基础知识——policy
Havana Keystone 中 policy.json 的解析过程最后,关于 RBAC,可以参考以下两篇文章:
Authorization Model in OpenStack (keystone API V2.0)
Authorization Model in OpenStack (keystone API V3.0)
总结及答疑
对于我们上边提到的各个模块或服务,下图很简洁明了地介绍了它们的用途及后端(绿色表示后端一般是 SQL,红色表示一般是 LDAP 或 SQL,蓝色表示 SQL 或 Memcache,而 policy 是通过文件形式体现的):
图片来源
为了便于大家解疑,《Identity, Authentication and Access Management in OpenStack》作者还专门开辟了一个 FAQ 条目,真是太贴心了,现总结如下:
- 域(Domain)和区域(Region)区别
区域是从地理角度上来说的,如东南区、西北区;而域则是逻辑上对租户、用户资源的划分。 - 用户是否可以同时存在于多个域?
不可以。在不同域,可以有同名的用户,但他们的 ID 是不一样的。 - 为什么 OpenStack 文档中有时候提到 tenant,有时候提到 project,或者同时提到两者?
早期的 OpenStack 用 tenant 表示对资源的集合和隔离,但后期大家认为用单词 project 来表示资源的集合和隔离相较于 tenant 更加直观(intuitive),所以后来就改用 project 来表示租户了。但是,并不是所有的 OpenStack 项目都已经将 tenant 改动为 project,所以,好多时候,我们还是会看到两者混用。 - Scoped Token 和 Unscoped Token 的区别
Unscoped Token 表示用户已认证,但并没有绑定具体的租户或域。这种类型的 Token 可应用于一些查询中,如确定用户有访问权限的租户。Scoped Token 就是我们最常见的 Token,除了表示用户已认证,还会跟具体的租户和域绑定在一起,详细可参照前文有关 Token 说明。
另外,Unscoped Token 里边不会包含用户的角色(Role)信息。
额外资料
- !!!源码文档 doc/source 目录
- !!!官方 Keystone Architecture
- !!!官方 Keystone Configuration
- 探索 OpenStack 之(13):研究 Keystone