Keystone 负责 OpenStack 的认证和授权管理。当用户的 Credentials 被验证后,keystone 会给用户分配一个 Authentication token 作为用户凭据去访问其他组件的 API。
Token 分类
OpenStack Token 按授权范围分有以下几种:
-
Unscoped tokens
* contains neither a service catalog, any roles, a project scope, nor a domain scope
* use to generate scoped tokens -
Project-scoped tokens
* operate in a specific tenancy of the cloud -
Domain-scoped tokens
* domain-level administrator to operate a domain -
System-scoped tokens
* operate system-level resources,e.g. endpoints, service, hypervisors
按生成方式分:
-
UUID tokens
* 32 bytes in length and must be persisted -
PKI tokens
* CA certificate issued by external CA -
PKIZ tokens
* zipped PKI token -
Fernet tokens
* do not need to be persisted
* AES256 encryption is used to protect the information stored in the token
* integrity is verified with a SHA256 HMAC signature
Token 认证流程
OpenStack Token 认证流程其中 OpenStack API 接受到用户 token 后向 keystone 认证的步骤4、5是通过 keystone 提供的 WSGI middleware —— keystonemiddleware 实现的:
- 在各个组件的 api-paste.ini 配置文件中引入 auth_token filter:
- 在组件配置文件如 nova.conf 中配置 keystone 参数:
Token 变迁史
OpenStack D 版本时,仅有 UUID 类型的 Token,UUID token 简单易用,却容易给 Keystone 带来性能问题,每当 OpenStack API 收到用户请求,都需要向 Keystone 验证该 token 是否有效。随着集群规模的扩大,Keystone 需处理大量验证 token 的请求,在高并发下容易出现性能问题,而且需要持久化到数据库中,与日俱增积累的大量 token 引起数据库性能下降,所以用户需经常清理数据库的 过期 token。
于是 PKI(Public Key Infrastructrue) token 在 G 版本应运而生,和 UUID 相比,PKI token 携带更多用户信息的同时还附上了数字签名,以支持本地认证,从而避免了和 keystone 交互过程。而因为 PKI token 携带了更多的信息,包括 service catalog,随着 OpenStack 的 Region 数增多,service catalog 携带的 endpoint 数量越多,PKI token 也相应增大,很容易超出 HTTP Server 允许的最大 HTTP Header(默认为 8 KB),导致 HTTP 请求失败。PKI 的过期管理和安全问题也需要用户考虑,给实际应用带来了额外的开销。
PKIZ token 就是 PKI token 的改进压缩版,但压缩效果有限,无法良好的处理 token size 过大问题。PKI 和 PKIZ 类型的 token 由于安全性和使用上的不便,在 P 版本已被废弃。
为了解决前面种种问题,社区引入了 Fernet token,它携带了少量的用户信息,实际 token 大小约为 255 Byte,采用了对称加密,无需存于数据库中,解析传输效率很高,现在已成为 keystone 的默认 token 类型。
Token 类型比较
Token 类型 | UUID | PKI | PKIZ | Fernet |
---|---|---|---|---|
大小 | 32 Byte | KB 级别 | KB 级别 | 约 255 Byte |
支持本地认证 | 不支持 | 支持 | 支持 | 不支持 |
Keystone 负载 | 大 | 小 | 小 | 大 |
存储于数据库 | 是 | 是 | 是 | 否 |
携带信息 | 无 | user, catalog 等 | user, catalog 等 | user 等 |
涉及加密方式 | 无 | 非对称加密 | 非对称加密 | 对称加密(AES) |
是否压缩 | 否 | 否 | 是 | 否 |
需要预配置 | 否 | 是 | 是 | 是 |
版本支持 | D | G | J | K |
网友评论