LabHub

博客

Keycloak 26.7 — SCIM 升级为预览版,无需外部 Infinispan 的多集群 v2,以及升级中容易踩的坑

한국어English日本語中文

引言 — 每季度一个小版本,这次轮到 26.7

Keycloak 最近大约每三个月发布一个小版本(minor)。按 GitHub 发布日期算,26.5.0 是 2026 年 1 月 6 日,26.6.0 是 4 月 8 日,26.7.0 则是 7 月 9 日发布的。多数小版本翻一遍发布说明就能了事,但这次对运维来说值得多留意 —— 两个等了很久的功能(SCIM、无需外部缓存的多集群)都进入了预览阶段,升级指南里 breaking/notable 的清单也格外长。

本文是对照官方发布说明与仓库里的原始 adoc 文档(发布说明升级指南),再加上功能开关的真正定义所在地 Profile.java,整理出的运维视角解读。如果你还不熟悉 Keycloak 26 的架构本身,建议先看Keycloak 26 架构深度解析

SCIM API — 悬而未决四年的议题进入核心(预览版)

SCIM(System for Cross-domain Identity Management)是一种通过标准 REST API 在系统之间读写用户、群组等身份资源的协议(模式定义在 RFC 7643,协议定义在 RFC 7644)。在 Okta 或 Entra ID 这类商用 IdP 里这被视为理所当然的功能,但 Keycloak 核心一直没有。2022 年 8 月开的那个请求支持 SCIM 的 issue已经攒了 300 个反应且至今仍是打开状态,这段时间这个空白一直靠 scim-for-keycloak 这类第三方扩展来填补。

这一次,这个空白开始在核心中被填上。用代码追一下时间线是这样的 —— scim-api 功能开关在 26.6.0 的 Profile.java 中作为 experimental 悄悄加入(26.6.0 的发布说明里完全没有提到),随后在 26.7.0 中被升级为预览版。它默认关闭,需要用 --features=scim-api 打开,打开之后还得在 realm 设置里逐 realm 再次开关。

根据管理指南中的 SCIM 章节,实现范围如下。

端点按 realm 开放。

/realms/<realm-name>/scim/v2/ServiceProviderConfig
/realms/<realm-name>/scim/v2/ResourceTypes
/realms/<realm-name>/scim/v2/Schemas
/realms/<realm-name>/scim/v2/Users
/realms/<realm-name>/scim/v2/Groups

权限模型没有新建,而是复用了和 Admin REST API 相同的 realm-management 角色。写用户需要 manage-users,读取需要 view-users,搜索需要 query-users/query-groups —— 如果已经为 Admin API 配置了服务账号,无需额外设置 SCIM 就能用。调用只允许 confidential 客户端,public 客户端会被拒绝。

设计上值得一提的是对管理员资源的保护。SCIM 客户端通常带着广泛的管理权限运行,因此文档明确防范了这样的场景:一个被攻破的配置客户端删除管理员账户,或把用户塞进管理员组 —— 通过 SCIM 查询带有管理角色的用户、群组时,只会返回最小化的表示(大致是 id、schemas、userName),写操作则会被 403 拒绝。管理员账户仍然只能通过 Admin 控制台和 Admin REST API 操作。

诚实地说清楚边界 —— 这次落地的只是 Keycloak 成为 SCIM 服务器这一个方向。 HR 系统或身份治理平台向 Keycloak 增删用户的入站配置(inbound provisioning)靠这个就够了。反过来,Keycloak 作为 SCIM 客户端从外部 SCIM 提供方联合用户过来,这件事还在另一个尚未关闭的 issue 里,文档也只是把来自外部 SCIM 服务提供方的用户联合、以及基于推送的实时事件列为未来版本的计划。从 Keycloak 向下游应用推送的出站配置(outbound provisioning)同样不在这次范围内 —— 那仍然是扩展的地盘。而且预览版就是预览版:不受支持,最终形态也可能变化。

多集群 v2 — 不再需要外部 Infinispan(预览版)

到目前为止,Keycloak 的多站点高可用(v1)需要为跨站点会话复制单独部署和运维一套外部 Infinispan(Data Grid)集群,还需要面向自动故障转移的、与厂商绑定的 fencing 基础设施 —— 这正是Keycloak HA 集群指南里讲过的那套结构。运维过的人都知道,为了让认证服务器高可用而去照看缓存集群这另一套分布式系统,成本并不小。

26.7 的多集群 v2 把这个外部依赖整个拿掉了。架构变成了这样。

光听到这里,可能会觉得连地理级 DR 都能做到,但官方指南把约束钉得很死,原样照搬如下。

从运维角度再补一句 —— 在 Profile.java 中,这个功能被声明为 FeatureUpdatePolicy.SHUTDOWN。也就是说,开关这个功能标志时无法滚动更新,需要整个集群关停。这不是那种能无停机地塞进已经在跑的生产环境里的功能。

