Skip to content

Подключение LDAP пользователей и групп в Keycloak

Keycloak позволяет интегрировать внешние LDAP-провайдеры для управления пользователями. Рассмотрим, как добавить провайдера LDAP и настроить мапперы для корректной синхронизации данных пользователей и групп.

Предварительно нужно создать сервисный аккаунт uidkeycloak в FreeIPA:

Создание User Federation

User Federation:

Add LDAP providers:
    UI display name: freeipa
    Vendor: Red Hat Directory Server
    Connection URL: ldaps://freeipa.truedev.ru
        Test Connection

    Bind DN: uid=uidkeycloak,cn=sysaccounts,cn=etc,dc=truedev,dc=ru
    Bind credentials: ***
        Test Authentication

    Edit mode:  READ_ONLY
    Users DN:  cn=users,cn=accounts,dc=truedev,dc=ru
    Username LDAP attribute: uid
    RDN LDAP attribute: uid
    UUID LDAP attribute: uidNumber
    search scope: one level

    Sync Registrations: Off
    Periodic full sync: Off
    Periodic changed users sync: On
    Changed users sync period : 60
Save

Добавление uidNumber ldap mapper

Добавление uidNumber LDAP маппера в Keycloak важно для правильного и уникального сопоставления пользователей между LDAP и Keycloak. uidNumber служит уникальным идентификатором для каждого пользователя в LDAP и необходим для точного отображения информации.

Входим в созданную федерацию:

- Mappers - Add mapper
    Name: user-attribute-ldap-mapper
    Mapper type: user-attribute-ldap-mapper
    User Model Attribute: uidNumber
    LDAP Attribute: uidNumber
    Read Only: On
- Action - Sync all users:

Sync of users finished successfully.2 users added, 0 users updated, 0 users removed, 0 users failed.

Mapper

LDAP mappers

Если Неверно передается firstname из Freeipa to Keycloak: чтобы исправить нужно открыть User federation - Mapper - firstname и изменить LDAP attribute cn to givenName


Маппинг groups из ldap

С заданной периодичностью в федерации будут опрашиваться ldap каталог по cn=groups,cn=accounts,dc=truedev,dc=ru и группы оттуда будут мапиться на вновь создаваемые(или обновленные) группы в keycloak.

Входим в созданную федерацию:

- Mappers - Add mapper
    name: ldap-groups
    Mapper type : group-ldap-mapper (this the property to be selected when creating this new ldap mapper)
    LDAP Groups DN * : cn=groups,cn=accounts,dc=truedev,dc=ru
    Group Name LDAP Attribute: cn
    Group Object Classes: groupsOfNames
    Preserve Group Inheritance: On
    Ignore Missing Groups: Off
    Membership LDAP Attribute: member
    Membership Attribute Type: DN
    Membership User LDAP Attribute: uid
    LDAP Filter :

Если нужно выдергивать из ldap определенные группы, например admins, то нужно в маппинге прописывать filter для ldap:

Во freeipa создадим группу admins: DN: cn=admins,cn=groups,cn=accounts,dc=truedev,dc=ru Добавим в группу admins пользователя. И если посмотреть ldap каталог группу admins, то увидим, что добавился новый member и получается Членство в группе admins определяется добавлением атрибута member с именем пользователя: uid=admin,cn=users,cn=accounts,dc=truedev,dc=ru alt text

Входим в созданную федерацию:

- Mappers - Add mapper
    name: ldap-admin-group
    Mapper type : group-ldap-mapper (this the property to be selected when creating this new ldap mapper)
    LDAP Groups DN * : cn=groups,cn=accounts,dc=truedev,dc=ru
    LDAP Filter : (cn=admins)
Alt text

Groups Path / - этот слеш будет добавляться в начале всех групп(названия групп будет передаваться например в keycloak как /admins )

Для всех остальных полей сопоставления берется значение по умолчанию, как указано выше.

Синхронизация ldap group mapping

Входим в созданную федерацию:

- Action - Sync all users:

Проверяем в Groups группы из ldap.

Просмотр пользователей

alt text

Внедрение информации о группах в user token

Чтобы члены групп в KeyCloak получали соответствующую роль в подключаемых клиентах. Для достижения этой цели нам необходимо проинклюдить group membership в токены, выдаваемые клиентом KeyCloak.

В KeyCloak нам нужно настроить "Mapper" - небольшой автоматизированный фрагмент кода, который знает, как сделать include groups в user token scope.

Открываем Client Scopes, создаем:

name: groups
add mapper: 
    Mapper type: Group Membership
    Name *: groups
    Token Claim Name: groups
    Full group path: On
    Add to ID token: On
    Add to access token: On
    Add to userinfo: On
    Add to token introspection: On
Это создаст a claim (field on the user token) называемое “groups” и сделает map a user’s KeyCloak groups в этот список автоматически.

References:

  • https://serverfault.com/questions/1049936/unable-to-add-users-from-keycloack-on-freeipa-via-ldap-although-keycloack-host-h
  • https://github.com/keycloak/keycloak/issues/15623