Настройка Keycloak
Обзор методов авторизации
Закрома.Хранение поддерживает несколько методов авторизации пользователей:
- file - Базовая авторизация с локальными пользователями
 - ldap - Нативная LDAP авторизация без Keycloak
 - keycloak - Авторизация через Keycloak (с поддержкой LDAP)
 
Метод авторизации: file (Базовый)
Используется для простых развертываний или тестирования. Пользователи и их пароли задаются непосредственно в конфигурации.
Настройка в конфигурации установки:
1auth: 2 type: file 3 4# Настройка локальных пользователей 5users: 6 - name: zakromaadmin 7 password: zakromaadmin 8 groups: 9 - clouduser 10 - name: user1 11 password: password1 12 groups: 13 - group1 14 - name: user2 15 password: password2 16 groups: 17 - group2
Особенности:
- Простота настройки и управления
 - Подходит для небольших развертываний
 - Пароли хранятся в конфигурации (рекомендуется использовать хеширование)
 - Пользователи назначаются в группы для управления доступом
 
Метод авторизации: ldap (Нативный LDAP)
Используется для прямой интеграции с LDAP-каталогом без промежуточного Keycloak. Подходит для организаций, которые хотят использовать существующую LDAP-инфраструктуру напрямую.
Настройка в конфигурации установки:
1auth: 2 type: ldap 3 4# Настройка подключения к LDAP 5ldap: 6 # URL для подключения к LDAP серверу 7 url: "ldap://10.10.0.10:389" 8 # DN пользователя для подключения к LDAP серверу 9 bind_dn: "CN=Administrator,CN=Users,DC=zakroma,DC=local" 10 # Пароль пользователя для подключения к LDAP серверу 11 bind_password: "SuperStrongPass1234!" 12 # Фильтр для поиска пользователей по LDAP классам 13 user_filter: "(objectClass=person)" 14 # Фильтр для поиска пользователей по вхождению в LDAP группы 15 group_filter: "(objectClass=group)" 16 # Атрибут для поиска группы 17 group_name_attribute: "cn" 18 # Путь в LDAP дереве, с которого начинать поиск групп 19 group_search_dn: "ou=groups,dc=zakroma,dc=local" 20 # Атрибут имени пользователя 21 user_name_attribute: "sAMAccountName" 22 # Путь в LDAP дереве, с которого начинать поиск пользователей 23 user_search_dn: "CN=Users,DC=zakroma,DC=local" 24 # Атрибут, отвечающий за имя пользователя 25 user_firstname_attribute: "givenName" 26 # Атрибут, отвечающий за фамилию пользователя 27 user_lastname_attribute: "sn" 28 # Атрибут, отвечающий за email пользователя 29 user_email_attribute: "mail" 30 # Атрибут, в котором хранится список членств пользователя 31 membership_attribute_name: "member" 32 # Тип атрибута, определяющего членство пользователя 33 membership_attribute_type: "dn"
Особенности:
- Прямая интеграция с LDAP без промежуточных компонентов
 - Поддержка Active Directory и OpenLDAP
 - Гибкая настройка атрибутов и фильтров
 - Подходит для корпоративных развертываний с существующей LDAP-инфраструктурой
 
Метод авторизации: keycloak
Используется для интеграции с Keycloak, который может работать как с внутренними пользователями, так и с LDAP-каталогами. Keycloak предоставляет дополнительные возможности управления пользователями, ролями и группами.
Варианты настройки Keycloak:
- LDAP с ролями - синхронизация групп LDAP с ролями Keycloak
 - Внутренние пользователи - управление пользователями внутри Keycloak
 - LDAP с группами - прямая синхронизация групп LDAP без создания ролей
 
Настройка на версии keycloak >= 19.X.X
- 
Заходим консоль администрирования keycloak. Выбираем существующий или создаём новый realm.
 - 
Необходимо создать нового клиента. Переходим в Clients, в открывшимся окне нажимаем create и создаем нового Client ID с именем zakroma В новом окне настройки меняем: -
Client authentication: On-Authorization: On-Direct Access GrantsДля Keycloak 26.1 и выше - 
Настраиваем сервисный аккаунт Clients -> Zakroma -> Service Account Roles. Нажать
Assign role-> Выбратьadmin->Assign - 
Настраиваем маппинг для пользователей Clients -> Zakroma -> Сlient Scopes -> zakroma-dedicated . Add mapper -> By configuraton -> User Attribute. -
Mapper Type: User Attribute-Name: username-mapper-User Attribute: username-Token Claim Name: username-Claim JSON Type: String-Add to access token: ON - 
Realm Settings -> Keysкопируем kid и pyblic_key ключа с алгоритмом RS256 в настройки установки zakroma. - 
Clients -> zakroma -> Credentialsкопируем clientSecret в настройки установки zakroma. - 
Увеличим время жизни токена. Переходим на вкладки слева
Realm Settings -> Tokens. Проставим следующее значение:Access Token Lifespan: 10 minute
 - 
Настройка реестра пользователей
 
