暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse的用户配置详解及SQL化用户配置

ClickHouse周边 2021-03-14
3224

        在之前的ClickHouse版本中,我们只能通过修改users.xml文件来配置用户及相关的参数(权限、资源限制、查询配额等),不是很方便。好在从20.5版本起,ClickHouse开始支持SQL化的用户配置(如同MySQL、PostgreSQL一样),易用性增强了很多。

        新特性介绍之前我们先温习下 users.xml 配置文件,它主要由以下三部分配置组成:

        1. profile标签:类似用户角色,可以实现最大内存、负载方式等配置。

  • 可定义多个profile,并为不同的profile定义不同的配置

        <!--定义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>

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

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

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

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

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

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

      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. 
      • profile切换和继承

        1. profile切换

        # 根据上面的配置文件,可以看到这次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.

              B. profile继承

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

                <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>

                  2. users标签:设置包括用户名、密码、网络设置、该用户使用的profile、quota等

                <users>
            <!--用户的第一行设置为其username-->
            <default>
            <password></password>
                         <networks incl="networks" replace="replace">                
            <!--为所有客户端打开权限-->                
            <ip>::/0</ip>
                              <!--仅允许本地登陆-->                
            <ip>::1</ip>
            <ip>127.0.0.1</ip>                
            <!--也可以输入host信息访问-->                
            <host>www.oldba.cn</host>            
            </networks>            
                          <profile>default</profile>            
            <!--该用户单位时间内的资源限制-->
                          <quota>default</quota>        
                     </default>

                    clickhouse登陆密码支持明文、SHA256、double_sha1三种方式:SHA256加密登陆:

              ## 官方推荐生成密码方式,RSZ4QZMc为随机的明文密码,21d076f...为最终密文
              [root@xxxx ]# 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

              <!--设置方式-->
              <password_sha256_hex>21d076f8340b5d836769a35c4d658d7b3091e7e1ccb18d66e9e1a7b6eef823df</password_sha256_hex>

              double_sha1加密登陆:

                # 官方推荐生成密码方式,+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

                <!--设置方式-->
                <password_double_sha1_hex>407732ce14cdea57dc0a2ff9c64773472f8cd666</password_d

                        3. quotas标签:限制一段时间内的资源使用等

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

                      <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>

                  quotas属性详情:

                  1.duration设置

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

                        <duration>3600</duration>

                    2. queris设置

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

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

                      3. errors设置

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

                        <errors>0</errors>

                        4. result_rows设置

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

                          <result_rows>0</result_rows>

                          5. read_rows设置

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

                            <read_rows>0</read_rows>

                            6. execution_time设置

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

                              <execution_time>0</execution_time>

                                      好,以上就是给大家介绍的users.xml配置文件的详情,进入今天的正题:SQL化用户配置。它默认是关闭的,要启用它,需要在users.xml中的一个用户(默认的default)下添加:

                                <access_management>1</access_management>

                                        另外还需要在config.xml中配置权限管理数据的存储位置:

                                  <access_control_path>/data1/clickhouse/access/</access_control_path>


                                          这样我们就可以用default用户管理其他用户了。ClickHouse采用与MySQL近似的RBAC(Role-based access control,基于角色的访问控制)机制,所以语法也很像。下面简要列举几个操作,更加详细的内容可以参见官方文档:https://clickhouse.tech/docs/en/operations/access-rights/。

                                  • 创建一个单次查询只允许使用4个线程、4G内存的只读profile。

                                    CREATE SETTINGS PROFILE low_mem_readonly
                                    SETTINGS max_threads = 4, max_memory_usage = 4000000000
                                    READONLY;

                                    • 基于上述profile创建一个名为accountant的角色,并授予该角色查询account_db数据库中所有表的权限。

                                      CREATE ROLE accountant SETTINGS PROFILE 'low_mem_readonly';
                                      GRANT SELECT ON account_db.* TO accountant;


                                      • 创建一个允许内网访问的用户ansel,设定密码,并指定它的默认角色为accountant,ansel用户就具有了accountant角色的权限。

                                              注意新创建的用户没有任何权限,我们也可以通过GRANT语句直接给用户授予权限。

                                        CREATE USER ansel@'192.168.%.%' IDENTIFIED WITH sha256_password BY 'qwe2021' DEFAULT ROLE accountant;
                                        GRANT OPTIMIZE ON datasets.hits_v1 TO ansel@'192.168.%.%';


                                                观察上面设定的access_control_path目录,可以发现创建的用户配置都被保存了下来。

                                          -rw-r----- 1 clickhouse clickhouse 135 Sep  4 21:51 034f455a-aeec-f9d0-3f76-b026318de1bd.sql
                                          -rw-r----- 1 clickhouse clickhouse 107 Sep 4 21:45 934198fc-bd87-90bb-2062-f0c165f54cae.sql
                                          -rw-r----- 1 clickhouse clickhouse 293 Sep 4 21:58 b643aee4-c4d4-5dd8-2e63-2dd13bf42e90.sql
                                          -rw-r----- 1 clickhouse clickhouse 1 Aug 23 01:14 quotas.list
                                          -rw-r----- 1 clickhouse clickhouse 48 Sep 4 21:52 roles.list
                                          -rw-r----- 1 clickhouse clickhouse 1 Aug 23 01:14 row_policies.list
                                          -rw-r----- 1 clickhouse clickhouse 54 Sep 4 21:46 settings_profiles.list
                                          -rw-r----- 1 clickhouse clickhouse 56 Sep 4 21:59 users.list

                                                  如果需要更改用户配置,使用ALTER、DROP、REVOKE语法即可。例如:

                                          • 修改ansel用户的密码,并改为在任何地址都可访问。

                                            ALTER USER ansel@'192.168.%.%'
                                            RENAME TO ansel@'%'
                                            IDENTIFIED WITH sha256_password BY 'clickhouse_2021';
                                            • 删除刚才创建的profile。

                                              DROP SETTINGS PROFILE low_mem_readonly;

                                              • 撤销ansel用户的OPTIMIZE权限。

                                                REVOKE OPTIMIZE ON datasets.hits_v1 FROM ansel@'%';

                                                        最后需要注意,上述配置语句的作用域都是在单个节点上的。如果想要在集群所有节点上都生效的话,使用老生常谈的 ON CLUSTER 语法即可。例如:

                                                  CREATE USER ansel@'192.168.%.%' ON CLUSTER sht_ck_cluster_pro1
                                                  IDENTIFIED WITH......

                                                  文章转载自ClickHouse周边,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                  评论