Пример
В этом примере показано, как пользователям AD, входящим в разные группы безопасности AD, можно предоставить ролевой доступ в ClickHouse. Также показано, как пользователя можно добавить в несколько групп пользователей AD, чтобы он получил доступ, предоставляемый несколькими ролями.
В этой среде у нас есть следующее:
- Домен Windows Active Directory:
marsnet2.local - Кластер ClickHouse
cluster_1S_3Rс 3 узлами в конфигурации: 1 сегмент, 3 реплики - 3 пользователя AD
| Пользователь AD | Описание |
|---|---|
| clickhouse_ad_admin | Пользователь ClickHouse Admin |
| clickhouse_db1_user | Пользователь с доступом к db1.table1 |
| clickhouse_db2_user | Пользователь с доступом к db2.table1 |
| ch_db1_db2_user | Пользователь с доступом к db1.table1 и db2.table1 |
- 3 группы безопасности AD
| Группа AD | Описание |
|---|---|
| clickhouse_ad_admins | Группа ClickHouse Admins |
| clickhouse_ad_db1_users | Группа, сопоставляемая с доступом к db1.table1 |
| clickhouse_ad_db2_users | Группа, сопоставляемая с доступом к db2.table1 |
- Пример среды AD и структуры UO:

- Пример конфигурации группы безопасности AD:

- Пример конфигурации пользователя AD:

- В Windows AD Users and Groups добавьте каждого пользователя в соответствующую группу или группы — они будут сопоставлены с ролями ClickHouse (пример на следующем шаге).
| Группа безопасности AD | Роль ClickHouse |
|---|---|
| clickhouse_ad_admin | clickhouse_ad_admins |
| clickhouse_db1_user | clickhouse_ad_db1_users |
| clickhouse_db2_user | clickhouse_ad_db2_users |
| ch_db1_db2_user | clickhouse_ad_db1_users и clickhouse_ad_db2_users |
- Пример членства пользователя в группах:

