Важно: Данный раздел актуален для Платформы данных On-Premise.
1. Все пользователи, которые будут авторизоваться должны находиться в одном Подразделении (Organizational Unit = OU) в Active Directory (OU=widestore_users,DC=dcp,DC=local).
2. Группы пользователей в Active Directory (objectClass=group), с которыми необходим мэппинг ролей RT.WideStore:
3. Есть также условие: RT.WideStore не умеет работать с корнем LDAP, то есть нельзя указывать:
<base_dn>DC=corp,DC=realize,DC=dev</base_dn>
Это не отработает, нужно проваливаться на следующий уровень иерархии.
Структура пользователей Active Directory и пример структуры с информацией, которые нам потребуются:
Создаем роли:
CREATE ROLE WIDESTORE_ACCESS, WIDESTORE_DEVELOPERS, WIDESTORE_SECURITY;
Для просмотра результата выполните:
SHOW ROLES;
Создаем БД:
create database TEST_DEVELOPERS;
create database TEST_SECURITY;
Создаем таблицы в БД:
CREATE TABLE TEST_DEVELOPERS.t1 (x String) ENGINE = Memory AS SELECT 1;
CREATE TABLE TEST_SECURITY.t2 (x String) ENGINE = Memory AS SELECT 2;
Назначаем привилегии:
GRANT ALL ON TEST_DEVELOPERS.* to WIDESTORE_DEVELOPERS;
GRANT ALL ON TEST_SECURITY.* to WIDESTORE_SECURITY;
Просмотр привилегий для ролей:
SELECT * FROM system.grants
Для создания интеграции с LDAP будет лучше создать отдельный файл в подпапке для конфигураций:
cd /etc/clickhouse-server/config.d/
touch ldap.xml
chown -R clickhouse:clickhouse *
chmod 500 ldap.xml
Откройте редактор:
vim /etc/clickhouse-server/config.d/ldap.xml
Вставьте туда содержимое конфигурации:
<?xml version="1.0"?>
<clickhouse>
<!-- LDAP server definitions. -->
<ldap_servers> <!-- Секция с определением серверов LDAP -->
<DCP_LDAP> <!-- Кастомное имя для нашего сервера (используется ниже) -->
<host>server_name</host> <!-- Имя сервера, контроллера домена -->
<port>389</port> <!-- Порт на котором LDAP принимает запросы -->
<bind_dn>DCP\{user_name}</bind_dn> <!-- Строка назначения bind_db. В нашем случае будет подставляться имя_домена\имя_пользователя-->
<user_dn_detection> <!-- Секция с указанием где искать УЗ пользователей -->
<base_dn>OU=widestore_users,DC=dcp,DC=local</base_dn> <!-- Указываем наш OU, в котором находятся пользователи -->
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter> <!-- Фильтр для поиска УЗ (класс_объекта=user)&(имя_аккаунта={логин_который_вводит_пользователь}) -->
</user_dn_detection> <!-- Конец секции с указанием где искать УЗ пользователей -->
<enable_tls>no</enable_tls> <!-- Тестировали без TLS -->
</DCP_LDAP> <!-- Конец секции для нашего сервера LDAP-->
</ldap_servers> <!-- Конец секции с определением серверов LDAP-->
<!-- CONFIGURE ROLES ASSIGN -->
<user_directories> <!-- Секция с указанием параметров директорий пользователей для RT.WideStore-->
<ldap> <!-- Говорим что искать пользователей в LDAP-->
<server>DCP_LDAP</server> <!-- Указываем кастомное имя сервера, параметры подключения к которому выше-->
<roles> <!-- Секция с назначением ролей !!!ВСЕМ!!! пользователям, которых мы найдем в LDAP и которые будут авторизовываться через LDAP-->
<WIDESTORE_ACCESS /> <!--Имя предварительно созданной роли в RT.WideStore-->
</roles> <!-- Конец секции-->
<role_mapping> <!-- Начало секции для определения мэппинга групп Active Directory к ролям RT.WideStore-->
<base_dn>OU=main,DC=dcp,DC=local</base_dn> <!-- Указываем корневую OU содержащую наши группы, которые могут быть вложенными внутрь другой OU-->
<scope>subtree</scope> <!-- Указываем уровень вложенности поиска -->
<search_filter>(&(objectClass=group)(member={user_dn}))</search_filter> <!-- Указываем фильтр поиска групп (класс_объекта=group)&(участник_группы=DN_пользователя) -->
<attribute>cn</attribute> <!-- Указываем какой атрибут найденного в LDAP объекта мы будем использовать (CN, который равняется имени группы) и сравнивать его с именем роли в RT.WideStore-->
<prefix></prefix> <!-- Указываем префикс имен групп Active Directory, которые соответствуют именам ролей в RT.WideStore без префикса -->
</role_mapping> <!-- Конец секции-->
</ldap> <!-- Конец секции-->
</user_directories> <!-- Конец секции-->
</clickhouse>
При отсутствии секции <roles>....</roles> RT.WideStore будет пытаться назначить роли найденные по фильтру и соответствующие списку групп Active Directory в которых состоит пользователь и мапить их с названием локальной роли в RT.WideStore
В случае отсутствия локальной роли в RT.WideStore в логах можно увидеть сообщения:
2022.10.27 15:26:26.966545 [ 45046 ] {} <Warning> Access(ldap): Unable to grant mapped role 'Role1' to user 'User1': role not found
2022.10.27 15:26:26.966625 [ 45046 ] {} <Warning> Access(ldap): Unable to grant mapped role 'Role2' to user 'User1': role not found
2022.10.27 15:26:26.966668 [ 45046 ] {} <Warning> Access(ldap): Unable to grant mapped role 'Role3' to user 'User1': role not found
Для первого применения конфигурации необходимо перезапустить сервис:
systemctl restart clickhouse-server.service
или
clickhouse restart
Роли назначаются после авторизации пользователя и подтягиваются из Active Directory после применения правильной конфигурации.
Просмотр пользователей и назначенных им ролей:
SELECT * FROM system.role_grants
Подключаемся пользователем ws_developer2 с запросом пароля:
clickhouse-client --user ws_developer2 --password
Проверяем роли пользователя и пробуем прочитать тестовые таблицы:
show grants
select * from TEST_DEVELOPERS.t1;
select * from TEST_SECURITY.t2;