Rocky 系列发布说明

14.2.0-7

升级说明

  • [bug 1872737] 为签名的 EC2 凭证请求添加了 15 分钟的默认 TTL,此前 EC2 签名令牌请求的有效期为无限期。这种行为的改变是为了防止重放攻击。

关键问题

  • [bug 1872733] 修复了一个关键的安全问题,即经过身份验证的用户可以通过修改有效的 EC2 凭证来提升其权限。

  • [bug 1872735] 修复了一个安全问题,即受托人或应用程序凭证用户可以创建一个 EC2 凭证或应用程序凭证,从而允许他们获得一个提升其角色分配的令牌,超出受托或应用程序凭证中委托给他们的子集。现在,一个新的属性 app_cred_id 会自动添加到 EC2 凭证的访问 blob 中,并且受托或应用程序凭证中的角色列表会得到尊重。

安全问题

  • [bug 1872733] 修复了一个关键的安全问题,即经过身份验证的用户可以通过修改有效的 EC2 凭证来提升其权限。

  • [bug 1872735] 修复了一个安全问题,即受托人或应用程序凭证用户可以创建一个 EC2 凭证或应用程序凭证,从而允许他们获得一个提升其角色分配的令牌,超出受托或应用程序凭证中委托给他们的子集。现在,一个新的属性 app_cred_id 会自动添加到 EC2 凭证的访问 blob 中,并且受托或应用程序凭证中的角色列表会得到尊重。

  • [bug 1872737] 修复了不正确的 EC2 令牌验证实现,该实现忽略了签名请求的时间戳,这使得 EC2 和 S3 令牌请求容易受到重放攻击。默认 TTL 为 15 分钟,但可以配置。

  • [bug 1872755] 为 EC2 凭证更新 API 添加了验证,以确保用户不会更改元数据标签“trust_id”和“app_cred_id”。这些标签由 keystone 用于确定凭证允许的范围,更改这些自动标签可能会使 EC2 凭证持有者提升其访问权限,超出应用程序凭证或用于创建 EC2 凭证的受托权限。

  • [bug 1873290] [bug 1872735] 修复了令牌模型,以尊重授权 OAuth1 访问令牌的角色。此前,OAuth1 访问令牌授权的角色列表会被忽略,因此当使用访问令牌请求 keystone 令牌时,keystone 令牌将包含创建者对项目的每个角色分配。这也修复了 EC2 凭证以尊重这些角色。

错误修复

  • [bug 1831918] 凭证现在记录 cadf 审计消息。

  • [bug 1872733] 修复了一个关键的安全问题,即经过身份验证的用户可以通过修改有效的 EC2 凭证来提升其权限。

  • [bug 1872735] 修复了一个安全问题,即受托人或应用程序凭证用户可以创建一个 EC2 凭证或应用程序凭证,从而允许他们获得一个提升其角色分配的令牌,超出受托或应用程序凭证中委托给他们的子集。现在,一个新的属性 app_cred_id 会自动添加到 EC2 凭证的访问 blob 中,并且受托或应用程序凭证中的角色列表会得到尊重。

  • [bug 1872737] 修复了不正确的 EC2 令牌验证实现,该实现忽略了签名请求的时间戳,这使得 EC2 和 S3 令牌请求容易受到重放攻击。默认 TTL 为 15 分钟,但可以配置。

  • [bug 1872755] 为 EC2 凭证更新 API 添加了验证,以确保用户不会更改元数据标签“trust_id”和“app_cred_id”。这些标签由 keystone 用于确定凭证允许的范围,更改这些自动标签可能会使 EC2 凭证持有者提升其访问权限,超出应用程序凭证或用于创建 EC2 凭证的受托权限。

  • [bug 1873290] [bug 1872735] 修复了令牌模型,以尊重授权 OAuth1 访问令牌的角色。此前,OAuth1 访问令牌授权的角色列表会被忽略,因此当使用访问令牌请求 keystone 令牌时,keystone 令牌将包含创建者对项目的每个角色分配。这也修复了 EC2 凭证以尊重这些角色。

  • [bug 1878938] 以前,当用户拥有系统角色分配并尝试删除相同的角色时,系统角色分配仍然存在于 system_assignment 表中。这导致 keystone 返回 HTTP 404 Not Found 错误,在列出具有名称的角色分配时(例如,–names?include_names)。

    如果您受到此错误的影响,则必须手动删除过时的角色分配。以下是一个示例 SQL 语句,您可以使用它来修复该问题,但您应该验证它是否适用于您的部署的 SQL 实现和版本。

    SQL
    • delete from system_assignment where role_id not in (select id from role);

  • [bug 1885753] Keystone 的 SQL 身份后端现在会重试更新用户请求,以安全地处理两个客户端同时更新用户时的陈旧数据。

