升级指南
第 1 章 升级 Red Hat build of Keycloak 复制链接链接已复制到粘贴板!
本指南论述了如何将 Keycloak 的红帽构建从 24.0.x 升级到 26.0.15 版本。按照以下顺序执行以下步骤:
- 查看之前红帽构建的 Keycloak 版本中的特定于发行版本的更改。
- 升级 Red Hat build of Keycloak 服务器。
- 升级 Red Hat build of Keycloak 适配器。
- 升级 Red Hat build of Keycloak Admin Client。
如果要从红帽构建的 Keycloak 22.x 升级升级,请查看 版本 24.0 升级指南中的所有更改。然后,您可以执行本指南中描述的升级步骤。
对于 Red Hat Single Sign-On 7.6 客户,请使用 迁移指南 而不是本指南。
第 2 章 特定于发行版本的更改 复制链接链接已复制到粘贴板!
2.1. 服务器配置更改 复制链接链接已复制到粘贴板!
2.1.1. 新主机名选项 复制链接链接已复制到粘贴板!
默认支持主机名 v2 选项,因为旧的主机名选项已被移除。
所需迁移列表:
| 旧选项 | 新选项 |
|---|---|
|
|
|
|
|
|
|
|
|
正如您所见,为主机名和 后缀。选项 hostname -admin 选项删除了 *- urlhostname 接受主机名和 URL,但 hostname-admin 现在只接受完整的 URL。
另外,无法单独设置 路径 或端口。您可以通过为主机名和 选项提供完整的 URL 来达到此目的。
hostname -admin
如果端口不是 URL 的一部分,它将从传入的请求标头动态解析。
HTTPS 不再强制执行,除非它是主机名和 URL 的一部分。如果没有指定,则使用协议(hostname -adminhttp/https)会从传入请求动态解析。hostname-strict-https 选项已被删除。
| 删除的选项 |
|---|
|
|
|
|
|
|
|
|
|
|
|
|
2.1.1.1. 例子 复制链接链接已复制到粘贴板!
简化表示法
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --https-port=8543 --hostname-path=/auth --hostname-strict-https=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=https://mykeycloak.org:8543/auth
正如您在示例中所看到的那样,现在可以使用单个 hostname 选项指定 URL 的所有部分,这简化了主机名设置过程。请注意,在 hostname-strict-https 选项中不会强制 HTTPS,而是在主机名 URL 中指定它。
Backchannel 设置
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-strict-backchannel=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-backchannel-dynamic=false
请注意,如果相同的 URL 用于后端和前端端点,则行为有变化。在以前的版本中,在主机名 v1 中,回溯通道 URL 从请求标头动态解析。因此,要实现所需的结果,您必须指定 hostname-strict-backchannel=true。
对于主机名 v2,后端通道 URL 必须与 frontend URL 相同。要从请求标头动态解析它,您需要设置 hostname-backchannel-dynamic=true,并为 hostname 选项提供完整的 URL。
如需了解更多详细信息和更全面的场景,请参阅配置主机名(v2)。
2.1.2. kcadm 和 kcreg 更改 复制链接链接已复制到粘贴板!
kcadm 和 kcreg 解析和处理选项和参数是如何改变的。来自使用错误(错误的选项或参数)的错误消息可能与之前的版本稍有不同。另外,使用错误时,退出代码为 2,而不是 1。
2.1.3. 在组路径中转义斜杠 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 没有在组路径中被转义的斜杠。因此,名为 top 的 group/slash 子组使用完整路径 /top/group/slash,这清楚误导。从这个版本开始,可以启动服务器以在名称中执行这些斜杠的转义:
bin/kc.[sh|bat] start --spi-group-jpa-escape-slashes-in-group-path=true
转义字符是波形符 ~。前面的示例生成路径 /top/group~/slash。转义将最后一个斜杠标记为名称的一部分,而不是层次结构分隔符。
默认情况下禁用转义,因为它代表了行为的更改。建议使用转义功能,但未来版本可能会成为默认设置。
2.1.4. --import-realm 选项可以导入 master 域 复制链接链接已复制到粘贴板!
在 master 域存在前使用-- import-realm 选项运行 start 或 start-dev 命令时,如果导入材料中存在,则会导入它。之前的行为是首先创建 master 域,然后其导入跳过。
2.1.5. 优化的 启动选项上的额外验证 复制链接链接已复制到粘贴板!
优化的 启动选项现在需要首先构建优化的服务器镜像。这可以通过先运行 kc.sh|bat build 或通过任何其他服务器命令( 如启动、导出、导入)来实现。
2.1.6. 在运行时指定 缓存 选项 复制链接链接已复制到粘贴板!
选项 , 和 cache -stackcache-config-file 不再是构建选项,它们只能在运行时指定。这消除了执行构建阶段的需要,并因镜像而重建镜像。请注意,在构建阶段不会识别它们,因此您需要将它们从构建阶段删除,并将它们添加到 运行时 阶段。 如果您没有将当前缓存选项添加到 运行时 阶段,红帽构建的 Keycloak 将回退到默认的缓存设置。
2.1.7. 在消耗 HTTP 响应时限制内存用量 复制链接链接已复制到粘贴板!
在某些情况下,红帽构建的 Keycloak 使用 HTTP 与外部服务器进行通信。为了避免当那些供应商发送太多数据时拒绝服务,Red Hat build Keycloak 现在默认将响应限制为 10 MB。
用户可以通过设置供应商配置选项 spi-connections-http-client-default-max-consumed-response-size 来配置这个限制:
将消耗的响应限制为 1 MB
bin/kc.[sh|bat] --spi-connections-http-client-default-max-consumed-response-size=1000000
2.1.8. kc.sh/bat import placeholder replacement 复制链接链接已复制到粘贴板!
kc.[sh|bat] import 命令现在启用了占位符替换。在以前的版本中,在启动时只对域导入启用占位符替换。
如果要禁用 import 命令的占位符替换,请添加系统属性 -Dkeycloak.migration.replace-placeholders=false
2.2. 主机名验证策略 复制链接链接已复制到粘贴板!
spi-truststore-file-hostname-verification-policy 和新的 tls-hostname-verifier 选项的默认值现在是 DEFAULT,而不是 WILDCARD。WILDCARD 和 STRICT 选项值已弃用。您应该只依赖 DEFAULT。
由 WILDCARD 支持的行为,它不受 DEFAULT: * 不支持的行为,允许子域名称中的通配符匹配任何匹配,包括多个级别(如 a.b.foo.com)。* 允许与众所周知的公共后缀匹配 - 例如: foo.co.gl 可能与 5.2.co.gl 匹配
STRICT 支持的行为,它不被 DEFAULT 支持:在确定通配符是否匹配时,为 2 或 3 字母域名使用小的排除列表(以 2 个字母级别(*.XXX.YY)结尾)。相反,DEFAULT 使用更完整的公共后缀规则列表 https://publicsuffix.org/list/
预计您不应该依赖来自 WILDCARD 或 STRICT 选项的行为。
2.3. 持久性用户会话 复制链接链接已复制到粘贴板!
新功能 persistent-user-sessions 将在线用户会话和在线客户端会话存储在数据库中。即使红帽构建的 Keycloak 的所有实例都已重启或升级,这个更改也允许用户保持登录。
以前的红帽构建的 Keycloak 版本只会在数据库中存储离线用户和离线客户端会话。这个行为与以前的红帽构建的 Keycloak 版本相同。
迁移到此版本时,所有现有的在线用户会话和在线客户端会话都会被清除,用户将被注销。离线用户会话和离线客户端会话不会受到影响。
2.3.1. 启用持久的用户会话 复制链接链接已复制到粘贴板!
在 Red Hat build of Keycloak 26 中,所有用户会话都默认保留在数据库中。通过禁用该功能,可以将此行为恢复到以前的状态。配置分布式缓存 指南中的 Volatile 用户会话 流程。
启用持久会话后,在线用户会话、离线用户会话、在线客户端会话和离线客户端会话的内存缓存会默认限制为每个节点 10000 个条目,这会减少 Keycloak 用于大型安装的总内存用量。根据需要,从内存驱除的项目将从数据库按需加载。启用这个功能后,预期会减少内存用量以及每次登录时数据库利用率增加,注销和刷新令牌请求。
要在红帽构建的 Keycloak 多站点设置中配置外部 Data Grid 中的缓存大小,请参阅使用 Data Grid Operator 部署 HA。
启用此功能后,选项 spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override 和 spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override 不再可用,因为它们之前用来覆盖离线会话已保持在内存中。
2.3.2. 签署现有用户 复制链接链接已复制到粘贴板!
要在启用了 persistent-user-sessions 时注销一个域的所有在线用户会话,请执行以下步骤:
- 登录管理控制台。
- 选择菜单条目 会话。
- 选择操作 Sign out all active sessions。
2.3.3. 限制会话缓存的大小 复制链接链接已复制到粘贴板!
由于数据库现在是用户会话的真实来源,因此可以限制会话缓存的大小来减少内存用量。如果您使用默认的 conf/cache-ispn.xml 文件,则存储用户和客户端会话的缓存默认配置为仅存储 10000 会话和每个条目的一个所有者。
使用选项 cache-embedded-sessions-max-count, cache-embedded-client-sessions-max-count , 和 cache- embedded-offline-sessions-max-countcache-embedded-offline-client-sessions-max-count 来更新缓存的大小。
有关更新的资源要求的详情,请参阅 调整 CPU 和内存资源概念。
2.4. 指标和健康端点 复制链接链接已复制到粘贴板!
2.4.1. 默认启用嵌入式缓存的指标 复制链接链接已复制到粘贴板!
现在默认启用嵌入式缓存的指标。要为延迟启用直方图,请将 cache-metrics-histograms-enabled 选项设置为 true。
2.4.2. 默认启用 HTTP 端点的指标 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 提供的指标现在包含以 http_server 开始的 HTTP 服务器指标。有关一些示例,请参见以下信息。
http_server_active_requests 1.0
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 1.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 0.048717142
使用新的选项 http-metrics-histograms-enabled 和 http-metrics-slos 启用默认的直方存储桶或特定存储桶以实现服务级别目标(SLO)。参阅 Prometheus 文档中的有关直方图的更多信息,了解如何使用 http_server_requests_seconds_bucket 中提供的额外指标系列。
2.4.3. 指标和健康端点的管理端口 复制链接链接已复制到粘贴板!
管理端口 9000 上可以访问 /health 和 /metrics 端点,该端点默认开启。这意味着这些端点不再公开给红帽构建 Keycloak 端口 8080 和 8443。
要反映旧行为,请使用 property --legacy-observability-interface=true,这不会在管理端口上公开这些端点。但是,此属性已弃用,并将在以后的发行版本中删除,因此不建议使用它。
管理接口使用与默认红帽构建的 Keycloak HTTP 服务器不同的 HTTP 服务器,并可单独配置它们。请注意,如果没有为管理界面属性提供值,则会从 Keycloak HTTP 服务器的默认红帽构建中继承它们。
如需了解更多详细信息 ,请参阅配置管理界面。
2.5. XA 更改 复制链接链接已复制到粘贴板!
2.5.1. XA Transaction change 复制链接链接已复制到粘贴板!
-
选项
transaction-xa-enabled将默认为 false,而不是 true。如果您希望 XA 事务支持,则需要将这个选项明确设置为 true。 -
如果
transaction-xa-enabled为 true,则默认启用 XA Transaction 恢复支持。事务日志将存储在 KEYCLOAK_HOME/data/transaction-logs 中。
2.5.2. 现在,额外的数据源需要使用 XA 复制链接链接已复制到粘贴板!
默认情况下,Red Hat build of Keycloak 不使用 XA 数据源。但是,当使用多个数据源时,这被视为不安全。从这个版本开始,如果您在红帽构建的 Keycloak 中添加额外的数据源,则需要使用 XA datasources。如果默认数据源支持 XA,您可以通过设置 --transaction-xa-enabled=true 选项来实现。对于额外的数据源,您需要在 quarkus.properties 文件中使用 quarkus.datasource.<your-datasource-name>.jdbc.transactions=xa 选项。最多一个数据源可以是非 XA。如果没有用于事务存储的持久性存储,不支持恢复。
2.6. Operator 更改 复制链接链接已复制到粘贴板!
2.6.1. Operator 不再默认为 proxy=passthrough 复制链接链接已复制到粘贴板!
proxy 选项已从服务器中删除。
2.6.2. Operator 调度默认值 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak Pod 现在具有默认的关联性,以防止将同一 CR 的多个实例部署到同一节点上,并且来自同一 CR 的所有 Pod 都更喜欢在同一区中,以防止扩展缓存集群。
2.6.3. Operator 的默认 CPU 和内存限值/请求 复制链接链接已复制到粘贴板!
为了遵循最佳实践,引入了 Operator 的默认 CPU 和内存限值/请求。它会影响非 OLM 和 OLM 安装。要覆盖 OLM 安装的默认值,请编辑 operator 订阅中的 resources 部分。https://github.com/operator-framework/operator-lifecycle-manager/blob/master/doc/design/subscription-config.md#resources
2.7. API 更改 复制链接链接已复制到粘贴板!
2.7.1. ClusterProvider API 中的新方法 复制链接链接已复制到粘贴板!
此方法被添加到 org.keycloak.cluster.ClusterProvider 中:
-
void notify (String taskKey, Collection<? extends ClusterEvent> events, boolean ignoreSender, DCNotify dcNotify)
当多个事件发送到同一 taskKey 时,此方法批处理事件仅执行单个网络调用。这是用于减少流量和网络相关资源的优化。
在 Red Hat build of Keycloak 26 中,新方法具有默认的实现,以保持与自定义实现的向后兼容性。默认实现会为每个事件执行单个网络调用,它将在以后的 Keycloak 版本中删除。
2.7.2. 新的 Java API 以按名称搜索域 复制链接链接已复制到粘贴板!
RealmProvider Java API 现在包含一个新的方法 Stream<RealmModel> getRealmsStream (String search),它允许按名称搜索域。虽然从提供程序加载后会过滤流的默认实现,但建议实现它,以便进行更有效的实施。
2.8. 事件更改 复制链接链接已复制到粘贴板!
2.9. Keycloak JS 复制链接链接已复制到粘贴板!
此发行版本包括对 Keycloak JS 库的几个更改,应考虑这些库。这些更改的主要动机是把红帽构建的 Keycloak 服务器的库分离在一起,因此可以独立重构,从而简化代码并在以后维护。更改如下:
2.9.1. 这个程序库不再从服务器静态提供 复制链接链接已复制到粘贴板!
Keycloak JS 库不再由红帽构建的 Keycloak 服务器静态提供。这意味着以下 URL 不再可用:
-
/js/keycloak-authz.js -
/js/keycloak-authz.min.js -
/js/keycloak.js -
/js/keycloak.min.js -
/js/{version}/keycloak-authz.js -
/js/{version}/keycloak-authz.min.js -
/js/{version}/keycloak.js -
/js/{version}/keycloak.min.js
另外,链接到这些 URL 上库的 keycloakJsUrl 属性已从 Admin Console 主题中删除。如果您的自定义主题使用此属性包含库,您应该更新主题以使用不同的方法包含库。
现在,您应该使用软件包管理器(如 NPM )在项目中包含该库。该程序库在 NPM 注册表上作为 keycloak-js 提供。您可以使用以下命令安装它:
npm install keycloak-js
或者,服务器的分发还包括 keycloak-js-26.0.0.tgz 存档中的库副本。您可以将库从那里复制到您的项目。如果您在没有构建的情况下直接在浏览器中使用库,则需要自己托管该库。软件包管理器仍然是建议将库包含在项目中,因为它将在以后更轻松地更新库。
2.9.2. 现在,需要 Keycloak 实例配置 复制链接链接已复制到粘贴板!
在以前的版本中,可以在不传递任何配置的情况下构建 Keycloak 实例。然后,根据包含的 keycloak.js 脚本的路径,从 keycloak.json 文件中自动从服务器加载配置。因为库不再从服务器静态提供,所以这个功能已被删除。现在,在构造 Keycloak 实例时需要显式传递配置:
// Before
const keycloak = new Keycloak();
// After
const keycloak = new Keycloak({
url: "http://keycloak-server",
realm: "my-realm",
clientId: "my-app"
});
// Alternatively, you can pass a URL to a `keycloak.json` file.
// Note this is not reccomended as it creates additional network requests, and is prone to change in the future.
const keycloak = new Keycloak('http://keycloak-server/path/to/keycloak.json');
2.9.3. 现在,登录的方法是 async 复制链接链接已复制到粘贴板!
Keycloak JS 现在使用 Web Crypto API 来计算支持 PKCE 所需的 SHA-256 摘要。由于此 API 的异步性质,以下公共方法现在始终返回 Promise :
-
login() -
createLoginUrl() -
createRegisterUrl()
确保将代码更新为 等待 这些方法:
// Before
keycloak.login();
const loginUrl = keycloak.createLoginUrl();
const registerUrl = keycloak.createRegisterUrl();
// After
await keycloak.login();
const loginUrl = await keycloak.createLoginUrl();
const registerUrl = await keycloak.createRegisterUrl();
确保将您的代码更新为 等待 这些方法。
2.9.4. build-time 选项的更严格的启动行为 复制链接链接已复制到粘贴板!
当提供的构建时选项在启动时与在最近优化的 Keycloak 构建过程中在服务器镜像中保留的值不同时,红帽构建的 Keycloak 现在将无法启动。在以前的版本中,在这种情况下会显示警告信息。
2.9.5. 新的默认客户端范围 基本 复制链接链接已复制到粘贴板!
名为 basic 的新客户端范围被添加为 realm "default" 客户端范围,因此将添加到所有新创建的客户端。客户端范围还在迁移过程中自动添加到所有现有客户端。
此范围包含以下声明的预配置的协议映射器:
-
sub(请参阅以下在专用部分的详细信息) -
auth_time
这提供了额外的帮助来减少轻量级访问令牌中的声明数量,但也有机会配置始终自动添加的声明。
2.9.5.1. 将 子 声明添加到通过协议映射器访问令牌中 复制链接链接已复制到粘贴板!
现在,子 声明总是添加到访问令牌中,但使用新的 Subject (sub) 协议映射程序。
主题(sub) 映射程序在基本客户端 范围内 默认配置。因此,升级到这个版本后不需要额外的配置。
如果您使用 Pairwise 主题标识符 映射访问令牌的 子 声明,您可以考虑禁用或删除 Subject (sub) 映射器,但并不严格要求它,因为 Subject (sub) 协议映射程序会被执行,因此 pairwise 值将覆盖 Subject (sub) 映射器添加的值。这也适用于覆盖 子 声明的其他自定义协议映射器实施,因为 主题(sub)映射器 目前作为第一个协议映射器执行。
您可以使用 Subject (sub) 映射器来仅针对访问令牌、轻量级访问令牌和内省响应配置 子 声明。IDToken 和 Userinfo 始终包含 子 声明。
映射器对服务帐户没有影响,因为不存在用户会话,并且始终将 子 声明添加到访问令牌中。
2.9.5.2. 非声明只添加到 ID 令牌中 复制链接链接已复制到粘贴板!
nonce 声明现在只添加到 ID 令牌中,严格遵循 OpenID Connect Core 1.0 规格。如规范中所示,当授权请求中发送了相同的参数时,声明会在 ID 令牌 内编译。该规范还建议在 刷新请求 后添加非。在以前的版本中,声明被设置为所有响应(刷新包括)中的所有令牌(Access、Refresh 和 ID)。
软件中也包含一个新的 Nonce 后向兼容 映射器,这些映射程序可以分配给客户端范围以恢复到旧行为。例如,JS 适配器在修复版本 24.0.0 中的问题 #26651 前检查所有令牌返回的 非ce 声明。因此,如果使用 JS 适配器的旧版本,则映射程序应该使用客户端范围添加到所需的客户端。
2.9.5.3. 使用旧的 javascript 适配器 复制链接链接已复制到粘贴板!
如果您使用带有应用程序中 javascript 适配器的较旧版本的 Keycloak 服务器的最新红帽构建,则您可能受上述的令牌更改的影响,如以前的 javascript 适配器版本依赖该声明,这些声明被红帽构建的 Keycloak 添加,但不受 OIDC 规格的支持。这包括:
-
在使用 Red Hat build of Keycloak Javascript adapter 24.0.3 或更早版本时,添加
Session State (session_state)映射程序 -
当使用红帽构建的 Keycloak Javascript 适配器比红帽构建的 Keycloak 24 构建的时,请添加
Nonce 后向兼容映射程序
您可以将协议映射程序直接添加到对应的客户端或某些客户端范围中,客户端应用程序可以依赖红帽构建的 Keycloak Javascript 适配器的旧版本。前面几节中提供了一些更多详细信息,专用于 session_state 和 nonce 声明。
2.10. 身份提供程序更改 复制链接链接已复制到粘贴板!
2.10.1. 在域表示中不再提供身份提供程序 复制链接链接已复制到粘贴板!
在具有许多身份提供程序时,作为域和机构可扩展性的改进的一部分,域表示不再包含身份提供程序列表。但是,在导出域时,它们仍然可从 realm 表示中可用。
要获取域中身份提供程序的查询,首选使用 /realms/{realm}/identity-provider/instances 端点。此端点支持过滤器和分页。
2.10.2. 改进选择身份提供程序的性能 复制链接链接已复制到粘贴板!
在 IDENTITY_PROVIDER 表中添加了新的索引,以改进获取与某个机构关联的 IDP 的查询性能,以及获取可用于登录的 IDP ( 启用,而不是 link_only,没有标记为 hide_on_login)。
如果表目前包含 300,000 个条目,红帽构建的 Keycloak 将在自动模式迁移过程中默认跳过创建索引,而是在迁移过程中记录控制台上的 SQL 语句。在这种情况下,在红帽构建 Keycloak 后,必须在 DB 中手动运行语句。
另外,kc.org 和 hideOnLoginPage 配置属性已迁移到身份提供程序本身,以便在搜索供应商时更有效地查询。因此,API 客户端应使用 getOrganizationId/setOrganizationId 和 isHideOnLogin/setHideOnLogin 方法,并避免使用现已弃用的旧配置属性设置这些属性。
2.11. 其他更改 复制链接链接已复制到粘贴板!
2.11.1. Argon2 密码哈希 复制链接链接已复制到粘贴板!
Argon2 现在是红帽在非FIPS 环境中构建 Keycloak 的默认密码哈希算法。
Argon2 是 2015 密码散列竞争者,是 OWASP 的建议哈希算法。
在 Red Hat build of Keycloak 24 中,PBKDF2 的默认哈希迭代从 27.5K 增加到 210K,从而导致生成密码哈希所需的 CPU 时间量增加 10 倍。使用 Argon2,您可以实现更高的安全性,与以前的红帽构建的 Keycloak 版本几乎相同。一个缺点是 Argon2 需要更多内存,这是防止 GPU 攻击的要求。红帽构建的 Keycloak 中 Argon2 的默认值需要每个哈希请求 7MB。
为防止过量内存和 CPU 使用量,Argon2 的并行计算默认限制为 JVM 可用的内核数。为了支持 Argon2 的内存密集型性质,我们已将默认的 GC 从 ParallelGC 更新至 G1GC 以获得更好的堆利用率。
请注意,Argon2 不兼容 FIPS 140-2。因此,如果您在 FIPS 环境中,默认算法仍为 PBKDF2。另请注意,如果您处于非FIPS 环境,并且计划迁移到 FIPS 环境,请考虑将密码策略改为 FIPS 兼容算法,如 outset 中的 pbkdf2-sha512。否则,用户在切换到 FIPS 环境后将无法登录。
2.11.2. 默认 http-pool-max-threads 减少 复制链接链接已复制到粘贴板!
如果未设置,则 http-pool-max-threads 将默认为 50 或 4 x (可用处理器)。在以前的版本中,它默认为 200 或 8 x 更大的(可用处理器)。减少大多数使用场景的数量或任务线程会因为活跃线程的上下文切换而降低性能。
当 RESOURCE_SERVER_RESOURCE 和 RESOURCE_SERVER_PERM_TICKET 表具有 100k 条目且用户通过 1k 资源授予了访问权限时,这些查询不佳。这个查询已被简化,并引入了 请求者 和 所有者 列的新索引。
新索引都应用到 RESOURCE_SERVER_PERM_TICKET 表。如果表目前包含 300,000 个条目,红帽构建的 Keycloak 将在自动模式迁移过程中默认跳过创建索引,而是在迁移过程中记录控制台上的 SQL 语句。在这种情况下,在红帽构建 Keycloak 后,必须在 DB 中手动运行语句。
2.11.4. method getExp 添加到 SingleUseObjectKeyModel 复制链接链接已复制到粘贴板!
由于从 AccessToken、IDToken 和 JsonWebToken 中删除已弃用的方法后,SingleUseObjectKeyModel 也改变,以保持与过期值相关的方法名称的一致性。
前面的 getExpiration 方法现已弃用,您应该更喜欢使用新的 getExp 方法来避免 2038 后溢出。
2.11.5. 在启用括号强制时,默认阻止并发登录请求 复制链接链接已复制到粘贴板!
如果攻击者并行启动了很多登录尝试,则攻击者可能会对密码进行更多的猜测,而不是暴力保护配置所允许的。这是因为在暴力强制保护器已锁定用户之前进行暴力检查。为防止这种争用,Brute Force Protector 现在会拒绝在同一服务器中进行另一次登录尝试时发生的所有登录尝试。
如果您希望禁用此功能,请使用以下命令:
bin/kc.[sh|bat] start --spi-brute-force-protector-default-brute-force-detector-allow-concurrent-requests=true
2.11.6. 使用通配符时重定向 URI 验证的更改 复制链接链接已复制到粘贴板!
由于安全问题,如果传递的 redirect uri 包含 userinfo 部分或其 路径访问 父目录(/../),则重定向 URI 验证现在会执行精确的字符串匹配(不包括通配符)。
完整通配符 * 仍可用作具有这些特征的 http URI 开发中的有效重定向。在生产环境中,为该类型的任何 URI 配置准确的有效重定向 URI。
请注意,不建议在生产环境中使用通配符有效的重定向 URI,而不是 OAuth 2.0 规格涵盖的。
2.11.7. Infinispan marshalling 更改 复制链接链接已复制到粘贴板!
Marshalling 是将 Java 对象转换为字节的过程,以便在红帽构建的 Keycloak 服务器之间在网络上发送它们。在 Red Hat build of Keycloak 26 中,marshalling 库已从 JBoss Marshalling 改为 Infinispan Protostream。库彼此不兼容,需要一些步骤来确保会话数据不会丢失。
JBoss Marshalling 和 Infinispan Protostream 相互不兼容,不正确的用法可能会导致数据丢失。因此,所有缓存都会在升级到这个版本时清除。所有现有的在线用户和客户端会话都已清除。离线用户和客户端会话不会受到影响。
2.11.8. 自动从 root 重定向到相对路径 复制链接链接已复制到粘贴板!
指定 http-relative-path 属性时,用户会自动重定向到托管 Red Hat build of Keycloak 的路径。这意味着,当相对路径设置为 /auth,并且用户访问 localhost:8080/ 时,该页面会被重定向到 localhost:8080/auth。
当指定 http-management-relative-path 或 http-relative-path 属性时,同样的更改适用于管理界面。这个变化提高了用户体验。用户不再需要显式设置 URL 的相对路径。
2.11.9. 为 URL 编码一致使用 UTF-8 charset 复制链接链接已复制到粘贴板!
org.keycloak.common.util.Encode 现在总是使用 UTF-8 charset 进行 URL 编码,而依赖于 file.encoding 系统属性。
2.11.10. 配置 LDAP 连接池 复制链接链接已复制到粘贴板!
在本发行版本中,LDAP 连接池配置只依赖于系统属性。主要的原因是 LDAP 连接池配置是 JVM 级别的配置,而不是特定于单个域或 LDAP 提供程序实例。
与之前的版本相比,任何与 LDAP 连接池相关的域配置都将被忽略。如果您要从将以下设置设置为 LDAP 提供程序的早期版本迁移,请考虑使用系统属性:
-
connectionPoolingAuthentication -
connectionPoolingInitSize -
connectionPoolingMaxSize -
connectionPoolingPrefSize -
connectionPoolingTimeout -
connectionPoolingProtocol -
connectionPoolingDebug
如需了解更多详细信息 ,请参阅配置连接池。
2.11.11. 重启后持久保留已撤销的访问令牌 复制链接链接已复制到粘贴板!
在本发行版本中,撤销的访问令牌写入数据库,并在使用嵌入式缓存时默认重启集群时重新载入。
要禁用此行为,请使用 SPI 选项 spi-single-use-object-infinispan-persist-revoked-tokens,如 All provider configuration 所述。
SingleUseObjectProvider 的 SPI 行为已更改,它只用于撤销的令牌,且只能使用 包含 的方法。默认情况下会强制执行此设置,可以使用 SPI 选项 spi-single-use-object-infinispan-persist-revoked-tokens 来禁用。
2.11.12. 高可用性多站点部署 复制链接链接已复制到粘贴板!
Red Hat build of Keycloak 26 对推荐的高可用性多站点架构进行了显著改进,最重要的是:
- 红帽构建的 Keycloak 部署现在可以在两个站点同时处理用户请求。之前的负载均衡器配置只在一个站点处理请求时才能继续工作。
- 现在,在出现故障时,对站点之间的连接监控需要重新配置站点之间的复制。蓝图描述了带有 Alertmanager 和 AWS Lambda 的设置。
- loadbalancer 蓝图已更新为使用 AWS 全局加速器,因为这可避免客户端导致 DNS 缓存造成较长的故障时间。
- 现在,永久用户会话是必需的。因此,用户会话将保存在红帽构建的 Keycloak 或 Data Grid 升级时。
- 改进了外部 Data Grid 请求处理,以减少内存用量和请求延迟。
由于上述更改,现有 Red Hat build of Keycloak 部署需要以下更改。
-
启用
多站点功能时,缓存配置文件提供的分布式缓存定义会被忽略,因此您必须通过cache-remotefluentd 命令行参数或 Keycloak CR 配置与外部 Data Grid 部署的连接。所有remote-store配置都必须从缓存配置文件中删除。 - 查看外部 Data Grid 中的当前缓存配置,并使用最新版本的红帽构建的 Keycloak 文档中的更新它们。虽然以前的缓存配置版本仅在站点之间的备份复制失败时记录警告,但新配置可确保两个站点中的状态保持同步:当两个站点之间的传输失败时,调用者将会看到错误。因此,您需要在站点失败时设置监控以断开两个站点的连接。高可用性指南 包含有关如何设置此蓝图。
- 虽然以前的负载均衡器配置将继续与红帽构建的 Keycloak 一起工作,但请考虑升级现有的 Route53 配置,以避免因为客户端 DNS 缓存而延长的故障切换时间。
-
如果您使用 remote-store 配置更新了缓存配置 XML 文件,则这些文件将无法正常工作。相反,启用
多站点功能并使用cache-remove channel选项。
2.11.13. 所需操作改进 复制链接链接已复制到粘贴板!
现在,当从应用程序启动所需操作执行重定向时,通过 kc_action 参数返回所需的操作供应商名称。这简化了为客户端执行哪些所需操作的检测。执行的结果可以通过 kc_action_status 参数来决定。
注: 此功能需要对 Keycloak JS 适配器进行更改,因此,如果要使用此功能,建议升级到最新版本的适配器。
2.11.14. 密钥存储和信任存储默认格式更改 复制链接链接已复制到粘贴板!
红帽 Keycloak 的构建现在根据文件扩展决定密钥存储和信任存储的格式。如果文件扩展是 .p12、.pkcs12 或 .pfx,则格式为 PKCS12。如果文件扩展是 .jks、.keystore 或 .truststore,则格式为 JKS。如果文件扩展是 .pem、.crt 或 .key,则格式为 PEM。
您仍然可以通过明确指定 https-key-store-type 和 https-trust-store-type 来覆盖自动检测。这也适用于管理界面及其 https-management-key-store-type。FIPS 严格模式的限制保持不变。
spi-truststore-file channel 选项和 truststore 相关选项 https-trust-store fluentd 已被弃用,我们强烈建议您使用 System Truststore。如需更多详细信息,请参阅相关 指南。
2.11.15. 常见 主题资源的路径已更改 复制链接链接已复制到粘贴板!
keycloak 主题 的通用 资源的一些路径已更改,特别是第三方库的资源。确保相应地更新您的自定义主题:
-
node_modules/patternfly/dist现在是vendor/patternfly-v3 -
node_modules/@patternfly/patternfly现在是vendor/patternfly-v4 -
node_modules/@patternfly-v5/patternfly现在是vendor/patternfly-v5 -
node_modules/rfc4648/libis nowvendor/rfc4648
另外,以下资源已从 常见 主题中删除:
-
node_modules/alpinejs -
node_modules/jquery
如果您之前在主题中使用了任何删除的资源,请确保将它们添加到您自己的主题资源中。
2.11.16. BouncyCastle FIPS 已更新 复制链接链接已复制到粘贴板!
现在,我们的 FIPS 140-2 集成已在 BouncyCastle FIPS 库的版本 2 中经过测试和支持。此版本通过 Java 21 认证。如果使用 FIPS 140-2 集成,建议将 BouncyCastle FIPS 库升级到最新文档中所述的版本。
BouncyCastle FIPS 版本 2 已通过 FIPS 140-3 认证。因此,只要在 FIPS 140-3 兼容系统上使用它,Red Hat build of Keycloak 就可以符合 FIPS 140-3。这可能是基于 RHEL 9 的系统,它本身与 FIPS 140-3 兼容。但请注意,基于 RHEL 8 的系统只通过 FIPS 140-2 认证。
第 3 章 升级 Red Hat build of Keycloak 服务器 复制链接链接已复制到粘贴板!
在升级适配器前,您要升级服务器。
3.1. 准备升级 复制链接链接已复制到粘贴板!
在升级服务器前执行以下步骤。
流程
- 关闭红帽构建的 Keycloak。
- 备份旧安装,如配置、主题等。
-
如果启用了 XA 事务,处理任何打开的事务并删除
data/transaction-logs/transaction 目录。 使用相关数据库的文档中的说明备份数据库。
在升级服务器后,数据库将不再与旧服务器兼容。如果您需要恢复升级,请先恢复旧的安装,然后从备份副本恢复数据库。
如果您的当前设置中禁用了功能 persistent-user-sessions,并且服务器已升级,则除离线用户会话外,所有用户会话都将丢失。拥有这些会话的用户必须再次登录。请注意,在 26.0.0 之前的 Red Hat build of Keycloak 服务器版本中默认禁用功能 persistent-user-sessions。
有关暴力检测和当前持续验证流程的失败登录信息,仅存储在红帽构建的 Keycloak 关闭时清除的内部缓存中。目前用户验证,更改密码或重置其密码将在红帽构建的 Keycloak 重新启动并再次运行后,需要重启身份验证流。
3.2. 下载 Red Hat build of Keycloak 服务器 复制链接链接已复制到粘贴板!
为升级做好准备后,您可以下载服务器。
流程
从红帽构建的 Keycloak 网站下载并提取 rhbk-26.0.15.zip。
提取此文件后,您应该有一个名为
rhbk-26.0.15的目录。- 将此目录移到所需的位置。
-
将
conf/ 和/、providerthemes/从上一安装复制到新安装。
3.3. 迁移数据库 复制链接链接已复制到粘贴板!
Red Hat build of Keycloak 可以自动迁移数据库模式,或者您可以选择手动执行它。默认情况下,当您首次启动新安装时,数据库会被自动迁移。
3.3.1. 自动关系数据库迁移 复制链接链接已复制到粘贴板!
要执行自动迁移,请启动连接到所需数据库的服务器。如果新服务器版本更改了数据库架构,则迁移会自动启动,除非数据库有太多记录。
例如,在包含数百万条记录的表上创建索引可能会非常耗时,并导致重要的服务中断。因此,自动迁移存在 300000 记录的阈值。如果记录数量超过这个阈值,则不会创建索引。相反,您可以使用 SQL 命令在服务器日志中找到可以手动应用的警告信息。
要更改阈值,请为 connections-liquibase 供应商设置 index-creation-threshold 属性:
kc.[sh|bat] start --spi-connections-liquibase-quarkus-index-creation-threshold=300000
3.3.2. 手动关系数据库迁移 复制链接链接已复制到粘贴板!
要启用数据库模式的手动升级,请将默认的 connection- jpa 提供者的 属性值设置为 "manual" :
migration- strategy
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-strategy=manual
使用此配置启动服务器时,服务器会检查是否需要迁移数据库。所需的更改被写入 bin/keycloak-database-update.sql SQL 文件,您可以检查并手动针对数据库运行。
要更改导出的 SQL 文件的路径和名称,请设置默认 connection- jpa 供应商的 属性:
migration- export
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-export=<path>/<file.sql>
有关如何将此文件应用到数据库的详情,请查看您的关系数据库文档。将更改写入到文件后,服务器将退出。
3.4. 迁移主题 复制链接链接已复制到粘贴板!
如果您创建了自定义主题,则必须将这些主题迁移到新服务器。另外,对内置主题的任何更改可能需要反映在自定义主题中,具体取决于您自定义的方面。
流程
-
将自定义主题从旧服务器
主题目录复制到新服务器主题目录。 使用以下部分来迁移模板、消息和样式。
- 如果您自定义了 Migration Changes 中列出的任何更新模板,请将模板与基础主题进行比较,以检查您需要应用的任何更改。
- 如果自定义消息,您可能需要更改键或值或添加额外的消息。
- 如果您自定义任何风格且您要扩展 Keycloak 主题的红帽构建,请查看风格的更改。如果您要扩展基础主题,您可以跳过这一步。
3.4.1. 迁移模板 复制链接链接已复制到粘贴板!
如果您自定义任何模板,请查看新版本以决定更新自定义模板。如果您进行了较小的更改,您可以将更新的模板与自定义模板进行比较。但是,如果您进行了许多更改,请考虑将新模板与自定义模板进行比较。此比较将向您显示您需要进行哪些更改。
您可以使用 diff 工具比较模板。以下屏幕截图比较了 Login 主题和示例自定义主题中的 info.ftl 模板:
登录模板和自定义登录模板的更新版本
此比较显示,第一次更改(Hello world!!)是自定义状态,而第二个更改(如果 pageRedirectUri)是基础主题的更改。通过将第二个更改复制到自定义模板,您已成功更新您的自定义模板。
在替代方法中,以下屏幕截图将旧安装中的 info.ftl 模板与新安装中更新的 info.ftl 模板进行比较:
从旧安装和更新的 Login 主题模板登录主题模板
此比较显示在基本模板中更改的内容。然后您可以手动对修改的模板进行相同的更改。由于这种方法更为复杂,因此只有在第一个方法不可行时才使用此方法。
3.4.2. 迁移消息 复制链接链接已复制到粘贴板!
如果您添加了对其他语言的支持,则需要应用上面列出的所有更改。如果您还没有添加了对其他语言的支持,您可能不需要更改任何内容。只有在您更改了主题中的受影响的消息时才需要进行更改。
流程
- 对于添加的值,请查看基本主题中的消息值,以确定是否需要自定义该消息。
- 对于重命名的密钥,请在自定义主题中重命名密钥。
- 对于更改的值,请检查基础主题中的值以确定您是否需要更改自定义主题。
3.4.3. 迁移风格 复制链接链接已复制到粘贴板!
您可能需要更新您的自定义样式,以反映对内置主题中样式所做的更改。考虑使用 diff 工具将旧服务器安装与样式表的更改进行比较。
例如:
$ diff RHSSO_HOME_OLD/themes/keycloak/login/resources/css/login.css \
RHSSO_HOME_NEW/themes/keycloak/login/resources/css/login.css
检查更改并确定它们是否影响您的自定义样式。
第 4 章 升级 Red Hat build of Keycloak 适配器 复制链接链接已复制到粘贴板!
升级 Red Hat build of Keycloak 服务器后,您可以升级适配器。适配器版本和红帽构建的 Keycloak 现已分离,这意味着它们在不同的计划中发布。因此,使用这些规则来决定您升级哪些适配器:
- 适配器的早期版本可能会与 Red Hat build of Keycloak 服务器的后续版本一起工作。
- 红帽构建的 Keycloak 服务器的早期版本可能无法用于适配器的后续版本。
每个适配器升级部分都提供了有关支持的适配器版本的详情。
4.1. 升级 JBoss EAP SAML 适配器 复制链接链接已复制到粘贴板!
从 Red Hat build of Keycloak 26.0 开始,红帽构建的 Keycloak 不再发布 JBoss EAP SAML 适配器。如果您使用那个适配器的版本 6.x 或 7.x 部署应用程序,红帽构建的 Keycloak 不支持它。这些适配器版本只支持与 Red Hat Single Sign-On 7.6 结合使用。
SAML 的完全支持适配器是 JBoss EAP 8.0 的 Keycloak SAML Adapter 功能软件包或 RPM。
要升级已复制到您的 Web 应用程序的 JBoss EAP SAML 适配器,请执行以下步骤。
流程
-
通过删除
EAP_HOME/modules/system/add-ons/keycloak/目录来删除之前的适配器模块。 - 安装适配器的新版本。详情请参阅 使用 RPM 安装方法安装 JBoss EAP。
4.2. 升级 JBoss EAP OpenID 连接适配器 复制链接链接已复制到粘贴板!
从 Red Hat build of Keycloak 26.0 开始,红帽构建的 Keycloak 不再发布 JBoss EAP OpenID 连接(OIDC)适配器。这个适配器已结束其生命周期,它只支持与 Red Hat Single Sign-On 7.6 结合使用。JBoss EAP 8.0 提供了 OIDC 支持的适配器。
要升级已复制到您的 Web 应用程序的 JBoss EAP OIDC 适配器,请执行以下步骤。
流程
-
通过删除
EAP_HOME/modules/system/add-ons/keycloak/目录来删除之前的适配器模块。 - 安装 JBoss EAP 8.0 提供的 OIDC 客户端。详情请参阅 使用 OIDC 保护应用程序。
4.3. 升级 JavaScript 适配器 复制链接链接已复制到粘贴板!
对于此红帽构建的 Keycloak 版本,此适配器支持的版本为 26.0.12。
要升级已复制到您的 web 应用程序的 JavaScript 适配器,请执行以下步骤。
流程
- 删除 JavaScript 适配器的旧版本。
使用这些 NPM 命令安装适配器的 26.0.12 版本:
npm config set @redhat:registry https://npm.registry.redhat.com install: npm install @redhat/keycloak-js@latest
4.4. 升级 Node.js 适配器 复制链接链接已复制到粘贴板!
对于此红帽构建的 Keycloak 版本,此适配器支持的版本为 26.0.11。
要升级已复制到 web 应用程序的 Node.js 适配器,请执行以下步骤。
流程
- 删除之前版本的 Node.js 适配器。
使用这些 NPM 命令安装 Node.js 适配器的 26.0.11 版本:
npm config set @redhat:registry https://npm.registry.redhat.com npm install @redhat/keycloak-connect@latest-
在应用程序的
package.json中更改 keycloak-connect 的依赖项。
第 5 章 升级 Red Hat build of Keycloak Client Libraries 复制链接链接已复制到粘贴板!
客户端库是这些工件:
-
Java 管理客户端 - Maven 工件
org.keycloak:keycloak-admin-client -
Java 授权客户端 - Maven 工件
org.keycloak:keycloak-authz-client -
Java 策略强制 - Maven 工件
org.keycloak:keycloak-policy-enforcer
客户端库支持所有支持的 Keycloak 服务器版本。通过更多服务器版本支持客户端库可以更轻松地更新,因此当更新应用程序的客户端库时,您可能不需要同时更新服务器。
客户端库甚至可以和红帽构建的 Keycloak 服务器的旧版本一起工作,但无法保证并正式支持。
可能需要查阅 Java admin-client 等客户端库的 javadoc,以查看红帽构建的 Keycloak 服务器版本支持哪些端点和参数。