Keystone tokens¶
Tokens 用于验证和授权您与 OpenStack API 的交互。Tokens 有许多范围,代表各种授权和身份来源。
Token 提供程序¶
keystone 发出的 token 类型可以通过 /etc/keystone/keystone.conf 文件进行配置。目前,支持两种 token 提供程序,fernet 和 jws。
Fernet tokens¶
fernet token 格式是在 OpenStack Kilo 版本中引入的,现在是 Keystone 中的默认 token 提供程序。与本文档中提到的其他 token 类型不同,fernet tokens 不需要持久存储在后端。使用 AES256 加密来保护存储在 token 中的信息,并使用 SHA256 HMAC 签名来验证完整性。只有 Identity 服务才应该能够访问用于加密和解密 fernet tokens 的密钥。与 UUID tokens 一样,必须将 fernet tokens 传回 Identity 服务才能对其进行验证。有关 fernet token 类型的信息,请参阅 Fernet - 常见问题解答。
如果担心公开用于构建 tokens 的有效负载,部署可能会考虑使用 fernet 提供程序而不是 JWS tokens。
JWS tokens¶
JSON Web Signature (JWS) token 格式是一种 JSON Web Token (JWT),它是在 Stein 版本中实现的。JWS tokens 是签名的,这意味着用于构建 token ID 的信息对用户不透明,并且任何人都可以对其进行解码。JWS tokens 是短暂的或非持久的,这意味着它们不会使数据库膨胀或需要在节点之间进行复制。由于 JWS token 提供程序使用非对称密钥,因此 tokens 使用私钥签名,并使用公钥进行验证。JWS token 提供程序实现仅支持 ES256 JSON Web Algorithm (JWA),这是一种使用 P-256 曲线和 SHA-256 散列算法的椭圆曲线数字签名算法 (ECDSA)。
如果对共享对称加密密钥到主机之间存在安全问题,部署可能会考虑使用 JWS tokens 而不是 fernet tokens。请注意,JWS tokens 和 fernet tokens 之间的主要区别在于 JWS tokens 不透明,并且任何人都可以使用 token ID 对其进行解码。Fernet tokens 不透明,因为 token ID 是密文。尽管 JWS token 有效负载可供任何人读取,但 keystone 保留对 token 有效负载进行向后不兼容更改的权利,这并非 API 合同。我们仅建议针对 keystone 的身份验证 API 验证 token 以检查其关联的元数据。我们强烈建议不要依赖解码的有效负载来获取有关 tokens 的信息。
可以在 规范 中找到有关 JWT 的更多信息。
摘要
| 特性 | 状态 | Fernet 令牌 | JWS tokens |
|---|---|---|---|
| 创建未限定范围的 token | mandatory | ✔ |
✔ |
| 创建系统限定范围的 token | mandatory | ✔ |
✔ |
| 创建项目限定范围的 token | mandatory | ✔ |
✔ |
| 创建域限定范围的 token | 可选 | ✔ |
✔ |
| 创建 trust 限定范围的 token | 可选 | ✔ |
✔ |
| 使用 OAuth 访问 token 创建 token | 可选 | ✔ |
✔ |
| 撤销 token | 可选 | ✔ |
✔ |
细节
- 创建未限定范围的 token
状态:强制。
CLI 命令
openstack --os-username=<username> --os-user-domain-name=<domain> --os-password=<password> token issue
注意:所有 token 提供程序都必须能够发出没有明确授权范围的 tokens。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- 创建系统限定范围的 token
状态:强制。
CLI 命令
openstack --os-username=<username> --os-user-domain-name=<domain> --os-system-scope all token issue
注意:所有 token 提供程序都必须能够发出系统限定范围的 tokens。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- 创建项目限定范围的 token
状态:强制。
CLI 命令
openstack --os-username=<username> --os-user-domain-name=<domain> --os-password=<password> --os-project-name=<project> --os-project-domain-name=<domain> token issue
注意:所有 token 提供程序都必须能够发出项目限定范围的 tokens。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- 创建域限定范围的 token
状态:可选。
CLI 命令
openstack --os-username=<username> --os-user-domain-name=<domain> --os-password=<password> --os-domain-name=<domain> token issue
注意:域限定范围的 tokens 并非所有用例都需要,并且对于某些用例,可以使用项目代替。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- 创建 trust 限定范围的 token
状态:可选。
CLI 命令
openstack --os-username=<username> --os-user-domain-name=<domain> --os-password=<password> --os-trust-id=<trust> token issue
注意:作用域限定于 trust 的 tokens 仅传递包含在委托中的用户 impersonation 和基于项目的授权属性。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- 使用 OAuth 访问 token 创建 token
状态:可选。
注意:OAuth 访问 token 可以交换为 keystone tokens。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
- Fernet tokens:
- 撤销 token
状态:可选。
CLI 命令
openstack token revoke
注意:tokens 可以单独撤销,例如当用户从 Horizon 注销时。在某些情况下,由于此操作,可能会撤销不仅仅是一个 token(例如,当撤销的 token 之前用于创建其他 tokens 时)。
驱动程序支持
- Fernet tokens:
complete - JWS tokens:
complete
说明
- 本文档是一个持续进行中的工作