Keystone tokens

Tokens 用于验证和授权您与 OpenStack API 的交互。Tokens 有许多范围,代表各种授权和身份来源。

授权范围

Tokens 用于传递有关您的角色分配的信息。用户拥有多个角色分配的情况并不少见,有时甚至跨越项目、域或整个系统。这些被称为授权范围,其中一个 token 具有单一的操作范围(例如,一个项目、域或系统)。例如,作用域限定于一个项目的 token 不能被重用于在不同项目中执行其他操作。

授权范围的每个级别对于某些 OpenStack 服务中的某些类型的操作都很有用,并且不能互换。

未限定范围的 tokens

未限定范围的 token 不包含服务目录、角色或授权范围(例如,token 中的项目、域或系统属性)。它们的主要用例是简单地向 keystone 证明您的身份,以便在以后生成限定范围的 tokens,而无需重复提供您的原始凭据。

要接收未限定范围的 token,必须满足以下条件

  • 您不得在身份验证请求中指定授权范围(例如,在命令行中使用诸如 --os-project-name--os-domain-id 之类的参数),

  • 您的身份不得与您也具有角色分配和授权的项目默认项目相关联。

项目限定范围的 tokens

项目是资源的容器,例如卷或实例。项目限定范围的 tokens 表达您在云的特定租户中操作的授权,并且对于诸如启动计算资源或划分块存储之类的操作很有用。它们包含服务目录、一组角色以及有关项目的信息。

大多数最终用户需要在项目上拥有角色分配才能在部署中消耗资源。

域限定范围的 tokens

域是项目、用户和组的命名空间。域限定范围的 token 表达您对域的内容或域本身的授权。

虽然一些 OpenStack 服务仍在采用域概念,但 keystone 完全支持域。这意味着在域上具有授权的用户有权管理域内的内容。例如,域管理员可以在该域内创建新用户和项目。

域限定范围的 tokens 包含服务目录、角色以及有关域的信息。

通常需要域级访问权限才能管理用户和项目。

系统限定范围的 tokens

某些 OpenStack API 很好地适应项目(例如,创建实例)或域(例如,创建新用户)的概念,但也有一些 API 会影响整个部署系统(例如,修改端点、服务管理或列出有关 hypervisors 的信息)。这些操作通常保留给操作员,需要系统限定范围的 tokens,它代表用户操作整个部署所具有的角色分配。术语系统指的是部署系统,它是由硬件(例如,计算节点)和提供基础设施即服务的服务(例如,nova、cinder、neutron、barbican、keystone)组成的集合。

系统限定范围的 tokens 包含服务目录、角色以及有关系统的信息。系统角色分配和系统限定范围的 tokens 通常保留给操作员和云管理员。

Token 提供程序

keystone 发出的 token 类型可以通过 /etc/keystone/keystone.conf 文件进行配置。目前,支持两种 token 提供程序,fernetjws

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

  • 撤销 token

    状态:可选。

    CLI 命令

    • openstack token revoke

    注意:tokens 可以单独撤销,例如当用户从 Horizon 注销时。在某些情况下,由于此操作,可能会撤销不仅仅是一个 token(例如,当撤销的 token 之前用于创建其他 tokens 时)。

    驱动程序支持

    • Fernet tokens:complete
    • JWS tokens:complete

说明

  • 本文档是一个持续进行中的工作