14.2.0

错误修复

  • [bug 1773967] 修复了一个问题,即仅通过组 membership 拥有角色分配,而不是通过直接分配的用户可以创建但无法使用应用程序凭证。重要的是要注意,仅通过映射组 membership 拥有角色分配的联合用户仍然无法创建应用程序凭证。

  • [bug 1782922] 修复了 Keystone 随意返回第一个 RDN 作为用户 ID 的问题,无论它是否与配置的“user_id_attribute”匹配。这会破坏“group_members_are_ids”设置为 False 且“user_id_attribute”不在 DN 中的部署。此补丁将在第一个 RND 与配置的“user_id_attribute”不匹配时执行按 DN 查找。

  • [bug 1801873] 修复了一个问题,即由于 SQL 数据库中存在的影子用户,无法删除基于 LDAP 的域。

  • [bug 1840291] 为 delete_credential_for_user 方法添加重试,以避免在并发删除大量凭证时发生 DBDeadlocks。

  • [bug 1843609 <https://bugs.launchpad.net/keystone/+bug/1843609>] 修复了一个问题,即系统范围的令牌无法用于列出用户和组(例如,GET /v3/users 或 GET /v3/groups),如果 keystone.conf [identity] domain_specific_drivers_enabled=True 并且 API 将返回 HTTP 401 Unauthorized。这些 API 现在在使用领域特定驱动程序时识别系统范围的令牌。

  • [bug 1856881] keystone-manage bootstrap 可以在升级场景中运行,其中存在名为 adminmemberreader 的预先存在的领域特定角色。

  • [Bug 1856904] CADF 通知的发起者对象现在将始终包含发起操作的用户的用户名。以前,发起者对象仅包含 user_id,这导致在使用基于 LDAP 的身份提供程序时映射到用户时出现问题。这也有助于使发起者对象更好地符合 OpenStack 的 CADF 标准。

  • [bug 1858012] 修复了 /v3/role_assignments 过滤中的一个错误,其中 role.id 查询参数在存在多个系统角色分配的情况下无法正确地按角色过滤角色分配。

14.1.0

错误修复

  • [bug 1780503] 现在通知包装器会将发起者的 id 设置为给定的用户 id。这修复了一个问题,即身份.authentication 事件会导致发起者 id 成为随机的默认 UUID,而不是用户在对 keystone 进行身份验证时的用户 id。

  • [bug 1810393] 现在,当删除身份提供程序协议时,相关联合用户的缓存信息也会被使无效。

  • [bug 1798184] [bug 1820333] 在 Python 3 中,python-ldap 不允许某些字段(DN、RDN、属性名称、查询)使用字节。相反,文本值表示为 str,Unicode 文本类型。通过设置 bytes_mode=False [1] 为 Python 2 提供兼容性支持。

    keystone LDAP 后端已更新为通过在 Python 2 中使用 bytes_mode=False 并删除 UTF-8 编码和解码现在表示为文本的字段来遵守此行为。

    [1] 关于 python-ldap 中字节/字符串使用的更多详细信息,请参见:http://www.python-ldap.org/en/2025.2/bytes_mode.html#bytes-mode

    请注意,至少需要 python-ldappool 2.3.1。

  • [bug 1810983] 随着 KeystoneToken 从令牌模型中删除,我们不再能够使用令牌数据语法在策略规则中。此更改破坏了部署自定义 Keystone 策略的任何人的向后兼容性。不幸的是,我们无法返回 KeystoneToken 模型,因为该更改与重构的授权功能紧密耦合。

    由于范围信息现在可用在凭证字典中,我们可以直接使用它。拥有自定义策略的人员必须相应地更新其策略文件。

14.0.1

错误修复

  • [bug 1796887] 添加了对 trust 角色验证的缓存,以提高性能。严重依赖 trust 的服务会受到影响,因为 trust 会针对数据库进行验证。这会在这些操作上添加缓存以提高性能

14.0.0

序言

Keystone 历史上使用了一个自定义的 WSGI 框架,该框架松散地基于 [webob],并由 [pythonpaste 库] 加载。Keystone 团队已经计划在多个发布周期中远离自研解决方案,转向通用框架。在 Rocky 发布中,Keystone 正在迁移到 Flask 框架。

token_auth 中间件功能已合并到主身份验证中间件(keystone.middleware.auth.AuthContextMiddleware)中。必须从您的 paste ini 文件的 [pipeline:api_v3]、[pipeline:admin_api] 和 [pipeline:public_api] 部分中删除 admin_token_auth。还需要从您的 paste ini 文件中删除 [filter:token_auth] 块。如果在 Stein 发布中删除了 token_auth,则未从 paste ini 文件中删除这些元素会导致 keystone 无法启动/运行。

新特性

  • [bug 1754185] 注册的限制和项目限制现在支持一个可选的、可为空的属性,称为 description。用户现在可以创建/更新带有 description 的注册限制或项目限制。

  • [blueprint basic-default-roles] 添加了对在 bootstrap 过程中部署两个新角色(readermember)的支持,除了 admin 角色之外。

  • [blueprint strict-two-level-model] 添加了一个新的限制执行模型,称为 strict_two_level。将选项 [unified_limit]/enforcement_model 的值更改为 strict_two_level 以启用它。在这个 [模型] 中:1. 项目深度强制限制为 2 层。2. 任何子项目的限制都不能超过父项目的限制。请确保在开始使用它之前,您部署的 Keystone 中的先前项目和限制结构不会破坏此模型。如果新创建的项目导致项目树深度大于 2,将引发 403 Forbidden 错误。当尝试使用此模型但项目深度已经超过 2 时,Keystone 进程将无法启动。操作员应选择另一个可用的模型来首先修复该问题。

  • [blueprint strict-two-level-model] 添加了 project_id 过滤器以列出限制。此过滤器仅用于系统范围请求,以获取指定的项目限制。非系统范围请求将获得空响应体。

  • [blueprint strict-two-level-model] 将 include_limits 过滤器添加到 GET /v3/projects/{project_id} API。此过滤器应与 parents_as_listsubtree_as_list 过滤器一起使用,以将父/子项目的限制信息添加到响应体中。

  • [bug 1779903] 当删除项目时,属于该项目的限制也将被删除。

升级说明

  • [bug 1778945] 可插拔的令牌提供程序接口已更改。如果您正在维护自定义令牌提供程序,您将受到这些接口更改的影响。在使用 Rocky 发布版本的 keystone 之前,需要实现新的接口。

  • Keystone不再通过paste.deploy加载,而是直接加载基于Flask的应用。如果部署依赖于入口点生成的wsgi文件,获取最新的文件非常重要。这些新文件有一些小的改动以支持新的加载机制。这些文件将通过PBR和setup自动生成。paste.ini文件现在将被忽略,但会保留在磁盘上直到Stein发布,以确保部署工具不会被无意中破坏。paste.ini文件将添加注释以表明它已被忽略。

  • 由于不再通过paste.deploy加载,因此不再可以从keystone依赖的pipeline中移除任何元素。这包括以前的扩展(S3, EC2)或中间件。如果必须禁用这些API,建议使用策略来拒绝访问。

  • 由于不再通过paste.deploy加载,因此不再可以直接将自定义中间件注入到pipeline中,建议如果需要 Keystone 依赖之外的自定义中间件,则包装整个堆栈。也可以通过智能代理层(例如HAProxy)更改/修改请求和响应。

  • 作为性能改进,基础映射驱动程序的方法get_domain_mapping_list现在接受一个可选的命名参数entity_type,可用于仅获取给定实体类型的映射。由于这个新的调用签名已经在identity.core模块中使用,因此期望自定义映射驱动程序的作者/维护者相应地更新其get_domain_mapping_list方法的实现。

  • 从您的keystone paste.ini文件中删除token_auth。如果未从paste ini文件中删除这些元素,在token_auth在Stein版本中被删除时,keystone将无法启动/运行。

  • Token提供程序API已从抽象接口中删除了needs_persistence属性。Token提供程序应根据需要处理持久性要求。这需要非树Token提供程序删除未使用的属性并处理Token存储。

  • Keystone现在依赖python-ldap而不是pyldap。pyldap库是python-ldap的一个已弃用的分支。从python-ldap 3.0版本开始,它已被合并并在那里维护。

弃用说明

  • 选项[token] infer_roles=False正在被弃用,以支持在Token验证期间始终扩展角色含义。 默认角色依赖于一系列隐含的角色分配,例如:管理员用户也将拥有读者和成员角色。因此,通过确保所有这些角色始终出现在Token验证响应中,我们可以提高策略文件的简单性和可读性。

  • keystone.middleware.core:TokenAuthMiddleware已被弃用,即将移除。

安全问题

  • 不再可以通过paste.ini文件将中间件注入到正在运行的keystone应用程序中。这减少了攻击面。虽然这并不是一个巨大的减少,但这是恶意代码可能被加载的又一个潜在位置。历史上,恶意中间件可以收集信息和/或修改来自Keystone的请求和响应。

错误修复

  • [bug 1703666] 通过确保目录只包含每个端点的一个定义,并且每个区域都列在该端点下,修复了模板v3目录的多区域支持。 以前,每个区域和端点都有自己的定义。

  • [bug 1728907] 在某些罕见情况下,可能会在fernet密钥存储库中创建一个空密钥文件。当keystone尝试从磁盘加载密钥时,它将因无效的fernet密钥ValueError而失败。 Keystone现在在加载和轮换密钥时处理空密钥文件。如果存在空文件,它将在加载时被忽略,在日志中报告为警告,并在轮换时被有效的密钥覆盖。

  • [bug 1746599] 修复了联合阴影用户的电子邮件设置,当规则在用户中包含电子邮件时。

  • [bug 1748970] 在Queens中引入了一个错误,导致在查询特定角色的角色分配API时返回系统角色分配。该问题已修复,从GET /v3/role_assignments?role.id={role_id}返回的角色列表尊重系统角色分配。

  • [bug 1749264] 用户删除时将删除其系统角色分配。

  • [bug 1749267] 组删除时将删除其系统角色分配。

  • [bug 1750415] 修复了应用程序凭据中的一个实现错误,应用程序凭据引用未填充在Token数据中,导致在禁用缓存时Token验证出现问题。

  • [bug 1751045] 现在可以清理不存在于身份后端中的组的角色分配。这与通过LDAP直接删除组而不是通过keystone的部署相关。

  • [bug 1753584] 修复了在使用列表中未找到的驱动程序时ImportError的格式。

  • [bug 1755874] 用户现在可以设置资源选项lock_password,这可以防止用户使用自助密码更改API。有效值为TrueFalse或“None”(其中None清除该选项)。

  • [bug 1756190] 当根据标签过滤项目时,过滤将通过匹配包含给定标签的子集与项目进行匹配,而不是完全匹配。在搜索时提供更多的标签将产生更精确的结果,而更少的标签将返回任何匹配给定标签但可能包含其他标签的项目。

  • [bug 1757022] 以前,keystone-manage mapping_purge --type {user,group}命令将错误地清除所有映射,而不是仅清除指定的类型映射。keystone-manage mapping_purge --type {user,group}现在按预期仅清除指定的类型映射。

  • [bug 1759289] keystone-manage token_flush命令不再建立到数据库或持久性后端的连接。如果使用受支持的非持久性Token格式,则应删除其用法。如果您依赖于将Token写入磁盘的外部Token提供程序并希望维护此功能,请考虑将其移植到单独的工具。

  • [bug 1760205] 删除联合用户时,相关的缓存信息未失效,导致Keystone在用以前的联合信息进行身份验证时引发404 UserNotFound错误。此错误已修复。

  • [bug 1760521] 修复了domain list的结果计数可能缺少一个,如果[resource]中的list_limit选项已设置。

  • [bug 1760809] 注册到域的身份提供程序将在删除域时被清理。

  • [bug 1763824] keystone.common.validation中的JSON Schema实现nullable现在如果存在枚举,则会将None添加到枚举中。

  • [bug 1765193] 统一的限制API现在通过GET /limits/model端点公开部署配置的执行模型。

  • [bug 1774229] Token管理的API参考现在包含不同Token范围的更具体示例。

  • [bug 1778109] 以前,trust作用域Token的Token数据可能包含重复的角色,当存在隐含的角色时。现在不再这样,为了准确性并防止破坏可能消耗此角色列表的应用程序。

  • [bug 1778945] 对Token提供程序API和接口进行了一些改进,简化了外部开发人员需要了解和理解的内容,以便提供他们自己的Token提供程序实现。请参阅链接的错误报告以获取更多详细信息,了解为什么进行这些更改以及它们为上游和下游开发人员带来的好处。

  • [bug 1780159] 创建项目时撤销role缓存。这消除了在用户继承了其上的角色时使其出现在列表中中的延迟。

  • [bug 1782704] 检查不存在的配置文件更加健壮,以确保在将配置信息传递给keystone-manage时向用户进行适当的记录。

  • [bug 1785164] 在域上设置资源限制明确不受支持。以前,可以设置域上的限制,并且响应将包含域ID作为限制的项目ID。此问题已通过明确使域退出限制支持来纠正。后续版本可能包含将域与限制资源关联的功能。

  • [bug 1754184] 统一的限制API已重构,以符合以下API-WG指南:1. POST统一限制不再在创建操作期间返回所有限制。现在它仅返回新创建的限制。2. 通过实现PATCH而不是PUT,删除了在单个请求中更新多个限制的支持。请注意,统一的限制API仍然是实验性的,因此可以包含这些改进。

其他说明

  • 添加了一个名为list_federated_users_info的新接口到shadow后端。它用于在内部获取shadow用户信息。如果您正在维护任何非树shadow后端,请为它们实现此函数。

  • [#openstack-tc IRC log] 经技术委员会一致同意,Keystone团队没有连接V2.0 API的残余部分,因为即使V2.0 API已完全弃用,控制器上也没有复制/粘贴直接弃用通知的失败。这不应该对任何用户产生有意义的影响,因为API(ec2token)具有v3等效项

  • 隐含角色API已被标记为稳定。该API最初是在Mitaka中实现的,并标记为实验性的。此后没有进行任何向后不兼容的更新。因此,该API正在被标记为稳定。

  • [blueprint removed-as-of-rocky] 删除了直接导入身份验证驱动程序的支持。如果您在配置中使用完整路径名进行身份验证方法,请更新您的配置以使用相应的命名空间。

  • [blueprint removed-as-of-rocky] 删除了对Token绑定操作的支持,这些操作由uuidpkipkizToken提供程序支持。此功能的支持在Pike中已弃用。