此示例演示了如何将属于不同 AD 安全组的 AD 用户授予 ClickHouse 中的角色访问权限。它还演示了如何将用户添加到多个 AD 用户组,以便他们可以获得多个角色提供的访问权限。
在此环境中,我们拥有以下内容
- Windows Active Directory 域:
marsnet2.local
- 一个 ClickHouse 集群,
cluster_1S_3R
,在 1 分片 3 副本的集群配置上具有 3 个节点 - 3 个 AD 用户
AD 用户 | 描述 |
---|---|
clickhouse_ad_admin | ClickHouse 管理员用户 |
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 管理员组 |
clickhouse_ad_db1_users | 与对 db1.table1 的访问权限进行映射的组 |
clickhouse_ad_db2_users | 与对 db2.table1 的访问权限进行映射的组 |
- 示例 AD 环境和 UO 结构
- 示例 AD 安全组配置
- 示例 AD 用户配置
- 在 Windows AD 用户和组中,将每个用户添加到他们各自的组中,他们将被映射到 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 |
- 示例用户组成员资格
- 在 ClickHouse
config.xml
中,将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 标签 | 描述 | 示例值 |
---|---|---|
ldap_servers | 用于定义 ClickHouse 将使用的 ldap 服务器的标签 | NA |
marsnet_ad | 此标签是任意的,只是用于在 <user_directories> 部分中标识服务器的标签 | NA |
host | Active Directory 服务器或域的 FQDN 或 IP 地址 | marsdc1.marsnet2.local |
port | Active Directory 端口,通常对于非 SSL 为 389,对于 SSL 为 636 | 389 |
bind_dn | 将用于创建 AD 绑定的用户,如果普通用户不允许,则可以是专用用户 | {user_name}@marsnet2.local |
user_dn_detection | 有关 ClickHouse 如何查找 AD 用户的设置 | NA |
base_dn | AD OU 路径,用于开始搜索用户 | OU=Users,OU=ClickHouse,DC=marsnet2,DC=local |
search_filter | ldap 搜索过滤器,用于查找 AD 用户 | (&(objectClass=user)(sAMAccountName={user_name})) |
有关完整选项集,请参阅文档:https://clickhouse.ac.cn/docs/en/operations/external-authenticators/ldap#ldap-server-definition
- 在 ClickHouse
config.xml
中,使用<ldap>
条目添加<user_directories>
配置,并将其添加到每个 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 标签 | 描述 | 示例值 |
---|---|---|
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 | 系统应在基本 DN 的哪些级别中搜索组 | subtree |
prefix | AD 中组名称的前缀,此前缀将被删除以在 ClickHouse 中查找角色 | clickhouse_ |
有关所有选项的完整说明,请参考文档:https://clickhouse.ac.cn/docs/en/operations/external-authenticators/ldap#ldap-external-user-directory
注意::: 由于示例中的 AD 安全组带有前缀(例如:clickhouse_ad_db1_users
),因此当系统检索它们时,会删除前缀,系统将查找名为 ad_db1_users
的 ClickHouse 角色来映射到 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.
- 测试管理员用户的访问权限。例如
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 │
└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