搜索

2.6. 其它更改

download PDF

2.6.1. 在 Admin API 和帐户上下文中更改用户表示

org.keycloak.representations.idm.UserRepresentation s.keycloak.representations.account.UserRepresentation representation 类都已更改,以便 root 用户属性(如用户名、电子邮件firstNamelastNamelocale)在获取或将表示有效负载发送到 Admin 和 Account API 时具有一致的表示。

用户名、mail、firstNamelastNamelocale 属性被移到一个新的 org.keycloak.representations.idm.AbstractUserRepresentation 基础类。

另外,getAttributes 方法只代表自定义属性,因此您不应该期望此方法返回的映射中的任何 root 属性。当为给定用户更新或获取任何自定义属性时,此方法主要针对客户端。

为了解析包括 root 属性的所有属性,添加了一个新的 getRawAttributes 方法,以便生成的映射也包含 root 属性。但是,此方法不能从表示有效负载中获得,它的目标是在管理用户配置文件时供服务器使用。

2.6.2. https-client-auth 是构建时间选项

选项 https-client-auth 已被视为运行时选项,但 Quarkus 不支持它。选项需要改为在构建时进行处理。

2.6.3. 后续载入离线会话和远程会话

从这个版本开始,红帽构建的 Keycloak 集群的第一个成员将按顺序加载远程会话,而不是并行加载。如果启用了离线会话预加载,它们也会按顺序加载。

之前的代码在启动时导致集群中资源消耗高,在生产环境中分析非常困难,并可能导致在加载过程中重启节点时出现复杂的故障场景。因此,它被改为后续会话加载。

对于离线会话,这个和之前版本的 Keycloak 默认是根据需要加载这些会话,与尝试并行加载它们相比,这个会话可以更好地扩展。使用此默认设置的设置不受加载策略更改离线会话的影响。启用离线会话预加载的设置应该迁移到禁用 offline-session 预加载的设置。

2.6.4. Infinispan 指标使用标签进行缓存管理器和缓存名称

当为 Keycloak 的嵌入式缓存启用指标时,指标现在使用缓存管理器的标签和缓存名称。

没有标签的旧指标示例

vendor_cache_manager_keycloak_cache_sessions_statistics_approximate_entries_in_memory{cache="sessions",node="..."}

带有标签的新指标示例

vendor_statistics_approximate_entries_in_memory{cache="sessions",cache_manager="keycloak",node="..."}

要恢复安装的更改,请使用自定义 Infinispan XML 配置并更改配置,如下所示:

<metrics names-as-tags="false" />

2.6.5. 用户属性值长度扩展

在这个版本中,Red Hat build of Keycloak 支持按用户属性值的存储和搜索,其比 255 个字符长,这之前是一个限制。

在允许用户更新属性(例如通过帐户控制台)设置中,请通过添加验证来防止拒绝服务攻击。确保不允许非受管属性,并且所有可编辑的属性都有限制输入长度的验证。

对于非受管属性,最大长度为 2048 个字符。对于受管属性,默认最大长度为 2048 个字符。管理员可以通过添加类型为 length 的验证器来更改。

警告

红帽构建的 Keycloak 会缓存其内部缓存中与用户相关的对象。使用较长的属性会增加缓存消耗的内存。因此,建议限制 length 属性的大小。考虑在红帽构建的 Keycloak 外部存储大型对象,并通过 ID 或 URL 引用它们。

此更改在表 USER_ATTRIBUTEFED_USER_ATTRIBUTE 上添加新的索引。如果这些表包含 300000 项,Red Hat build of Keycloak 会在自动模式迁移过程中默认跳过索引创建,而是在迁移过程中在控制台上记录 SQL 语句,以便在红帽构建 Keycloak 的启动后手动应用。有关如何配置不同的限制的详情,请参阅 升级指南

2.6.5.1. LDAP 的其他迁移步骤

