Realm 与多租户

什么是 Realm

Realm 是 Keycloak 中基础的隔离单元。每个 Realm 独立管理自己的一组用户、凭据、角色、组、客户端和身份验证策略,与其他 Realm 互不影响。Realm 不共享用户数据库或配置,因此是 Keycloak 中实现多租户的主要机制。

可以将 Realm 理解为专用的身份域——类似于多租户 SaaS 应用中的租户。

主节点 Realm

每个 Keycloak 安装都包含一个名为 master 的内置 Realm。master Realm 是顶级管理域,仅用于:

  • 管理其他 Realm(创建、配置和删除)
  • 管理 Keycloak 服务器级别的设置
  • 托管 Keycloak Admin Console
安全建议

不要使用 master Realm 管理应用用户或托管应用客户端。请为每个应用或租户创建专用 Realm,以保持适当的隔离。

Realm 隔离

每个 Realm 在以下维度提供完全隔离:

维度范围
用户用户账户、凭据和配置文件仅存在于其所属的 Realm 中
客户端在某个 Realm 中注册的应用无法从其他 Realm 访问
角色Realm 级别和客户端级别的角色均限定在其所属的 Realm 中
身份验证流程登录页面、MFA 和其他流程均按 Realm 进行配置
身份提供商外部 IdP 集成(LDAP、OIDC、SAML)特定于各个 Realm
会话用户会话相互隔离;SSO 仅适用于单个 Realm 内部

多租户模式

Keycloak 支持两种常见的多租户模式:

每个租户一个 Realm(推荐)

每个租户都有自己的专用 Realm。这种方式可提供最强的隔离,使每个租户都拥有完全独立的用户、角色、客户端和身份验证配置。

  • 优点:完全的数据隔离、独立的配置,不存在跨租户数据泄露的风险。
  • 缺点:Realm 数量越多,管理开销越大;必须为每个租户分别配置 Realm 级别的设置。

通过 Groups 共享 Realm

多个租户共享一个 Realm,并使用 Keycloak Groups 或用户的自定义属性来区分租户。

  • 优点:运营开销较低,便于大规模管理。
  • 缺点:隔离性较弱;需要谨慎配置访问控制,以防止跨租户访问数据。不建议用于具有严格合规要求的场景。

通过 KeycloakRealmImport 配置 Realm

在 Alauda Application Services Identity Management E1 中,可以使用 KeycloakRealmImport Custom Resource 以声明方式管理 Realm 配置。这支持以 GitOps 风格管理 Realm 定义。

apiVersion: k8s.keycloak.org/v2beta1
kind: KeycloakRealmImport
metadata:
  name: my-realm-import
spec:
  keycloakCRName: example-kc
  realm:
    realm: my-tenant
    enabled: true
    displayName: "My Tenant Realm"

如需查看完整的 API 参考,请参阅 KeycloakRealmImport API。