clickhouse用户配置详解

参考网页:

​ ClickHouse的用户及访问权限控制均可由配置文件直接进行标准化配置,一般由users.xml文件设置,该文件名在/etc/clickhouse-server/config.xml中修改,详情可参考clickhouse-server配置文件详解,若需要对某一个用户单独设置例如dba用户,可放入/etc/clickhouse-server/users.d/dba.xml,下面会描述该文件的配置示例。

一、users.xml文件示例

​ 以下是一个标准默认的users.xml用户配置示例,可直接测试使用,对用户的权限管理将会单独使用一篇文章来进行说明,后面将会对该文件分开描述。

​ 有文件中可以看出users.xml主要由以下三部分设置组成:

  • profile:类似于用户角色,可以实现最大内存、负载方式等配置的服用
  • users:设置包括用户名、密码、权限等
  • quotas:限制一段时间内的资源使用等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<max_memory_usage>10000000000</max_memory_usage>
<load_balancing>random</load_balancing>
<constraints><!-- 配置约束-->
<max_memory_usage>
<min>5000000000</min>
<max>20000000000</max>
</max_memory_usage>
<load_balancing>
<readonly/>
</load_balancing>
</constraints>
</default>
</default>

<readonly>
<readonly>1</readonly>
</readonly>
</profiles>

<users>
<default>
<password></password>
<networks incl="networks" replace="replace">
<ip>::1</ip>
<ip>127.0.0.1</ip>
</networks>

<profile>default</profile>

<quota>default</quota>
</default>
<!--下面两个用户为测试用户,可以不配置-->
<seluser>
<password>meiyoumima</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
</seluser>
<inuser>
<password>meiyoumima</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</inuser>

</users>

<!-- Quotas. -->
<quotas>
<default>
<interval>
<duration>3600</duration>
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
</quotas>
</yandex>

二、profile设置详解

users.xml用户配置文件中profiles部分定义了一些可复用的配置,他的作用类似于用户角色,可定义多个profile,并为不同的profile定义不同的配置,其中每个参数的含义可参考前面的参考网页二,并在后续使用中不断完善,以下面配置为例:

1、profile配置详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<yandex>
<!--定义profiles-->
<profiles>
<!--可自定义名称,default是默认存在的角色名称-->
<default>
<max_memory_usage>10000000000</max_memory_usage>
<load_balancing>random</load_balancing>

<constraints><!-- 配置约束-->
<max_memory_usage>
<min>5000000000</min>
<max>20000000000</max>
</max_memory_usage>
<load_balancing>
<readonly/>
</load_balancing>
</constraints>
</default>

<!--自定义readonly角色-->
<readonly>
<readonly>1</readonly>
</readonly>
</profiles>

2、profile配置约束

profile中有约束条件,从而限制其中的参数值被任意修改,约束条件有三种规则:

  1. Min:最小值约束,对应参数取值不能小于该值

  2. Max:最大值约束,对应参数取值不能大雨该值

  3. Readonly:只读约束,对应参数禁止修改

profile中default的constraints配置约束会作为全局约束,自动被其他profile继承。


​ 以上述配置示例,将default用户角色中的max_memory_usage设置了默认值以及最大最小阈值,load_balancing设置为了只读,对其配置进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@xxxx docker_compose]# docker exec -it 92b25e101be0 /bin/bash
# 所有的profile设置中,default是默认配置,必须存在,利用docker-compose配置后容器会无法启动
root@clickhouse-server_1:/# clickhouse-client
ClickHouse client version 20.3.4.10 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.4 revision 54433.

# 设置max_memory_usage为50,他的最小值约束起了作用,禁止修改为该值
clickhouse-server_1 :) set max_memory_usage = 50

SET max_memory_usage = 50

Received exception from server (version 20.3.4):
Code: 452. DB::Exception: Received from localhost:9000. DB::Exception: Setting max_memory_usage shouldn't be less than 5000000000.

0 rows in set. Elapsed: 0.058 sec.

## 修改load_balancing,禁止修改该值
clickhouse-server_1 :) set load_balancing = 'nearest_hostname'