这适用于与以下所有条件匹配的安装:

  • LDAP 目录中的用户属性大于 2048 个字符或大于 1500 字节的二进制属性。
  • 这些属性由管理员或用户通过管理控制台、API 或帐户控制台更改。

要通过 UI 和 REST API 启用更改这些属性,请执行以下步骤:

  1. 在域的用户配置文件中,声明上面识别的属性。
  2. 为上一步中添加的每个属性定义一个 长度 验证器,指定属性值所需的最小和最大长度。对于二进制值,将 33% 添加到预期的二进制长度中,以计算红帽构建的 Keycloak 内部 base64 编码的开销。

2.6.5.2. 自定义用户存储供应商的其他迁移步骤

这适用于与以下所有条件匹配的安装:

  • 将 MariaDB 或 MySQL 作为红帽构建的 Keycloak 的数据库运行。
  • FED_USER_ATTRIBUTE 中的条目,其内容在大于 2048 个字符的 VALUE 列中的内容。此表用于启用了联邦的自定义用户供应商。
  • 管理员或用户通过管理控制台或帐户控制台更改长属性。

要通过 UI 和 REST API 启用更改这些属性,请执行以下步骤:

  1. 在域的用户配置文件中,声明上面识别的属性。
  2. 为上一步中添加的每个属性定义一个 长度 验证器,指定属性值所需的最小和最大长度。

2.6.6. Admin send-verify-email API 现在使用相同的电子邮件验证模板

PUT /admin/realms/{realm}/users/{id}/send-verify-email

在本发行版本中,API 将使用 email-verification.ftl 模板,而不是 executeActions.ftl

在升级前

Perform the following action(s): Verify Email

升级后

Confirm validity of e-mail address email@example.org.

如果您自定义了 executeActions.ftl 模板,以修改用户如何使用此 API 验证其电子邮件,请确保将修改转移到新模板。

将引入一个名为 lifespan 的新参数,以允许覆盖默认的寿命值(12 小时)。

如果您更喜欢之前的行为,请使用 execute-actions-email API,如下所示:

PUT /admin/realms/{realm}/users/{id}/execute-actions-email

["VERIFY_EMAIL"]

2.6.7. 更改密码哈希

在本发行版本中,我们调整了密码散列默认为与密码 存储 的 OWASP 建议 匹配。

作为此更改的一部分,默认密码散列提供程序已从 pbkdf2-sha256 改为 pbkdf2-sha512。另外,基于 pbkdf2 的密码哈希算法的默认哈希迭代数量更改,如下所示:

供应商 IDalgorithm旧迭代新的迭代

pbkdf2

PBKDF2WithHmacSHA1

20.000

1.300.000

pbkdf2-sha256

PBKDF2WithHmacSHA256

27.500

600.000

pbkdf2-sha512

PBKDF2WithHmacSHA512

30.000

210.000

如果域没有使用 hashAlgorithmhashIterations 明确配置密码策略,则新配置将根据登录或创建或更新用户密码时生效。

2.6.7.1. 新密码哈希配置的性能

在具有 Intel i9-8950HK CPU (12)@ 4.800GHz)的机器上测试,对于哈希 1000 密码(averages from 3 run)会产生以下 DESTINATION 时间差异。请注意,PBKDF2WithHmacSHA1 的平均持续时间是因为长时间运行时而计算较低密码的数量。

供应商 IDalgorithm旧持续时间新持续时间区别

pbkdf2

PBKDF2WithHmacSHA1

122ms

3.114ms

+2.992ms

pbkdf2-sha256

PBKDF2WithHmacSHA256

20ms

451ms

+431ms

pbkdf2-sha512

PBKDF2WithHmacSHA512

33ms

224ms

+191ms

pbkdf2 供应商的用户可能需要显式减少哈希迭代的数量,才能重新获得可接受的性能。这可以通过在域的密码策略中明确配置哈希迭代来实现。

