Exemplo
Este exemplo mostra como usuários do AD que pertencem a diferentes grupos de segurança do AD podem receber acesso por role no ClickHouse. Também mostra como um usuário pode ser adicionado a vários grupos de usuários do AD para receber acesso concedido por várias roles.
Neste ambiente, temos o seguinte:
- Um domínio do Windows Active Directory:
marsnet2.local - Um cluster do ClickHouse,
cluster_1S_3R, com 3 nós em uma configuração de cluster com 1 shard e 3 réplicas - 3 usuários do AD
| AD User | Descrição |
|---|---|
| clickhouse_ad_admin | usuário Admin do ClickHouse |
| clickhouse_db1_user | Usuário com acesso a db1.table1 |
| clickhouse_db2_user | Usuário com acesso a db2.table1 |
| ch_db1_db2_user | Usuário com acesso a db1.table1 e db2.table1 |
- 3 grupos de segurança do AD
| AD Group | Descrição |
|---|---|
| clickhouse_ad_admins | grupo de Admins do ClickHouse |
| clickhouse_ad_db1_users | Grupo mapeado para acesso a db1.table1 |
| clickhouse_ad_db2_users | Grupo mapeado para acesso a db2.table1 |
- Exemplo de ambiente AD e estrutura de UO:

- Exemplo de configuração de grupo de segurança do AD:

- Exemplo de configuração de usuário do AD:

- Em Usuários e Grupos do Windows AD, adicione cada usuário ao(s) respectivo(s) grupo(s); eles serão mapeados para as roles do ClickHouse (exemplo na próxima etapa).
| AD Security Group | ClickHouse Role |
|---|---|
| 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 and clickhouse_ad_db2_users |
- Exemplo de associação de usuários a grupos:

- No
config.xmldo ClickHouse, adicione a configuraçãoldap_serversa cada nó do 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 | Descrição | Valor de exemplo |
|---|---|---|
| ldap_servers | Tag usada para definir os servidores LDAP que serão usados pelo ClickHouse | NA |
| marsnet_ad | Esta tag é arbitrária e serve apenas como rótulo para identificar o servidor na seção <user_directories> |
NA |
| host | FQDN ou endereço IP do servidor ou domínio do Active Directory | marsdc1.marsnet2.local |
| port | Porta do Active Directory, normalmente 389 sem SSL ou 636 com SSL | 389 |
| bind_dn | Usuário que será usado para fazer o bind no AD; pode ser um usuário dedicado se usuários comuns não tiverem permissão | {user_name}@marsnet2.local |
| user_dn_detection | Configurações de como o ClickHouse localizará os usuários no AD | NA |
| base_dn | Caminho da OU no AD a partir do qual a busca pelos usuários será iniciada | OU=Users,OU=ClickHouse,DC=marsnet2,DC=local |
| search_filter | filtro de busca LDAP para localizar o usuário no AD | (&(objectClass=user)(sAMAccountName={user_name})) |
Consulte a documentação para ver o conjunto completo de opções: https://clickhouse.com/docs/operations/external-authenticators/ldap#ldap-server-definition
- No
config.xmldo ClickHouse, adicione a configuração<user_directories>com entradas<ldap>em cada nó do 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 | Descrição | Valor de exemplo |
|---|---|---|
| user_directories | Define quais autenticadores serão usados | NA |
| ldap | Contém as configurações dos servidores LDAP, neste caso, o AD que será usado | NA |
| server | Esta é a tag definida na seção <ldap_servers> |
marsnet2_ad |
| role_mapping | Define como os usuários autenticados serão mapeados entre grupos do AD e roles do ClickHouse | NA |
| base_dn | Caminho do AD que o sistema usará para iniciar a busca por grupos do AD | OU=Groups,OU=ClickHouse,DC=marsnet2,DC=local |
| search_filter | Filtro de busca LDAP para localizar os grupos do AD | (&(objectClass=group)(member={user_dn})) |
| attribute | Qual atributo do AD deve ser usado para identificar o usuário | CN |
| scope | Em quais níveis do base DN o sistema deve buscar os grupos | subtree |
| prefix | Prefixo dos nomes dos grupos no AD; esse prefixo será removido para localizar as roles no ClickHouse | clickhouse_ |
Consulte a documentação para ver o conjunto completo de opções: https://clickhouse.com/docs/operations/external-authenticators/ldap#ldap-external-user-directory
note:::
Como os grupos de segurança do AD foram prefixados no exemplo — ou seja, clickhouse_ad_db1_users — quando o sistema os recuperar, o prefixo será removido e o sistema procurará uma role do ClickHouse chamada ad_db1_users para fazer o mapeamento com clickhouse_ad_db1_users.
:::
- Crie bancos de dados de exemplo.
create database db1 on cluster 'cluster_1S_3R';
create database db2 on cluster 'cluster_1S_3R';- Crie tabelas de exemplo.
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;- Insira dados de exemplo.
insert into db1.table1
values
(1, 'a');
insert into db2.table1
values
(2, 'b');- Crie roles no 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';- Conceda os privilégios aos roles.
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;- Teste o acesso do usuário restrito db1. Por exemplo:
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)- Teste o acesso do usuário que tem acesso aos dois bancos de dados, db1 e db2. Por exemplo:
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.- Teste o acesso do usuário Admin. Por exemplo:
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 │
└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