Keystone 轻量级令牌 - KLWT

bp klw-tokens

KLWT 令牌提供了一种表示令牌的方式,允许令牌是非持久化的。KLWT 令牌通过 Keystone 签名提供完整性和机密性,在选择使用加密时。KLWT 令牌包含一些令牌信息,包括用户、签发时间、过期时间和签名信息的摘要。无论是否使用加密,由于令牌由 Keystone 签名和验证,因此令牌都是可信的。

问题描述

在部署 Keystone 一段时间后,部署者遇到了令牌后端中存储的令牌数量问题。为了避免此问题,部署者必须定期清理持久存储中的过期令牌,以防止性能或升级问题。

提议的变更

避免后端存储大量令牌的一种方法是不存储令牌。KLWT 令牌将为部署者提供一种方法,通过使用 KLWT 令牌驱动程序来避免性能下降和令牌后端维护。在身份验证时,KLWT 令牌提供程序将从请求中提取用户的一些信息,生成包含此数据的令牌并将其返回给用户。为了确保将令牌保持在合理的长度,可以压缩信息。

虽然本规范不应被视为规定,但示例可能如下所示

payload = [scope_type, scope, user_id, created_at, expires_at, audit_id]

其中值如下:* scope_type:范围类型,用于确定令牌的类型(例如,域范围令牌、信任范围令牌等)* scope:令牌的范围,包括信任 ID、项目 ID 等。* user_id:创建令牌的用户 ID。* created_at:表示令牌创建时间的 UTC 时间戳。通过使用时间戳,我们可以通过打包整数而不是字符串来节省空间。* expires_at:表示令牌过期的 UTC 时间戳。可以使用不同的方式表示,也可以使用整数来存储时间戳而不是字符串。这也可以是一个表示令牌 TTL 的 delta 整数。* audit_id:令牌的审计 ID。

联合令牌将是一种特殊情况。我们需要一个特定的格式化程序来处理联合令牌。KLWT 提供程序/驱动程序与 KLWT 令牌格式化程序之间的区别在于,格式化程序知道如何处理特定的令牌格式,例如联合令牌。KLWT 提供程序知道如何确定令牌格式并将令牌传递给适当的 KLWT 格式化程序。我们可以确定是否正在以联合工作流程进行身份验证,并使用特定于联合令牌的格式版本。在该特定格式版本中,我们可以附加联合令牌所需的组。

这些值可以存储在列表中,KLWT 令牌驱动程序或任何验证器都知道值的顺序。上述值可以打包,可能加密并编码。这将产生一个 payload。为了确保内容的完整性,payload 必须使用 HMAC 等机制进行签名。生成的摘要将包含在令牌中。

或者,如果部署者希望使信息对最终用户不透明,可以使用加密。重要的是,无论令牌是否加密,令牌数据都由 Keystone 签名以确保完整性。这一点很重要,因为如果令牌受到任何方式的篡改,我们应该快速失败,而无需尝试解密伪造的令牌,然后因错误的令牌值而失败。

然后,用户可以在正常的 UUID 工作流程中使用 KLWT 令牌。当 Keystone 从用户或服务接收到 KLWT 令牌时,它可以验证令牌提供的摘要,以确定令牌是否在传输过程中被篡改。这不需要 KLWT 令牌驱动程序从令牌后端查找任何信息。传统上存储在令牌后端中的信息,例如服务目录,将根据令牌中传递的范围按需计算。

此驱动程序只需要最少的数据来验证用户的身份。数据将包含在用户的令牌中。用户的流程不会从当前的 UUID 工作流程中更改。令牌大小将大于 UUID 令牌,但不会像 PKI 令牌那样大。

这很不错,但是如何撤销未存储的 KLWT 令牌?

令牌撤销将通过撤销事件处理,该事件将基于现有的 撤销事件 系统构建。当用户令牌被撤销时,KLWT 令牌驱动程序将构建一个描述要撤销的令牌的规则。例如,撤销在此时间点之前用户 XYZ 的所有令牌。下次用户将现在被撤销的令牌发送到 Keystone 时,validate 调用将检查令牌信息与撤销规则,如果撤销规则与令牌中包含的信息匹配,则返回 401。在默认令牌过期时间后,可以随时清理撤销事件,因为撤销规则是创建的。

备选方案

安全影响

描述对系统造成的任何潜在安全影响。需要考虑的一些项目包括

  • 此更改是否涉及敏感数据,例如令牌、密钥或用户数据?

    是的,身份和授权数据将选择性地加密、压缩并返回给 API 用户,而不是存储在令牌后端中。

  • 此更改是否以可能影响安全性的方式更改了 API,例如访问敏感信息的新方式或登录的新方式?

    不应该,验证和与 Keystone 验证所需的所有数据都相同。

  • 此更改是否涉及密码学或哈希?

    是的,此更改涉及加密来保护用户的信息和哈希来验证。Keyczar 可用于处理 KLWTS 加密。

  • 此更改是否需要使用 sudo 或任何特权?

  • 此更改是否涉及使用或解析用户提供的数据?这可能是直接在 API 级别,或间接例如更改缓存层。

    KLWT 令牌将从用户提供的数据构建。这不会使 Keystone 容易受到注入攻击,因为使用的数据将从后端存储中提取。

  • 此更改是否会启用资源耗尽攻击,例如允许单个 API 交互消耗大量的服务器资源?这方面的一些例子包括为每个连接启动子进程,或 XML 中的实体扩展攻击。

    KLWT 令牌不会像 UUID 或 PKI[z] 令牌那样导致资源耗尽,因为它们不需要持久化。

通知影响

其他最终用户影响

性能影响

通过使用 KLWT 令牌驱动程序,Keystone 性能不应随着部署规模的增加而下降。在将令牌持久化到后端的 Keystone 大型部署中,可能会观察到性能下降,因为令牌创建规模增加。与其扩展令牌的持久存储解决方案,不如使用 KLWT 令牌并扩展计算能力。由于令牌不必写入后端,因此 CPU 操作将比 I/O 操作具有更好的性能。

性能结果已在 此处 基于 概念验证 KLWT 令牌实现 进行记录。

其他部署者影响

讨论将影响您部署和配置 OpenStack 的事情,这些事情尚未提及,例如

  • 正在添加哪些配置选项?它们是否应该比建议的更通用(例如,其他 hypervisor 驱动程序可能想要实现的标志)?默认值是否适用于实际部署?

    KLWT 令牌驱动程序应在 Keystone 配置文件中指定。

  • 此更改是否在合并后立即生效,还是需要显式启用?

    这将是一个选择加入的功能,默认情况下未启用。

开发人员影响

  • 如果蓝图提出对驱动程序 API 的更改,则需要讨论其他后端将如何实现该特性。

    从持久存储的角度来看,此更改不应特定于驱动程序。

实现

负责人

主要负责人

lbragstad (Lance Bragstad <lbragstad@gmail.com>)

工作项

  • 清理当前的令牌提供程序 API,使其更容易扩展到不同的令牌格式。

  • 允许 KLWT 令牌的撤销事件(即模式匹配)

  • 添加一个新的 KLWT 令牌驱动程序并进行测试。

  • 记录设置 KLWT 令牌实现的过程。

依赖项

  • 支持与 KLWT 令牌实现一起使用的撤销事件。

  • 基本实现依赖于 python-keyczar

文档影响

详细说明如何切换到 KLWT 令牌实现并设置驱动程序。

参考资料