SET load_balancing = 'nearest_hostname'

Received exception from server (version 20.3.4):
Code: 452. DB::Exception: Received from localhost:9000. DB::Exception: Setting load_balancing should not be changed.

0 rows in set. Elapsed: 0.001 sec.

3、profile切换和继承

1、profile切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 根据上面的配置文件,可以看到这次profile中包含default和readonly,clickhouse默认登陆用户为default,profile为default,可切换到readonly,切换后会获得相应的配置
clickhouse-server_1 :) set profile = 'readonly'

SET profile = 'readonly'

Ok.

0 rows in set. Elapsed: 0.001 sec.
# 从上面配置可以看到,设置的max_memory_usage符合约束条件,但由于目前是readonly的profile,所有参数都不能修改
clickhouse-server_1 :) set max_memory_usage = 10000000001

SET max_memory_usage = 10000000001

Received exception from server (version 20.3.4):
Code: 164. DB::Exception: Received from localhost:9000. DB::Exception: Cannot modify 'max_memory_usage' setting in readonly mode.

0 rows in set. Elapsed: 0.001 sec.

2、profile继承

​ profile配置支持继承,实现继承的方式是在profile配置中先引入其他的profile名称,但若有冲突,后面的配置会覆盖之前继承的配置,示例如下:

1
2
3
4
5
6
7
8
9
10
11
<profiles>
<test1>
<allow_experimental_live_view>1</allow_experimental_live_view>
<distributed_product_mode>allow</distributed_product_mode>
</test1>
<!--normal_inherit profile会继承test1里面的两个参数配置,但它自身也设置了distributed_product_mode和test1的冲突,后面自己设置的deny会覆盖掉test1的allow设置-->
<normal_inherit>
<profile>test1</profile>
<distributed_product_mode>deny</distributed_product_mode>
</normal_inherit>
</profiles>

三、users配置详解

users.xml用户配置文件中users模块可以自定义配置用户属性,例如用户名、密码、权限等,用官网默认配置会发现users.xml文件中会默认创建default用户,使用clickhouse-client无参数登陆会通过该用户登陆,将以下面的示例进行说明:

1、users配置详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<users>
<!--default用户会默认存在-->
<default>
<password></password>
<networks incl="networks" replace="replace">
<ip>::1</ip>
<ip>127.0.0.1</ip>
</networks>

<profile>default</profile>

<quota>default</quota>
</default>
<!--下面两个用户为测试用户,可以不配置-->
<seluser>
<password>meiyoumima</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
</seluser>
<inuser>
<password>meiyoumima</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</inuser>

</users>

2、users属性详解

​ 一个完整的用户设置,需要包含下面的属性

  • username:用户名
  • password:密码设置
  • networks:网络设置,一般用来限制可登陆的客户端地址
  • profile:该用户所使用的profile
  • quota

1. username

1
2
3
4
5
6
7
8
9
10
11
12
13
<users>
<!--用户的第一行设置为其username-->
<default>
<password></password>
<networks incl="networks" replace="replace">
<ip>::1</ip>
<ip>127.0.0.1</ip>
</networks>

<profile>default</profile>

<quota>default</quota>
</default>

2. password

​ 登陆密码,clickhouse支持明文、SHA256加密、double_sha1三种设置方式,但SHA256和sha1都是散列算法,明文和密文一一对应,也可通过密文很容易进行解密…

  • 明文登陆
1
2
3
4
<!--直接在用户中通过password标签定义,中间字符即为登陆密码-->
<password>meiyoumima</password>
<!--类似上述default用户,中间为空即代表没有密码-->
<password></password>
  • SHA256加密登陆
1
2
3
4
5
6
7
## 官方推荐生成密码方式,RSZ4QZMc为随机的明文密码,21d076f...为最终密文
[root@xxxx docker_compose]# PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
RSZ4QZMc
21d076f8340b5d836769a35c4d658d7b3091e7e1ccb18d66e9e1a7b6eef823df
### 也可通过openssl生成密文,明文为123,输出为密文
[root@xxxx docker_compose]# echo -n 123 | openssl dgst -sha256
(stdin)= a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
1
2
<!--设置方式-->
<password_sha256_hex>21d076f8340b5d836769a35c4d658d7b3091e7e1ccb18d66e9e1a7b6eef823df</password_sha256_hex>
  • double_sha1加密登陆
