配置 LDAP / Active Directory 联合

本指南将引导你在 Keycloak 中设置 LDAP 或 Microsoft Active Directory 用户联合,使企业目录中的用户无需迁移凭证即可进行身份验证。

有关背景概念,请参阅 身份联合。

先决条件

  • 一个正在运行且具备管理员访问权限的 Keycloak 实例。
  • 从 Keycloak Pods 到 LDAP/AD 服务器的网络连通性。
  • 一个 LDAP bind 账户,具有对用户目录的读取权限(如果使用 WRITABLE 编辑模式,则还需要写入权限)。
  • 适用于你的目录结构的 LDAP base DN 和用户搜索过滤器。

步骤 1:添加 LDAP 提供程序

  1. 在 Admin Console 中,选择目标 Realm。
  2. 在左侧导航栏中进入 User federation。
  3. 单击 Add LDAP provider。
  4. 配置连接设置:
FieldDescriptionExample
Console Display Name该提供程序的友好名称Corporate AD
Vendor目录供应商。会优化默认设置。Active Directory, Red Hat Directory Server, Other
Connection URLLDAP 服务器 URLldaps://ldap.example.com:636
Enable StartTLS对 389 端口上的 LDAP 连接使用 StartTLSOff(改用 ldaps://)
Bind Type使用用户名/密码进行 bind 时为 simplesimple
Bind DNKeycloak 使用的服务账户 DNcn=keycloak-svc,ou=ServiceAccounts,dc=example,dc=com
Bind CredentialBind DN 的密码(enter the password)
  1. 单击 Test connection 以验证连通性。
  2. 单击 Test authentication 以验证 bind 凭证。

步骤 2:配置用户搜索

FieldDescriptionExample
Edit ModeKeycloak 与 LDAP 的交互方式 — 请参见下表READ_ONLY
Users DN用户搜索的 base DNou=Users,dc=example,dc=com
Username LDAP attribute映射到 Keycloak username 的 LDAP 属性sAMAccountName (AD) or uid (LDAP)
RDN LDAP attribute用作 RDN 的 LDAP 属性cn
UUID LDAP attribute用作唯一 ID 的 LDAP 属性objectGUID (AD) or entryUUID (LDAP)
User Object Classes用户的 LDAP objectClass 过滤器person, organizationalPerson, user (AD)
Search ScopeOne Level 或 Subtree(包含嵌套 OU)Subtree
Custom User LDAP Filter用于缩小结果范围的附加 LDAP 过滤器(memberOf=cn=AppUsers,ou=Groups,dc=example,dc=com)

编辑模式

ModeDescriptionUse Case
READ_ONLYKeycloak 只从 LDAP 读取数据,但不会写回。密码更改直接通过 LDAP 进行。当 Keycloak 不应修改目录时
WRITABLEKeycloak 可以更新 LDAP 中的用户属性和密码。当 Keycloak 管理完整用户生命周期时
UNSYNCEDKeycloak 将更改本地保存,不写回 LDAP。临时覆盖或测试

步骤 3:配置同步

同步会将 LDAP 中的用户数据导入到 Keycloak 的本地缓存中,以便更快地查找。

SettingDescriptionRecommended
Import Users是否将 LDAP 用户导入到 Keycloak 的本地数据库On
Periodic Full Sync启用计划的完整同步On
Full Sync Period完整同步的间隔(秒)86400(每天)
Periodic Changed Users Sync启用最近修改用户的增量同步On
Changed Users Sync Period已变更用户同步的间隔(秒)3600(每小时)

单击 Save,然后单击 Synchronize all users 执行初始导入。

前往 Users 并搜索 LDAP 用户,以验证导入是否成功。

步骤 4:配置 LDAP Mapper

LDAP Mapper 定义了 LDAP 属性如何映射到 Keycloak 用户属性、组和角色。

默认 Mapper

创建 LDAP 提供程序时,Keycloak 会自动创建多个默认 Mapper。请在 Mappers 选项卡中查看它们:

MapperTypeDescription
usernameuser-attribute-ldap-mapper将 sAMAccountName(或 uid)映射到 Keycloak 的 username
emailuser-attribute-ldap-mapper将 mail 映射到 Keycloak 的 email
first nameuser-attribute-ldap-mapper将 givenName 映射到 Keycloak 的 firstName
last nameuser-attribute-ldap-mapper将 sn 映射到 Keycloak 的 lastName

添加组 Mapper

要将 LDAP 组同步到 Keycloak 组:

  1. 在 LDAP provider 详情中,单击 Mappers 选项卡。
  2. 单击 Add mapper。
  3. 选择 group-ldap-mapper。
  4. 配置:
FieldDescriptionExample
LDAP Groups DN组搜索的 base DNou=Groups,dc=example,dc=com
Group Name LDAP Attribute组名称的 LDAP 属性cn
Group Object Classes组的 LDAP objectClassgroupOfNames or group (AD)
Membership LDAP Attribute列出组成员的 LDAP 属性member
Membership Attribute TypeDN 或 UIDDN
Drop non-existing groups during sync移除在 LDAP 中找不到的 Keycloak 组Off(为安全起见,建议使用)
  1. 单击 Save,然后单击 Sync LDAP groups to Keycloak。

添加角色 Mapper

要将 LDAP 组直接映射到 Keycloak Realm 角色:

  1. 单击 Add mapper > role-ldap-mapper。
  2. 配置 LDAP roles DN、role object classes 和 membership attributes(与 group mapper 类似)。
  3. 将 Use Realm Roles Mapping 设置为 On。
  4. 单击 Save 并同步。

步骤 5:配置通过 TLS 的 LDAP

对于生产环境,请始终使用加密的 LDAP 连接。

选项 A:LDAPS(推荐)

在 Connection URL 中使用 ldaps://(端口 636):

ldaps://ldap.example.com:636

如果 LDAP 服务器使用由自定义 CA 签名的证书,请将 CA 证书导入 Keycloak truststore。在 Kubernetes 管理的部署中,挂载 CA 证书,并通过 Keycloak CR 配置 JVM truststore:

spec:
  additionalOptions:
    - name: spi-truststore-file-file
      value: /opt/keycloak/certs/truststore.jks
    - name: spi-truststore-file-password
      secret:
        name: keycloak-truststore-secret
        key: password
  unsupported:
    podTemplate:
      spec:
        containers:
          - volumeMounts:
              - name: truststore
                mountPath: /opt/keycloak/certs
        volumes:
          - name: truststore
            secret:
              secretName: keycloak-truststore
Truststore Configuration

配置自定义 truststore 的具体机制可能会因 Keycloak 版本而异。在应用此配置之前,请先查阅上游 Keycloak 文档中与你所用版本对应的 truststore SPI 配置选项。

选项 B:StartTLS

使用启用了 StartTLS 的 ldap://(端口 389):

ldap://ldap.example.com:389

在 LDAP provider 配置中启用 StartTLS。同样适用 CA 证书 truststore 配置。

故障排查

SymptomPossible CauseResolution
Connection test fails网络策略阻止 LDAP 端口,或 URL 不正确使用 kubectl exec 验证 Pod 到 LDAP 的连通性,并通过 ldapsearch 进行测试
Authentication test failsBind DN 或凭证不正确验证 Bind DN 格式是否与你的目录结构匹配
No users found after syncUsers DN 或 User Object Classes 不正确检查 Users DN 是否与实际 LDAP 树匹配。对于嵌套 OU,请使用 Subtree 搜索范围。
Users visible but cannot log inEdit Mode 设置为 UNSYNCED,但没有本地密码将 Edit Mode 设置为 READ_ONLY,用于 LDAP 认证登录
Group sync returns emptyGroup Object Classes 或 Membership Attribute 不正确验证 objectClass 和 membership attribute 名称是否与你的目录 schema 匹配(groupOfNames vs group)
SSL/TLS handshake failuretruststore 中缺少 CA 证书将 LDAP 服务器的 CA 证书导入 Keycloak JVM truststore