总结一下,v2 是"去掉了外部 Infinispan 运维的区域内多集群可用性",而不是"相距遥远的两个数据中心"。作为交换得到的东西很明确 —— 需要管理的分布式系统少了一套,对 Kubernetes 或 AWS 这类特定环境的依赖也消失了。如果负载落在测试范围内,且组织有能力以同步复制方式运维数据库,这是一笔值得用来换掉 v1 运维复杂度的交易。

顺带一提。打标签那一刻的发布说明原文有一处不一致 —— 在亮点里把这个功能标为预览版,而在正文标题里写成了 experimental(main 分支上已经统一整理为预览版),而代码里的 Profile.java 从一开始就是 PREVIEW。发布说明和代码对不上的时候,以代码为准。

Organizations — 多租户委托变得可行

正如多租户 SaaS SSO 架构一文所讲,Keycloak 的 Organizations 功能是在单个 realm 内管理多个租户(组织)。但到目前为止,管理组织需要 manage-realm 这个高权限角色 —— 相当于把整个 realm 的管理权限交给了租户管理员,说是"委托"都有点名不副实。

26.7 修正了这一点。

还带来了一处 breaking 变更。组织成员列表 API 现在默认返回 brief 表示。需要完整用户表示时必须通过查询参数明确指定。

GET /admin/realms/{realm}/organizations/{id}/members?briefRepresentation=false

组织邀请列表里 email/firstName/lastName 的过滤方式也从部分匹配改成了忽略大小写的精确匹配 —— 如果需要部分匹配,指南建议改用 search 参数。如果有自动化依赖这些 API,先确认响应格式和过滤行为是否变了。

升级中容易踩的坑

以下是从这次升级指南里挑出的、运维人员实际可能踩到的坑。完整清单参见升级指南原文

PostgreSQL 异步提交默认开启。 只更新 persisted user sessions、client sessions、login failures、events 这类易失表的事务,现在会用 PostgreSQL 的异步提交(async commit)处理(登出仍然强制同步提交)。这是出于性能考虑的选择,但必须准确理解它的含义 —— 根据 PostgreSQL 文档,异步提交会在 WAL 刷盘之前就返回提交成功,一旦服务器崩溃,这段时间内的提交就会丢失。丢失窗口最多是 wal_writer_delay(默认 200ms)的三倍。数据不会损坏,丢的只是崩溃前不到一秒钟的会话、事件写入,对用户来说无非是重新登录一次。不过值得一提的是 events 表也包含在内 —— 意味着崩溃前那一刻的登录事件可能从审计日志里消失,如果所在环境对审计要求严格,就要判断是否用 --spi-connections-jpa--quarkus--async-commit=false 选择退出。

X.509 客户端认证新增了 CA Subject DN 选项,而且事实上成了必需项。 如果用 mTLS 认证客户端,管理控制台现在会强制要求指定信任锚 CA 的 subject DN。现有配置暂时还能正常工作,但从下一个大版本开始会加入服务端校验,没有这个选项的创建/更新/导入都会被拒绝。用正则表达式匹配证书、而不是精确 DN 的那个选项,也同时被标记为弃用。如果是在 TLS 终止代理后面通过请求头传递证书的架构,也需要重新确认 truststore 是否配置好了对客户端证书链的校验。

自助注册流程发生了变化。 如果 realm 同时启用了自助注册和 Verify Email,注册表单里的密码字段默认会消失。用户只注册资料,验证邮箱之后才设置密码(或 OTP、passkey)。这把"用未验证的邮箱先创建凭证"的顺序整个反过来了,是一处会牵动注册 UX 以及全部文档、截图的变更。有开关可以恢复旧行为,但已被标记为 deprecated。

其余的压缩罗列如下。

弃用雷达 — 现在就该关掉或迁移的东西

其余的标准实验 —— 各写一段

这次发布里带 experimental 标签的标准实现异常多。全部默认关闭,阅读时请记住 experimental 比预览版还要早一个阶段。

从预览版升级为正式支持的只有一项:SAML 客户端的 step-up 认证。原本只有 OIDC 才有的认证上下文要求,现在也向 SAML SP 开放了。

那么,什么时候升级,该开什么

综合起来,我会这样判断。

结语

只看头条(SCIM、多集群 v2)的话,Keycloak 26.7 像是一场预览版的展会,但背后的方向是一致的 —— 把第三方扩展和外部基础设施一直在填补的空白,吸收进核心的标准实现(SCIM、SSF、AuthZEN);拆分高权限角色(组织管理角色、移除 view-system);收紧过去的松散之处(X.509 CA DN、URI 模板校验、SHA-1 退役预告)。对于自托管 IdP 的运维者来说,这是个值得欢迎的方向,代价只是升级指南变长了而已。不要只读发布说明就了事,建议把升级指南当作清单认真过一遍。

参考资料

评论

还没有评论。

登录后即可发表评论