目录
一、创建用户
1.1 xml方式创建用户
创建用户的具体xml内容如下:
<!-- If user name was not specified, 'default' user is used. -->
<user_name>
<password></password>
<!-- Or -->
<password_sha256_hex></password_sha256_hex>
<access_management>0|1</access_management>
<networks incl="networks" replace="replace">
</networks>
<profile>profile_name</profile>
<quota>default</quota>
<databases>
<database_name>
<table_name>
<filter>expression</filter>
<table_name>
</database_name>
</databases>
</user_name>
<!-- Other users settings -->
整个内容放在user.xml的<users></users>标签下。
Password设置:
Password下存放明文密码,password_sha256_hex标签下存放sha256加密后的密码,password_double_sha1_hex标签下可以存放double sha1加密后的密码。这里建议使用加密过后的密码。
可以在命令行中创建加密密码。
Sha256加密执行以下命令:
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
Double sha1加密执行以下命令
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
Network网络限制:
<network>,允许被登陆clickhouse服务器的客户端列表,支持通过ip、host、host_regexp方式设置。
使用ip进行设置:
<ip>1.1.1.1</ip>
<ip>10.0.0.1/8</ip><!-设置具体的ip地址来限制登录用户-->
<!--为所有客户端打开权限-->
<ip>::/0</ip>
<!--仅允许本地登陆-->
<ip>::1</ip>
<ip>127.0.0.1</ip>
使用host来进行设置:
<host>example1.host.com</host>
使用host_regexp进行设置:
<host_regexp>^example\d\d-\d\d-\d\.host\.ru$</host_regexp>
Profile设置:
在<profile></profile>标签下,写入之前已经设置好的profile权限名,表示该用户拥有该权限。具体的权限设置见2.1中profiles标签的设置。
Quota设置:
在<quota></quota>标签下,填入已经预先配置好的quota名称,具体的quota设置见3.1中的quota配置。
Database设置:
这里是设置用户可以访问的数据库,以及数据库下表的访问权限。
<databases>
<database_name>
<table1>
<filter>id = 1000</filter>
</table1>
</database_name>
</databases>
<databases>或者可以使用<allow_databases>下定义该用户可以访问的数据库,这里可以包含一个或者多个数据库,同理在数据库标签下可以设置表名,表示可以访问的对应数据库下的表。不填写默认全都能访问。<filter></filter>中填写表达式,id= 1000,表示只能访问id为1000的数据项,id<10,表示只能访问id小于10的数据项。其他的表达式同理。
1.2 sql方式创建用户
配置修改:
1、在config.xml中添加access_control_path 配置项,具体如下:<access_control_path>/var/lib/clickhouse/access/</access_control_path>
通过 SQL 形式创建的用户、角色等信息将以文件的形式被保存在这个目录。
2、在user.xml中为默认用户default添加access_management配置项
<access_management>1</access_management>
0代表disabled,1代表enabled。默认为0。
创建用户:
官方文档介绍如下: CREATE USER [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster_name]
[IDENTIFIED [WITH {NO_PASSWORD|PLAINTEXT_PASSWORD|SHA256_PASSWORD|SHA256_HASH|DOUBLE_SHA1_PASSWORD|DOUBLE_SHA1_HASH}] BY {'password'|'hash'}]
[HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
[DEFAULT ROLE role [,...]]
[SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]
这里举例创建一个user_01用户:
CREATE USER user_01 IDENTIFIED WITH PLAINTEXT_PASSWORD BY '123'
官方修改用户信息命令如下:
ALTER USER [IF EXISTS] name [ON CLUSTER cluster_name]
[RENAME TO new_name]
[IDENTIFIED [WITH {PLAINTEXT_PASSWORD|SHA256_PASSWORD|DOUBLE_SHA1_PASSWORD}] BY {'password'|'hash'}]
[[ADD|DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
[DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ]
[SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]
这里举例修改用户的密码:
ALTER USER user_01 IDENTIFIED WITH PLAINTEXT_PASSWORD BY '111111'
将密码修改为111111.
二、用户权限赋予
2.1 xml方式对用户赋予权限
在user.xml中定义各种权限
<profiles>
<!--可自定义名称,default是默认存在的角色名称-->
<!--可以设置多种权限,每个用户只需要在其对用的xml中<profile>标签填入其权限名称即可-->
<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>
</profiles>
profile中有约束条件,从而限制其中的参数值被任意修改,约束条件有三种规则:
Min:最小值约束,对应参数取值不能小于该值.
Max:最大值约束,对应参数取值不能大雨该值.
Readonly:只读约束,对应参数禁止修改.
参数介绍:
readonly :读权限、写权限和设置权限,由此标签控制,它有三种取值:
0,不进行任何限制(默认值,可读可写);
1,只拥有读权限(只能执行SELECT、EXISTS、SHOW和DESCRIBE);
2,拥有读权限和设置权限(在读权限基础上,增加了SET查询)。
当设置readonly=1后,用户将无法在当前会话中更改readonly和allow_ddl设置;也可以通过约束来限制更改权限。
allow_ddl:DDL权限由此标签控制,它有两种取值:
当取值为0时,不允许DDL查询;
当取值为1时,允许DDL查询(默认值)
如果当前会话的allow_ddl = 0,则无法执行SET allow_ddl = 1
对用户增删改查限制:(select,insert,delete,update)
<normal> --只读,不能DDL
<readonly>1</readonly>
<allow_ddl>0</allow_ddl>
</normal>
<normal_1> --读且能set,不能DDL
<readonly>2</readonly>
<allow_ddl>0</allow_ddl>
</normal_1>
<normal_2> --只读,即使DDL允许
<readonly>1</readonly>
<allow_ddl>1</allow_ddl>
</normal_2>
<normal_3> --读写,能DDL
<readonly>0</readonly>
<allow_ddl>1</allow_ddl>
</normal_3>
通过修改用户的<profile></profile>标签的名称来改变该用户的权限,其中的profile_name一定要在profiles下有定义才能够实现
2.2 sql驱动方式赋予权限
官方标准的sql语句格式:GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION]
直接对user赋予权限:
grant select on db_test.* to user_01 ;
赋予用户对db_test数据库下的所有表的select查询功能。
Grant insert on db_test.* to user_01;
Grant delete on db_test.* to user_01;
Grant update on db_test.* to user_01;
以上是赋予user_01用户对数据库db_test下所有表的增删改查功能。
revoke delete on db_test.* from user_01 ;
撤销用户对数据库db_test下所有表的delete查询功能。其他权限的撤销操作同上。
通过对角色赋予权限再赋予用户角色:
CREATE ROLE [IF NOT EXISTS | OR REPLACE] name
[SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]
Creat role manager;//创建角色
GRANT SELECT ON *.* TO manager;
GRANT insert ON *.* TO manager;//对角色授权
GRANT manager to user_01;//对用户赋予角色信息
Create USER test_01 default role manage;//创建角色赋予默认的角色
三、用户限额
3.1 xml方式用户限额
基本的xml方式限额
<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>
每个参数代表的含义:
1.Duration
累计时间周期,单位秒,到达周期时间清除所有收集值,然后重新计算。
2.Queries
在周期内允许查询次数限制
3.Errors
在周期内允许引发异常的次数限制
4.Result_rows
在周期内允许的查询返回结果行数
5.Read_rows
在周期内,允许远程节点读取的数据行数
6.Execution_time
允许查询的总执行时间,单位为秒
3.2 sql驱动方式限额
官方给出的限额创建命令:
CREATE QUOTA [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster_name]
[KEYED BY {'none' | 'user name' | 'ip address' | 'client key' | 'client key or user name' | 'client key or ip address'}]
[FOR [RANDOMIZED] INTERVAL number {SECOND | MINUTE | HOUR | DAY}
{MAX { {QUERIES | ERRORS | RESULT ROWS | RESULT BYTES | READ ROWS | READ BYTES | EXECUTION TIME} = number } [,...] |
NO LIMITS | TRACKING ONLY} [,...]]
[TO {role [,...] | ALL | ALL EXCEPT role [,...]}]
创建一个配额举例:(限制最大的查询次数)
CREATE QUOTA qA FOR INTERVAL 15 MONTH MAX QUERIES 123 TO user_01
这里可以根据xml中配额的各项参数,通过修改自己所需要的参数名称和数值来定义配额。
删除一个配额信息
DROP QUOTA [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
查询配额信息
SHOW CREATE QUOTA [name | CURRENT]
以上的介绍都是一些简单的基本操作,如果需要更加详细的介绍文档,参见官文api https://clickhouse.tech/docs/en/