clickhourse-002-用户账户和权限管理
**安装完之后首先做的应该如何设置用户密码以及权限控制。因为和MySQL、MongoDB等数据库的用户管理完全不一样,为方便自己以后直接查阅,写此文章做下简单记录。关于ClickHouse的说明和演示都是采用的20.8.3.18版本环境**
## 一、账户和权限说明
**ClickHouse作为一个分析类型(OLAP)的数据库系统,相对于MySQL数据库在用户管理方面有很大不同,可以通过修改配置文件来实现用户权限管理的,也可以类似MySQL和mongo那样采用sql命令进行创建账户和授权,后面博文会介绍和演示ClickHouse创建账户和授权这一块**。
在安装好ClickHouse之后,其默认的配置文件在/etc/clickhouse-server目录下,对应的配置文件为users.xml,ClickHouse使用它来定义用户相关的配置项。
注意一点,修改了user.xml的参数之后是即时生效的,如有问题可以查看其错误日志。好了,现在开始对这些进行说明,先熟悉用户权限管理这一方面的相关操作。
**现在开始对其进行说明,主要包含以下几个方面:**
```
Settings profiles
User settings
Constraints on Settings
Quotas
Permissions for queries
Access Rights
```
## 二、Settings profiles说明
官网地址:
https://clickhouse.tech/docs/zh/operations/settings/settings-profiles/
**:自定义profile,可以在它下面设置相关参数,如:最大内存使用、只读等等。更多的配置参数后续会介绍,也而已看官网文档,可以设置多个profile**
**下面简单演示个profiles :**
```
10000000000 0 random 1 100000000 readonly 100000
```
**该示例指定了3个profile:default和readonly,test。 默认有一个特殊用途:必须始终存在并且在启动服务器时应用。default 配置文件包含默认设置。 profile文件可以相互继承,只需要在配置文件中列出即可,如上定义一个test的profile**
```
readonly 100000
```
**test的profile继承了readonly的profile,包含了其所有的配置,并且使用新参数来覆盖其原有的配置。设置了之后如何使用呢?有二种方法,第1是直接在终端命令行里进行设置,第2个是在users.xml中的users选项组里进行指定(后面会说明)**
**下面是官方提供的配置:**
```
8 1000000000 100000000000 1000000 any 1000000 1000000000 100000 100000000 break 600 1000000 15 25 100 50 2 25 50 100 1
```
## 三、Constraints on Settings:约束
**官方地址:**
https://clickhouse.tech/docs/zh/operations/settings/constraints-on-settings/
**在user.xml配置文件的profile选项组下constraints选项组里定义对设置的约束,并禁止用户使用SET查询更改某些设置。constraints标签可以设置一组约束条件,以限制profile内的参数值被随意修改,约束条件有如下三种规则:
min:最小值约束,在设置相应参数的时候,取值不能小于该阈值;
max:最大值约束,在设置相应参数的时候,取值不能大于该阈值;
readonly:只读约束,该参数值不允许被修改。**
需要在profile选项组里设置constraints模板
**说明:如果违反约束,则会引发异常,并且设置实际上不会更改。支持三种约束类型:最小,最大,只读。 最小和最大约束为数字设置指定上限和下限,并且可以组合使用。 只读约束指定用户完全不能更改相应的设置。**
如:
```
10000000000 0 random 1000000 2000000
```
**说明:在default默认profile中定义的constraints约束,将作为默认的全局约束,自动被其他profile继承。例子中约束了参数max_memory_usage的最大最小值和参数force_index_by_date的只读属性,不能修改。**
**如果违反约束则会报错:**
```
tidb06 :) set max_memory_usage = 1231230000
SET max_memory_usage = 1231230000
Received exception from server (version 20.8.3):
Code: 452. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Setting max_memory_usage shouldn't be greater than 2000000.
tidb06 :) set max_memory_usage = 1231
SET max_memory_usage = 1231
Received exception from server (version 20.8.3):
Code: 452. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Setting max_memory_usage shouldn't be less than 1000000.
tidb06 :) set max_memory_usage = 1000002
SET max_memory_usage = 1000002
Ok.
0 rows in set. Elapsed: 0.001 sec.
tidb06 :) set force_index_by_date = 1
SET force_index_by_date = 1
Received exception from server (version 20.8.3):
Code: 452. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Setting force_index_by_date should not be changed.
```
## 四、Quotas:配额
**限制使用资源,配额在用户配置中设置.这通常是 ‘users.xml’.限制有二种类型:一是在固定周期里的执行次数(quotas),二是限制用户或则查询的使用资源(profiles)**
官方文档:
https://clickhouse.tech/docs/zh/operations/quotas/
**在user.xml配置文件的选项组quotas里设置,限制该用户一段时间内的资源使用,即对一段时间内运行的一组查询施加限制,而不是限制单个查询。还具有限制单个查询的复杂性的功能。模板:**
```
--指定quotas名称
3600 0 0 0 0 0
```
**默认情况下,配额只跟踪每小时的资源消耗,而不限制使用情况。
每次请求后,计算出的每个时间间隔的资源消耗将输出到服务器日志中。
默认情况下,配额仅跟踪每小时的资源消耗,而没有限制使用情况。在每个请求之后,将为每个时间间隔计算的资源消耗输出到服务器日志。**
**说明:**
```
:配额规则名。
:配置时间间隔,每个时间内的资源消耗限制。
:时间周期,单位秒。
:时间周期内允许的请求总数,0表示不限制。
:时间周期内允许的异常总数,0表示不限制。
:时间周期内允许返回的行数,0表示不限制。
:时间周期内允许在分布式查询中,远端节点读取的数据行数,0表示不限制。
:时间周期内允许执行的查询时间,单位是秒,0表示不限制。
上面示例中的配置,属性值均为0,所以资源配额不做任何限制。
```
**现在继续声明另外一组配额:(官方给的配额样例)**
```
3600 1000 100 1000000000 100000000000 900 86400 10000 1000 5000000000 500000000000 7200
```
**为 ‘statbox’ 配额,限制设置为每小时和每24小时(86,400秒)。 时间间隔从实现定义的固定时刻开始计数。 换句话说,24小时间隔不一定从午夜开始。间隔结束时,将清除所有收集的值。 在下一个小时内,配额计算将重新开始。**
**以下是可以限制的配额:**
```
queries – The total number of requests.
errors – The number of queries that threw an exception.
result_rows – The total number of rows given as the result.
read_rows – The total number of source rows read from tables for running the query, on all remote servers.
execution_time – The total query execution time, in seconds (wall time).
```
如果在至少一个时间间隔内超出限制,则会引发异常,其中包含有关超出了哪个限制、哪个时间间隔以及新时间间隔开始时(何时可以再次发送查询)的文本。
**提示:服务器重新启动时,将重置配额。**
**quotas 在配置的“用户”部分分配给用户,如果不是根据时间周期而是根据查询的资源消耗来进行限制,则在user.xml里的profile里进行设置,如参数:**
```
1:max_memory_usage:在单个ClickHouse服务进程中,运行一次查询限制使用的最大内存用量,默认值为10G;
2:max_memory_usage_for_user:在单个ClickHouse服务进程中,以用户为单位进行统计,单个用户在运行查询时,限制使用的最大内存用量,默认值为0,即不做限制;
3:max_memory_usage_for_all_queries:在单个ClickHouse服务进程中,所有运行的查询累加在一起,限制使用的最大内存用量,默认为0不做限制;
4:max_partitions_per_insert_block:在单次INSERT写入的时候,限制创建的最大分区个数,默认值为100个。如果超出这个阈值数目,将会得到异常;
5:max_rows_to_group_by:在执行GROUP BY聚合查询的时候,限制去重后的聚合KEY的最大个数,默认值为0,即不做限制。当超过阈值数量的时候,其处理方式由group_by_overflow_mode参数决定;
6:group_by_overflow_mode:当max_rows_to_group_by熔断规则触发的时候,有三种处理形式:
throw抛出异常,此乃默认值;
break立即停止查询,并返回当前部分的数据;
any仅以当前已存在的聚合KEY,继续完成聚合查询;
7:max_bytes_before_external_group_by:在执行GROUP BY聚合查询的时候,限制使用的最大内存用量,默认值为0,即不做限制。当超过阈值数量的时候,聚合查询将会进一步借用本地磁盘。
```
## 五、User settings:用户配置
官方地址:
https://clickhouse.tech/docs/zh/operations/settings/settings-users/
**在user.xml配置文件的users选项组是配置自定义用户,定义一个新用户,必须包含以下几项属性:用户名、密码、访问ip、数据库、表等等。它还可以应用上面的profile、quota。**
**1、 users标签介绍:**
```
--配置的用户
--明文密码
--加密密码,二选一
--允许登录的地址,用于限制用户登录的客户端地址
profile_name --指定用户的profile
default -- 指定用户的quota,限制用户使用资源
--指定数据库
--指定数据表
expression
说明:默认配置了default用户,在此之前的所有示例中,一直使用的是这个用户。
```
**2、密码格式**
```
:自定义用户
:用户密码
密码可以以纯文本、SHA256(十六进制格式)、password_double_sha1_hex(和MySQL兼容)指定,设置方法如下:
2.1纯文本:
password
2.2sha256:
password
从shell生成密码的示例:
PASSWORD=$(base64 < /dev/urandom | head -c12); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
第一行明文,第二行sha256
2.3sha1:password
从shell生成密码的示例:
PASSWORD=$(base64 < /dev/urandom | head -c12); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
第一行明文,第二行sha1
```
**3、网络限制**
```
:限制用户登录的客户端地址
可以通过IP,主机等进行限制
:IP地址,如10.0.0.1
:主机名,如example01.host.ru
:^example\d\d-\d\d-\d\.host\.ru$
来自任何IP:
:: / 0
来自本机:
::1 127.0.0.1
```
**4.users标签样例:**
```
c0952f7212b0161d07c6f45f00fdb73e17430f11 ::/0 --允许全网访问
default default
```
```
:指定用户的profile
:指定用户的quota,限制用户使用资源
:指定用户访问的数据库
:指定用户访问的表
:指定用户访问的过滤器,限制返回符合条件的行。如:id = 1 ,即查询表只返回id=1的行
```
```
[root@tidb06 ~]# PASSWORD=$(base64 < /dev/urandom | head -c12); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
j780UJy9D2tn
c0952f7212b0161d07c6f45f00fdb73e17430f11
[root@tidb06 ~]# PASSWORD=$(base64 < /dev/urandom | head -c12); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
l3Hleuk51WlX
clickhouse-client -h 127.0.0.1 --password='j780UJy9D2tn'
clickhouse-client -h 127.0.0.1 --password='123456'
```
**说明:可以创建users.d目录,在下面单独存放用户的文件,方便维护和管理用户文件**
```
[root@tidb06 users.d]# pwd
/etc/clickhouse-server/users.d
例如:
[root@tidb06 users.d]# cat /etc/clickhouse-server/users.d/wujianwei_rw.xml
c0952f7212b0161d07c6f45f00fdb73e17430f11 172.16.0.246 default default default system test001 1
```
**特别说明:**
**ClickHouse对于每个配置文件,服务器在启动时会生成file-preprocessed.xml文件。这些文件包含所有已完成的替换和替代,比如上面的用户虽然用单独文件存放,但会在生成file-preprocessed.xml里会整合在一起,默认路径在:/var/lib/clickhouse/preprocessed_configs/,即实时重新加载用户和集群的设置。
这意味着可以修改群集,用户及其设置,而无需重新启动服务器,当然也可以验证配置参数是否生效。
针对配置还可以定义“替代”,如果元素具有incl属性,则文件中的相应的值将被替换、删除、追加。默认情况下,带替换文件的路径为/etc/metrika.xml。可以在配置文件(users.xml)里添加include_from元素来进行进行更改**