1
2
3
4
5
6
7
# 官方推荐生成密码方式,+0agrMRX为urandom生成的明文,407732...为最终密文
[root@xxxx docker_compose]# PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
+0agrMRX
407732ce14cdea57dc0a2ff9c64773472f8cd666
### 通过openssl生成密文,明文为123,输出为密文
[root@xxxx docker_compose]# echo -n 123 | openssl dgst -sha1 -binary | openssl dgst -sha1
(stdin)= 23ae809ddacaf96af0fd78ed04b6a265e05aa257
1
2
<!--设置方式-->
<password_double_sha1_hex>407732ce14cdea57dc0a2ff9c64773472f8cd666</password_double_sha1_hex>

3. networks

​ networks表示允许被登陆clickhouse服务器的客户端列表,支持通过ip、host、host_regexp方式设置

  • ip设置
1
2
3
4
5
6
7
8
9
<!--通过ip直接设置-->
<ip>1.1.1.1</ip>
<ip>10.0.0.1/8</ip>

<!--为所有客户端打开权限-->
<ip>::/0</ip>
<!--仅允许本地登陆-->
<ip>::1</ip>
<ip>127.0.0.1</ip>
  • host设置
1
<host>example1.host.com</host>
  • host_regexp设置
1
2
<!--通过主机名的正则表达式设置-->
<host_regexp>^example\d\d-\d\d-\d\.host\.ru$</host_regexp>

4. profile设置

​ 该用户所使用的profile设置,直接写入即可

1
2
3
<default>
<profile>default</profile>
</default>

5. quota设置

​ 该用户单位时间内的资源限制,直接使用quotas设置的名称即可

1
<quota>default</quota>

6. database设置

​ 该设置可以限制当前用户select时返回的行,以完成简单的行数据安全,示例如下:

1
2
3
4
5
6
7
8
9
10
<!--以下配置强制用户user1只能看到database_name.table1表中id为1000的行,其中filter支持UInt8类型的值,并支持比较和逻辑运算符-->
<user1>
<databases>
<database_name>
<table1>
<filter>id = 1000</filter>
</table1>
</database_name>
</databases>
</user1>

四、quotas配置详解

1、quotas配置详情

users.xml配置文件中的quotas标签是限制了单位时间内的系统资源使用量,而不是限制单个查询的系统资源使用量**(server的配置可以设置限制单个查询的系统资源的使用量),值为0表示不限制,如下面示例所示,表示仅跟踪每小时的资源消耗,而不限制使用情况**,当设置阈值之后,对应资源达到阈值,正在进行的操作也会中断。

1
2
3
4
5
6
7
8
9
10
11
12
<quotas>
<default> <!--自定义名称-->
<interval>
<duration>3600</duration>
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
</quotas>

2、quotas属性详解

1. duration设置

​ duration表示累计的时间周期,单位为秒,达到该时间周期后,清除所有收集的值,接下来的周期,将重新开始计算,当服务重启时,也会清除所有的值,重新开始新的周期。

1
<duration>3600</duration>

2. queris设置

​ queris表示在该周期内,允许执行的查询次数,0为不限制。

1
2
<!--在duration设置周期时间内只允许查询1000次-->
<queries>1000</queries>

3. errors设置

​ errors表示在该周期内,允许引发异常的查询次数,0为不限制。

1
<errors>0</errors>

4. result_rows设置

​ result_rows表示在周期内,允许查询返回的结果行数,0为不限制。

1
<result_rows>0</result_rows>

5. read_rows设置

​ read_rows表示在周期内,允许远程节点读取的数据行数,0为不限制。

1
<read_rows>0</read_rows>

6. execution_time设置

​ execution_time表示允许查询的总执行时间(又叫wall time),单位为秒,0为不限制。

1
<execution_time>0</execution_time>