clickhouse用戶配置文件詳解

同時發佈於 schnappi618‘s blog

參考網頁:

​ ClickHouse的用戶及訪問權限控制均可由配置文件直接進行標準化配置,一般由user.xml文件設置,該文件名在/etc/clickhouse-server/config.xml中修改,詳情可參考clickhouse-server配置文件詳解,若需要對某一個用戶單獨設置例如dba用戶,可放入/etc/clickhouse-server/users.d/dba.xml,下面會描述該文件的配置示例。

一、users.xml文件示例

​ 以下是一個標準默認的user.xml用戶配置示例,可直接測試使用,對用戶的權限管理將會單獨使用一篇文章來進行說明,後面將會對該文件分開描述。

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

  • profile:類似於用戶角色,可以實現最大內存、負載方式等配置的服用
  • users:設置包括用戶名、密碼、權限等
  • quotas:限制一段時間內的資源使用等
<?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設置詳解

user.xml用戶配置文件中profiles部分定義了一些可複用的配置,他的作用類似於用戶角色,可定義多個profile,併爲不同的profile定義不同的配置,其中每個參數的含義可參考前面的參考網頁二,並在後續使用中不斷完善,以下面配置爲例:

1、profile配置詳情

<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設置爲了只讀,對其配置進行測試

[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切換

# 根據上面的配置文件,可以看到這次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名稱,但若有衝突,後面的配置會覆蓋之前繼承的配置,示例如下:

	<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配置詳解

user.xml用戶配置文件中users模塊可以自定義配置用戶屬性,例如用戶名、密碼、權限等,用官網默認配置會發現user.xml文件中會默認創建default用戶,使用clickhouse-client無參數登陸會通過該用戶登陸,將以下面的示例進行說明:

1、users配置詳情

    <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

    <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都是散列算法,明文和密文一一對應,也可通過密文很容易進行解密…

  • 明文登陸
<!--直接在用戶中通過password標籤定義,中間字符即爲登陸密碼-->
<password>meiyoumima</password>
<!--類似上述default用戶,中間爲空即代表沒有密碼-->
<password></password>
  • SHA256加密登陸
## 官方推薦生成密碼方式,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
<!--設置方式-->
<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_double_sha1_hex>

3. networks

​ networks表示允許被登陸clickhouse服務器的客戶端列表,支持通過ip、host、host_regexp方式設置

  • ip設置
<!--通過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設置
<host>example1.host.com</host>
  • host_regexp設置
<!--通過主機名的正則表達式設置-->
<host_regexp>^example\d\d-\d\d-\d\.host\.ru$</host_regexp>

4. profile設置

​ 該用戶所使用的profile設置,直接寫入即可

<default>
	<profile>default</profile>
</default>

5. quota設置

​ 該用戶單位時間內的資源限制,直接使用quotas設置的名稱即可

<quota>default</quota>

6. database設置

​ 該設置可以限制當前用戶select時返回的行,以完成簡單的行數據安全,示例如下:

<!--以下配置強制用戶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配置詳情

user.xml配置文件中的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>

2、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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章