2.6.7.2. 预期增加整个 CPU 用量和临时增加的数据库活动

我们的测试中每个基于密码的登录的 CPU 使用率增加了五个因素,其中包括更改的密码哈希和未更改的 TLS 连接处理。由于红帽构建的 Keycloak 的其他活动(如刷新访问令牌和客户端凭证授予),整个 CPU 整体 CPU 的增加应达到两到三的因素。这仍然取决于安装的唯一工作负载。

升级后,在基于密码的登录时,用户的密码将使用新的哈希算法和哈希迭代作为一次性活动,并在数据库中更新。由于这会从红帽构建的 Keycloak 内部缓存中清除用户,因此您还会在数据库级别看到增加的读取活动。随着更多用户的密码被重新哈希,这会缩短数据库活动。

2.6.7.3. 如何继续使用旧的 pbkdf2-sha256 密码散列?

要为域保留旧的密码哈希,请在 realm 密码策略中明确指定 hashAlgorithmhashIterations

  • 散列算法:pbkdf2-sha256
  • 哈希迭代:27500

2.6.8. 重命名用于迁移的 JPA 供应商配置选项

删除 Map Store 后,会重命名以下配置选项:

  • spi-connections-jpa-legacy-initialize-empty to spi-connections-jpa-quarkus-initialize-empty
  • spi-connections-jpa-legacy-migration-export to spi-connections-jpa-quarkus-migration-export
  • spi-connections-jpa-legacy-migration-strategy to spi-connections-jpa-quarkus-migration-strategy

2.6.9. 使用 event 替换临时锁定日志

现在,当用户被 brute 强制保护程序暂时锁定时,新的事件 USER_DISABLED_BY_TEMPORARY_LOCKOUT。ID KC-SERVICES0053 的日志已被删除,因为新事件以结构化的形式提供信息。

由于它是成功事件,新事件默认记录在 DEBUG 级别。使用设置 spi-events-listener-jboss-logging-success-level,如 Server Administration Guide 中的 Event listener 章节 所述,来更改所有成功事件的日志级别。

要触发自定义操作或自定义日志条目,请编写自定义事件监听程序,如 Server Developer Guide 中的 Event Listener SPI 所述。

2.6.10. Keycloak JS 导入可能需要更新

如果您要直接从红帽构建的 Keycloak JS 加载 Keycloak JS,则可以安全地忽略本节。如果您要从 NPM 软件包加载 Keycloak JS,并使用如 Webpack、Vite 等捆绑包程序,您可能需要对代码进行一些更改。Keycloak JS 软件包现在使用 package.json 文件中的 exports 字段。这意味着您可能需要更改导入:

// Before
import Keycloak from 'keycloak-js/dist/keycloak.js';
import AuthZ from 'keycloak-js/dist/keycloak-authz.js';

// After
import Keycloak from 'keycloak-js';
import AuthZ from 'keycloak-js/authz';

2.6.11. 内部算法从 HS256 改为 HS512

红帽构建的 Keycloak 用来为内部令牌签名(由红帽构建的 Keycloak 本身使用的 JWT,如刷新或操作令牌)已从 HS256 改为更安全的 HS512。现在为域添加了名为 hmac-generated-hs512 的新密钥提供程序。请注意,在迁移的域中,旧的 hmac-generated 供应商和旧的 HS256 密钥会被维护,并仍然验证升级前发布的令牌。当不存在更多旧令牌时,可以手动删除 HS256 提供程序。https://docs.redhat.com/en/documentation/red_hat_build_of_keycloak/24.0/html-single/server_administration_guide/#rotating-keys

2.6.12. 在容器中运行时的不同 JVM 内存设置

在容器中运行时,JVM 选项 -Xms-Xmx-XX:InitialRAMPercentage-XX:MaxRAMPercentage 替代。红帽构建的 Keycloak 而不是静态最大堆大小设置,指定容器内存总量的 70%。