- В
config.xmlClickHouse добавьте конфигурациюldap_serversна каждый узел ClickHouse.
<ldap_servers>
<marsnet2_ad>
<host>marsdc1.marsnet2.local</host>
<port>389</port>
<bind_dn>{user_name}@marsnet2.local</bind_dn>
<user_dn_detection>
<base_dn>OU=Users,OU=ClickHouse,DC=marsnet2,DC=local</base_dn>
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter>
</user_dn_detection>
<enable_tls>no</enable_tls>
</marsnet2_ad>
</ldap_servers>| xml tag | Описание | Пример значения |
|---|---|---|
| ldap_servers | Тег, используемый для определения LDAP-серверов, которые будут использоваться ClickHouse | NA |
| marsnet_ad | Этот тег является произвольным и служит лишь меткой для идентификации сервера в разделе <user_directories> |
NA |
| host | FQDN или IP-адрес сервера или домена Active Directory | marsdc1.marsnet2.local |
| port | Порт Active Directory, обычно 389 без SSL или 636 с SSL | 389 |
| bind_dn | Пользователь, который будет использоваться для bind к AD; это может быть выделенная учетная запись, если обычным пользователям bind запрещен | {user_name}@marsnet2.local |
| user_dn_detection | Настройки, определяющие, как ClickHouse будет находить пользователей AD | NA |
| base_dn | Путь к OU в AD, с которого будет начинаться поиск пользователей | OU=Users,OU=ClickHouse,DC=marsnet2,DC=local |
| search_filter | LDAP search filter для поиска пользователя AD | (&(objectClass=user)(sAMAccountName={user_name})) |
Полный набор параметров см. в документации: https://clickhouse.com/docs/operations/external-authenticators/ldap#ldap-server-definition
- В
config.xmlClickHouse добавьте конфигурацию<user_directories>с записями<ldap>на каждом узле ClickHouse.
<user_directories>
<users_xml>
<path>users.xml</path>
</users_xml>
<local_directory>
<path>/var/lib/clickhouse/access/</path>
</local_directory>
<ldap>
<server>marsnet2_ad</server>
<role_mapping>
<base_dn>OU=Groups,OU=ClickHouse,DC=marsnet2,DC=local</base_dn>
<search_filter>(&(objectClass=group)(member={user_dn}))</search_filter>
<attribute>CN</attribute>
<scope>subtree</scope>
<prefix>clickhouse_</prefix>
</role_mapping>
</ldap>
</user_directories>| xml tag | Описание | Пример значения |
|---|---|---|
| user_directories | Определяет, какие аутентификаторы будут использоваться | NA |
| ldap | Содержит настройки LDAP-серверов в используемом AD | NA |
| server | Тег, определённый в разделе <ldap_servers> |
marsnet2_ad |
| role_mapping | Определяет, как аутентифицированные пользователи будут сопоставляться с группами AD и ролями ClickHouse | NA |
| base_dn | Путь AD, с которого система начнёт поиск групп AD | OU=Groups,OU=ClickHouse,DC=marsnet2,DC=local |
| search_filter | LDAP-фильтр поиска для поиска групп AD | (&(objectClass=group)(member={user_dn})) |
| attribute | Какой атрибут AD следует использовать для идентификации пользователя | CN |
| scope | На каких уровнях base DN система должна искать группы | subtree |
| prefix | Префикс имён групп в AD; он будет удалён при поиске ролей в ClickHouse | clickhouse_ |
Полный набор параметров см. в документации: https://clickhouse.com/docs/operations/external-authenticators/ldap#ldap-external-user-directory
note:::
Поскольку в примере группы безопасности AD имеют префикс — то есть clickhouse_ad_db1_users, — при получении этих групп системой префикс будет удалён, и система будет искать роль ClickHouse с именем ad_db1_users, чтобы сопоставить её с clickhouse_ad_db1_users.
:::
- Создайте примеры баз данных.
create database db1 on cluster 'cluster_1S_3R';
create database db2 on cluster 'cluster_1S_3R';- Создайте демонстрационные таблицы.
create table db1.table1 on cluster 'cluster_1S_3R'
(
id Int32,
column1 String
)
engine = MergeTree()
order by id;
create table db2.table1 on cluster 'cluster_1S_3R
(
id Int32,
column1 String
)
engine = MergeTree()
order by id;- Вставьте пример данных.
insert into db1.table1
values
(1, 'a');
insert into db2.table1
values
(2, 'b');- Создайте роли в ClickHouse.
create role ad_admins on cluster 'cluster_1S_3R';
create role ad_db1_users on cluster 'cluster_1S_3R';
create role ad_db2_users on cluster 'cluster_1S_3R';- Предоставьте привилегии ролям.
GRANT SHOW, SELECT, INSERT, ALTER, CREATE, DROP, UNDROP TABLE, TRUNCATE, OPTIMIZE, BACKUP, KILL QUERY, KILL TRANSACTION, MOVE PARTITION BETWEEN SHARDS, ACCESS MANAGEMENT, SYSTEM, dictGet, displaySecretsInShowAndSelect, INTROSPECTION, SOURCES, CLUSTER ON *.* on cluster 'cluster_1S_3R' TO ad_admins WITH GRANT OPTION;
GRANT SELECT ON db1.table1 on cluster 'cluster_1S_3R' TO ad_db1_users;
GRANT SELECT ON db2.table1 on cluster 'cluster_1S_3R' TO ad_db2_users;- Проверьте доступ для пользователя db1 с ограниченными правами. Например:
root@chnode1:/etc/clickhouse-server# clickhouse-client --user clickhouse_db1_user --password MyPassword123 --secure --port 9440 --host chnode1.marsnet.local
ClickHouse client version 24.1.3.31 (official build).
Connecting to chnode1.marsnet.local:9440 as user clickhouse_db1_user.
Connected to ClickHouse server version 24.1.3.
clickhouse :) select * from db1.table1;
SELECT *
FROM db1.table1
Query id: b04b92d6-5b8b-40a2-a92a-f06f15774930
┌─id─┬─column1─┐
│ 1 │ a │
└────┴─────────┘
1 row in set. Elapsed: 0.004 sec.
clickhouse :) select * from db2.table1;
SELECT *
FROM db2.table1
Query id: 7f7eaa44-7b47-4184-807a-6968a56057ad
Elapsed: 0.115 sec.
Received exception from server (version 24.1.3):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: clickhouse_db1_user: Not enough privileges. To execute this query, it's necessary to have the grant SELECT(id, column1) ON db2.table1. (ACCESS_DENIED)- Проверьте доступ для пользователя, у которого есть права на обе базы данных — db1 и db2. Например:
root@chnode1:/etc/clickhouse-server# clickhouse-client --user ch_db1_db2_user --password MyPassword123 --secure --port 9440 --host chnode1.marsnet.local
ClickHouse client version 24.1.3.31 (official build).
Connecting to chnode1.marsnet.local:9440 as user ch_db1_db2_user.
Connected to ClickHouse server version 24.1.3.
clickhouse :) select * from db1.table1;
SELECT *
FROM db1.table1
Query id: 23084744-08c2-48bd-8635-a23438812026
┌─id─┬─column1─┐
│ 1 │ a │
└────┴─────────┘
1 row in set. Elapsed: 0.005 sec.
clickhouse :) select * from db2.table1;
SELECT *
FROM db2.table1
Query id: f9954ec4-d8d9-4b5a-9f68-a7aa79a1bb4a
┌─id─┬─column1─┐
│ 2 │ b │
└────┴─────────┘
1 row in set. Elapsed: 0.004 sec.- Проверьте доступ от имени пользователя Admin. Например:
root@chnode1:/etc/clickhouse-server# clickhouse-client --user clickhouse_ad_admin --password MyPassword123 --secure --port 9440 --host chnode1.marsnet.local
ClickHouse client version 24.1.3.31 (official build).
Connecting to chnode1.marsnet.local:9440 as user clickhouse_ad_admin.
Connected to ClickHouse server version 24.1.3.
clickhouse :) create table db1.table2 on cluster 'cluster_1S_3R'
(
id Int32,
column1 String
)
engine = MergeTree()
order by id;
CREATE TABLE db1.table2 ON CLUSTER cluster_1S_3R
(
`id` Int32,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
Query id: 6041fd32-4294-44bd-b442-3fdd41333e6f
┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode1.marsnet.local │ 9440 │ 0 │ │ 2 │ 2 │
└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 1 │
└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode3.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │
└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