Для тестов без LDAPДля тестового использования возможно использовать внутренний реестр пользователей keycloak, без интеграции с ldap.
Используется при хранении пользователей в LDAP-каталоге
На вкладке User Federation -> Add new provider -> ldap
Далее заполняем значения (на примере OpenLdap):
1- `Vendor: other #other если используется OpenLdap и Active Directory если Active Directory` 2- `Connection URL: ldap://openldap.openldap.svc.cluster.local:389` 3- `Bind Type: simple` 4- `Bind DN: cn=admin,dc=demo,dc=zakroma,dc=ru` 5- `Bind Credential: xxx` 6- `Edit Mode: UNSYNCED` 7- `Users DN: ou=users,dc=demo,dc=zakroma,dc=ru` 8- `Username LDAP attribute: cn` 9- `RDN LDAP attribute: cn` 10- `UUID LDAP attribute: cn` 11- `User Object Classes: person, organizationalPerson`
и нажимаем Save.
Далее создаём маппер из Ldap в Keycloak: Mappers -> Add mapper
Создаем mapper c именем role-mapper c типом role-ldap-mapper.
Общая суть сводится к синхронизации групп AD с ролями пользователей в keycloak. Пример настроек:
- LDAP Roles DN: ou=groups,dc=demo,dc=zakroma,dc=ru
- Role Name LDAP Attribute: cn
- Role Object Classes: groupOfUniqueNames
- Membership LDAP Attribute: uniqueMember
- Membership Attribute Type: DN
- Membership User LDAP Attribute: uid
- Mode: LDAP_ONLY
- User Role Retrieve Strategy: LOAD_ROLES_BY_MEMBER_ATTRIBUTE
- Member-Of LDAP Attribute: memberOf
- ClientID: zakroma
Создаём ещё один mapper c именем username-mapper c типом user-attribute-ldap-mapper:
1- `User Model Attribute: username` 2- `LDAP Attribute: uid`
Синхронизируем пользователей.
Возвращаемся к настройкам на вкладке User Federation -> ldap -> settings и жмем на синхронизацию всех пользователей, тут должны увидеть что пользователи были добавлены.
В необходимых настройках Zakroma необходимо выставить значение свойства userRoleName в то название роли, в которая присутствует у всех нужных пользователей. Т.е. только пользователи с данной ролью смогут пользоваться системой Zakroma.
Используется для тестирования, либо нестандартной конфигурации
Создаём роли: Clients -> Zakroma -> Roles
По кнопке Create role добавить роль:
        - clouduser
Создаём пользователей в Keycloak: Users -> Add user
1Username: zakromaadmin 2First name: Admin 3Last name: Zakroma
Задаём пароль: Users -> zakromaadmin -> Credentials -> Set password
        - Temporary: off
Назначаем роль: User -> zakromaadmin -> Role mapping -> Assign Role
Переключить в режим Filter by Clients  -> в поиске написать “zakroma”
- clouduser
Используется при хранении пользователей в LDAP-каталоге с авторизацией через группы
Этот вариант настройки позволяет использовать группы LDAP для авторизации без создания ролей в Keycloak. Пользователи авторизуются на основе принадлежности к определенным группам в LDAP.
На вкладке User Federation -> Add new provider -> ldap
Далее заполняем значения (на примере OpenLdap):
1- `Vendor: other #other если используется OpenLdap и Active Directory если Active Directory` 2- `Connection URL: ldap://openldap.openldap.svc.cluster.local:389` 3- `Bind Type: simple` 4- `Bind DN: cn=admin,dc=demo,dc=zakroma,dc=ru` 5- `Bind Credential: xxx` 6- `Edit Mode: UNSYNCED` 7- `Users DN: ou=users,dc=demo,dc=zakroma,dc=ru` 8- `Username LDAP attribute: cn` 9- `RDN LDAP attribute: cn` 10- `UUID LDAP attribute: cn` 11- `User Object Classes: person, organizationalPerson`
и нажимаем Save.
Создаём маппер групп из LDAP в Keycloak: Mappers -> Add mapper
Создаем mapper c именем group-mapper c типом group-ldap-mapper.
Этот маппер синхронизирует группы LDAP с группами Keycloak. Пример настроек:
- LDAP Groups DN: ou=groups,dc=demo,dc=zakroma,dc=ru
- Group Name LDAP Attribute: cn
- Group Object Classes: groupOfUniqueNames
- Membership LDAP Attribute: uniqueMember
- Membership Attribute Type: DN
- Membership User LDAP Attribute: uid
- Mode: LDAP_ONLY
- User Groups Retrieve Strategy: LOAD_GROUPS_BY_MEMBER_ATTRIBUTE
- Member-Of LDAP Attribute: memberOf
- Mapped Group Attributes: cn
- Drop non-existing groups during sync: ON
Создаём(если не существует) маппер атрибутов пользователя c именем username-mapper c типом user-attribute-ldap-mapper:
1- `User Model Attribute: username` 2- `LDAP Attribute: uid`
Синхронизируем пользователей и групп
Возвращаемся к настройкам на вкладке User Federation -> ldap -> settings и выполняем синхронизацию:
- Жмем 
Sync all users- синхронизируем всех пользователей - Переходим в 
Mappers -> group-mapper -> Sync LDAP Groups to Keycloak- синхронизируем группы 
Настройка Закрома.Хранение для работы с группами
Для изменения стратегии синхрониации пользоватей на конфигурацию с группами необходимо поменять переменную sync_strategy и установить корневую группу для синхронизации, как показано ниже:
1- `sync_strategy: "groups"` 2- `user_group: "zakroma-users-group"` - название группы в keycloak, и в ldap соответственно. 3- `default_admin: "zakromaadmin"` - Имя пользователя в группе zakroma-users-group , который будет назначен администратором платформы.
Только пользователи, входящие в указанную группу, смогут пользоваться системой Zakroma.