由于堆大小根据容器内存总量动态计算,您应该始终为容器设置内存限值

警告

如果没有设置内存限制,则内存消耗会快速增加,因为最大堆大小将容器内存总量增长到 70%。

如需了解更多详细信息,请参阅 指定不同的内存设置

2.6.13. 在 OAuth 2.0/OpenID Connect Authentication Response 中添加是参数

RFC 9207 OAuth 2.0 Authorization Server Issuer Identification 规格添加 该参数 在 OAuth 2.0/OpenID Connect Authentication Response 中用于实现安全授权响应。

在过去的版本中,我们没有这个参数,但现在红帽构建的 Keycloak 会默认添加这个参数。

但是,一些 OpenID Connect / OAuth2 适配器,特别是较旧的红帽构建的 Keycloak 适配器,这个新参数可能会出现问题。

例如,参数在成功向客户端应用程序进行身份验证后始终存在于浏览器 URL 中。在这些情况下,禁用向身份验证响应添加 iss 参数可能很有用。这可以为红帽构建的 Keycloak 管理控制台中的特定客户端完成,在带有 OpenID Connect Compatibility Modes 的小节中的客户端详情中,如 第 4.1 节 “与旧适配器兼容” 所述。专用 Exclude Issuer From Authentication Response 开关存在,可以打开以防止将 iss 参数添加到身份验证响应中。

2.6.14. 通配符字符处理

JPA 在搜索时允许通配符 %_,而 LDAP 等其他供应商只允许 X。因为 * 是 LDAP 中的自然通配符字符,它在所有位置工作,而 JPA 则仅在搜索字符串的开头和结尾工作。从这个版本开始,唯一的通配符字符是 *,它在搜索字符串中的所有位置都一致地工作。对于 JPA,特定供应商(如 %_ )中的所有特殊字符都会被转义。对于确切搜索,带有添加的引号,如 "w*ord",行为与之前版本中的行为相同。

2.6.15. 由 realm 和 client 角色映射的声明的值格式更改

在此版本之前,域(User Realm Role)和客户端(User Client Role)协议映射器在禁用 Multivalued 设置时映射了一个字符串fied JSON 数组。

但是,Multivalued 设置指示声明应映射为列表,如果禁用,则只有来自相同值列表中的单个值。

在这个发行版本中,当角色和客户端映射器标记为单值时,角色和客户端映射器现在从用户的有效角色映射到单个值(多值 禁用)。

2.6.16. 在登录 UI 中更改密码字段

在这个版本中,我们需要引入隐藏/显示密码输入的切换。

受影响的页面:

  • login.ftl
  • login-password.ftl
  • login-update-password.ftl
  • register.ftl
  • register-user-profile.ftl

一般情况下,所有 <input type="password" name="password" /& gt; 现在被封装在一个 div 中。input 元素后跟一个按钮,用于切换密码输入的可见性。

旧代码示例:

<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>

新代码示例:

<div class="${properties.kcInputGroup!}">
    <input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
    <button class="pf-c-button pf-m-control" type="button" aria-label="${msg('showPassword')}"
            aria-controls="password" data-password-toggle
            data-label-show="${msg('showPassword')}" data-label-hide="${msg('hidePassword')}">
        <i class="fa fa-eye" aria-hidden="true"></i>
    </button>
</div>

2.6.17. kc.sh 和 shell metacharacters

kc.sh 不再使用额外的 shell 评估参数,环境变量 JAVA_OPTS_APPEND 和 JAVA_ADD_OPENS,因此继续使用双转义/仲裁将导致参数被误解。例如,而不是

bin/kc.sh start --db postgres --db-username keycloak --db-url "\"jdbc:postgresql://localhost:5432/keycloak?ssl=false&connectTimeout=30\"" --db-password keycloak --hostname localhost

使用单个转义:

bin/kc.sh start --db postgres --db-username keycloak --db-url "jdbc:postgresql://localhost:5432/keycloak?ssl=false&connectTimeout=30" --db-password keycloak --hostname localhost

此更改还意味着您无法使用带带所有参数的单个值来调用 kc.sh。例如,您无法再使用

bin/kc.sh "start --help"

它必须是单独的参数

bin/kc.sh start --help

同样地而不是,

bin/kc.sh build "--db postgres"

它必须是单独的参数

bin/kc.sh build --db postgres

Dockerfile 运行命令中还需要使用各个参数。

2.6.18. GroupProvider 更改

添加了一个新的方法,以允许通过顶级组搜索和分页。如果您实现这个接口,则需要使用以下方法:

Stream<GroupModel> getTopLevelGroupsStream(RealmModel realm,
                                           String search,
                                           Boolean exact,
                                           Integer firstResult,
                                           Integer maxResults)

2.6.19. GroupRepresentation 更改

  • 添加了新字段 subGroupCount,以告知客户端在任何给定组中有多少个子组
  • 现在,sub groups 列表只会填充在请求层次结构数据的查询中
  • 此字段填充自"bottom up",因此无法依赖它来获取组的所有子组。使用 GroupProvider 或从 GET {keycloak server}/realms/{realm}/groups/{group_id}/children中请求子组

2.6.20. Group Admin API 的新端点

端点 GET {keycloak server}/realms/{realm}/groups/{group_id}/children 添加为获取支持分页的特定组的子组的方法

2.6.21. RESTEeasy Reactive

依赖 RESTEasy Classic 不再是一个选项,因为它不再可用。依赖于 RESTEasy Classic 和相关软件包部分的 SPI 和相关软件包部分需要迁移。

2.6.22. 部分导出需要 manage-realm 权限

端点 POST {keycloak server}/realms/{realm}/partial-export 和 admin 控制台中的对应操作现在需要 manage-realm 权限才能执行,而不是 view-realm。此端点将 realm 配置导出到 JSON 文件中,新权限更为合适。参数 exportGroupsAndRolesexportClients 分别在导出中包含 realm groups/roles 和 clients,继续管理相同的权限(query-groupsview-clients)。

2.6.23. 客户端的有效重定向 URI 始终与精确字符串匹配进行比较

在将重定向 URI 与客户端指定有效重定向进行比较时,1.8.0 为主机名和方案引入了小写。不幸的是,它并不在所有协议中完全工作,例如,主机对于 http 来说较低,但不适用于 https。因为 OAuth 2.0 安全最佳实践 建议使用准确字符串匹配比较 URI,Red Hat build of Keycloak 遵循建议,且在有效重定向中会按照具体情况进行比较,即使主机名和方案也是如此。

对于依赖于旧行为的域,其客户端的有效重定向 URI 现在应该保存服务器应识别的每个 URI 的独立条目。

虽然它在配置客户端时引入了更多步骤和详细程度,但新行为可以启用更安全的部署,因为基于模式的检查经常造成安全问题。不仅是由于它们的实施方式,也只是配置它们的方式。

2.6.24. 修复对 Groups.getSubGroups briefRepresentation 参数的处理

版本 23.0.0 在 Groups 资源上引入了一个新的端点 getSubGroups ("children"),其中参数 briefRepresentation 表示检索子组的完整表示。现在,这个含义已被修改来返回简短表示。

2.6.25. jboss-logging 事件消息中的更改

jboss-logging 消息值现已加引号(默认为 " 字符"),而 sanitized 以防止任何换行符。供应商中有两个新选项(spi-events-listener-jboss-logging-sanitizespi-events-listener-jboss-logging-quotes),允许您自定义新行为。例如,为了避免清理和引用,可以以这种方式启动服务器:

./kc.sh start --spi-events-listener-jboss-logging-sanitize=false --spi-events-listener-jboss-logging-quotes=none ...

有关选项的更多信息,请参阅 所有供应商配置

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.