clickhouse通過RABC即SQL-driven來管理用戶權限


 

  ClickHouse也支持基於RBAC(Role-Based Access Control)的訪問控制管理,即通過SQL-driven來進行管理。在 RBAC  中,權限與角色相關聯,通過成為角色的成員而得到這些角色的權限。簡化了權限的管理。這樣管理都是層級相互依賴的,權限賦予給角色,而把角色又賦予用戶,ClickHouse推薦使用該方式進行用戶權限管理。

說明:

ClickHouse(version 20.9.3.45)權限包括:

- 用戶賬戶

- 角色

- 行策略

- 設置描述

- 配額

可以通過如下方式配置權限:

通過SQL-driven的工作流方式,需要手動開啟該功能,默認關閉:
users.xml:
  
access_management:1 開啟

<users> 
  <default> 
    <password>123456</password>  
    <networks> 
      <ip>::/0</ip> 
    </networks>  
    <profile>default</profile>  
    <quota>default</quota>  
    <access_management>1</access_management> 
  </default> 
</users>

建議使用SQL-driven工作流的方式。當然配置的方式也可以同時起作用, 可以平滑的配置管理方式切換到SQL-driven的工作流方式。

使用

在介紹用戶權限管理之前,再次了解下用戶權限相關的幾個方面:

權限的類型

配置組(Profiles)的設置,在users.xml文件中

限制(constraints)

熔斷(quotas)

一 配置文件設置

1. 權限的類型:

ClickHouse中的查詢可以分為幾種類型:

讀: SELECTSHOWDESCRIBEEXISTS.

寫: INSERTOPTIMIZE.

設置: SETUSE.

DDL: CREATEALTERRENAMEATTACHDETACHDROP TRUNCATE.

KILL:kill 查詢

以下設置按查詢類型規范用戶權限:

readonly —  限制除 DDL 之外的所有查詢類型的權限

    0:允許所有查詢。
    1:僅允許讀取數據查詢。
    2:允許讀取數據和更改設置查詢。

默認值0,設置 readonly=1 后不能執行readonly 和 allow_ddl 在當前會話中的設置。

allow_ddl — 限制 DDL 的權限

    0:不允許 DDL 查詢。
    1:允許 DDL 查詢。

默認值1,設置 allow_ddl=0 后不能執行 SET allow_ddl = 1。

kill  — 可以使用任何設置執行KILL QUERY

以上的權限通過配置標簽來控制(users.xml):

 

<profiles>   --在profiles里設置
        ...
        <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>

    </profiles>

...
    <users>
        ...
        <test>
            <password>123456</password>
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <profile>normal_3</profile> --用戶引用相關profile
            <quota>default</quota>
        </test>
    </users>
...

2. 配置組(Profiles)的設置:users.xml

profile的作用類似於用戶角色,可以在users.xml中定義多組profile,並可以為每組profile定義不同的配置項:讀、寫、DDL權限,以及限制的設置,各個profile可以相互繼承。設置好profile之后,可以在用戶中被使用。

復制代碼
<?xml version="1.0"?>
<yandex>
    <profiles>
        <!--自定義profile,可以任意命名-->
        <default>
            <max_memory_usage>100000000</max_memory_usage>
            <use_uncompressed_cache>0</use_uncompressed_cache>
            <load_balancing>random</load_balancing>
        </default>

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

        <readwrite>
            <constraints>
                <max_memory_usage>
                    <readonly/>
                </max_memory_usage>
                <force_index_by_date>
                    <readonly/>
                </force_index_by_date>
            </constraints>
        </readwrite>

    </profiles>

...
</yandex>
復制代碼

上面新增profile:readonly 和 readwrite,還可以在命令行里切換profile:

:) set profile = 'readonly';

切換了profile之后,就擁有了該profile下的權限。關於配置profile的修改,可以之前的文章【用戶權限管理】。

3. 限制(constraints): 

users.xml配置文件的profile選項組下constraints選項組里定義設置的約束,並禁止用戶使用SET查詢更改某些設置。constraints標簽可以設置一組約束條件,以限制profile內的參數值被隨意修改,約束條件有如下三種規則:

  • min:最小值約束,在設置相應參數的時候,取值不能小於該閾值;

  • max:最大值約束,在設置相應參數的時候,取值不能大於該閾值;

  • readonly:只讀約束,該參數值不允許被修改。

復制代碼
...
    <profiles>
        <default>
            <max_memory_usage>10000000000</max_memory_usage>
            <use_uncompressed_cache>0</use_uncompressed_cache>
            <force_index_by_date>0</force_index_by_date>
            <load_balancing>random</load_balancing>
        </default>
        <test>
            <constraints>
                <max_memory_usage>
                    <min>100000</min>
                    <max>200000</max>
                </max_memory_usage>
                <force_index_by_date>
                    <readonly/>
                </force_index_by_date>
            </constraints>
        </test>
    </profiles>
...
復制代碼

上面對profile為test進行了限制,如果在該profile下試圖違反約束,則會引發異常並且不會更改設置:

復制代碼
:) SET max_memory_usage=2000000;
-- Code: 452. DB::Exception: Received from localhost:9010. DB::Exception: Setting max_memory_usage shouldn't be greater than 200000.

:) SET max_memory_usage=10000;
-- Code: 452. DB::Exception: Received from localhost:9010. DB::Exception: Setting max_memory_usage shouldn't be less than 100000. 

:) SET force_index_by_date=1;
-- Code: 452. DB::Exception: Received from localhost:9010. DB::Exception: Setting force_index_by_date should not be changed. 
復制代碼

關於限制配置的修改,可以看之前的文章【用戶權限管理】。

4. 配額(quotas)

配合,限制使用資源,類似於熔斷。限制有二種類型:一是在固定周期里的執行次數(quotas),二是限制用戶或則查詢的使用資源(profiles)。在users.xml配置文件的選項組quotas里設置,限制該用戶一段時間內的資源使用,即對一段時間內運行的一組查詢施加限制,而不是限制單個查詢。模板:

復制代碼
<!-- Quotas. -->
    <quotas>
        <!-- Name of quota. -->
        <default> --指定quotas名
            <!-- Limits for time interval. You could specify many intervals with different limits. -->
            <interval> --時間間隔
                <!-- Length of interval. -->
                <duration>3600</duration> --周期
                <!-- No limits. Just calculate resource usage for time interval. -->
                <queries>0</queries>
                <errors>0</errors>
                <result_rows>0</result_rows>
                <read_rows>0</read_rows>
                <execution_time>0</execution_time>
            </interval>
        </default>
    </quotas>
復制代碼

默認情況下,配額僅跟蹤每小時的資源消耗,而沒有限制使用情況。在每個請求之后,將為每個時間間隔計算的資源消耗輸出到服務器日志。

說明:

  • <default>:配額規則名。
  • <interval>:配置時間間隔,每個時間內的資源消耗限制。
  • <duration>:時間周期,單位秒。
  • <queries>:時間周期內允許的請求總數,0表示不限制。
  • <errors>:時間周期內允許的異常總數,0表示不限制。
  • <result_rows>:時間周期內允許返回的行數,0表示不限制。
  • <read_rows>:時間周期內允許在分布式查詢中,遠端節點讀取的數據行數,0表示不限制。
  • <execution_time>:時間周期內允許執行的查詢時間,單位是秒,0表示不限制。

關於配額熔斷的配置,可以看之前的文章【用戶權限管理】。

5. 用戶設置

users.xml配置文件中的users選項組是配置自定義的用戶,定義一個新用戶,必須包含以下幾項屬性:用戶名、密碼、訪問ip、數據庫、表等等。它還可以應用上面的profile、constraints、quota。如:

復制代碼
<users>
        <default>
            <password>123456</password>
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
        </default>

        <zhoujy>
            <password_double_sha1_hex>6bb4837eb74329105ee4568dda7dc67ed2ca2ad9</password_double_sha1_hex>
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
            <allow_databases>
                <database>test</database>
            </allow_databases>
            <databases>
                <test>  
                    <xx>
                        <filter>id >= 500 </filter>  --行級限制
                    </xx>
                </test>
            </databases>
        </zhoujy>

    </users>
復制代碼
  • <profile>:指定用戶的profile
  • <quota>:指定用戶的quota,限制用戶使用資源
  • <database_name>:指定用戶訪問的數據庫
  • <table_name>:指定用戶訪問的表
  • <filter>:指定用戶訪問的過濾器,限制返回符合條件的行。如:id = 1 ,即查詢表只返回id=1的行

該示例指定了兩個用戶:

default:指定了密碼、訪問IP、profile、quota。
zhoujy :指定了密碼、訪問IP、profile、quota,以及它只能使用test庫,並且只能返回test庫xx表id大於等於500的數據。

通過以上的設置,已經把用戶權限的知識點大部分都已經介紹完了,包括了讀寫權限、權限的限制和要把這些“規則”應用到用戶上,這樣就完成了用戶權限的定制了。

以上所有介紹的知識點都可以看之前的文章【用戶權限管理】,該文章中都做了詳細的說明。通過修改配置文件雖然能實現ACL,但是比較麻煩,不便於維護管理。所以推薦使用SQL方式進行配置。本文的重點是介紹通過SQL-driven來進行管理用戶權限。

二 SQL設置

啟用SQL-driven管理需要開啟users.xml文件中users的參數:

<access_management>1</access_management>

通過SQL-driven設置創建的用戶,都存儲在access目錄中,該目錄的位置是由參數 local_directory 控制:

 <local_directory>
            <!-- Path to folder where users created by SQL commands are stored. -->
            <!-- <path>/var/lib/clickhouse/access/</path> -->
            <path>/ccdata/clickhouse/access/</path>
        </local_directory>

1. 創建用戶(Create User) 

復制代碼
CREATE USER 
   [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...]
    [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}]
    [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
    [DEFAULT ROLE role [,...]]
    [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...]
復制代碼

ON CLUSTER 子句允許在集群上創建用戶。

① 用戶認證:密碼,用戶連接密碼。

IDENTIFIED WITH no_password   -- 沒有密碼
IDENTIFIED WITH plaintext_password BY 'qwerty'   -- 明文密碼
IDENTIFIED WITH sha256_password BY 'qwerty' or IDENTIFIED BY 'password'  -- sha256_password 加密密碼
IDENTIFIED WITH sha256_hash BY 'hash'  -- sha256_hash 加密密碼
IDENTIFIED WITH double_sha1_password BY 'qwerty'  -- double_sha1_password 加密密碼
IDENTIFIED WITH double_sha1_hash BY 'hash'  -- double_sha1_hash 加密密碼
IDENTIFIED WITH ldap SERVER 'server_name'
IDENTIFIED WITH kerberos or IDENTIFIED WITH kerberos REALM 'realm'

 

② 用戶主機:主機,用戶連接地址。

HOST IP 'ip_address_or_subnetwork' —  用戶通過指定IP連接。
HOST ANY — 可以從任何位置連接,默認。
HOST LOCAL — 只能在本地連接。
HOST NAME 'fqdn' — 用戶主機可以指定為域名。
HOST NAME REGEXP 'regexp' — 主機使用正則表達式。
HOST LIKE 'template' — 使用 LIKE 運算符來過濾用戶主機。 如HOST LIKE '%' 等價於 HOST ANY,HOST LIKE '%.mysite.com' 過濾 mysite.com 域中的所有主機。

指定主機的另一種方法是在用戶名后使用@:

CREATE USER mira@'127.0.0.1' — 等效於 HOST IP 語法
CREATE USER mira@'localhost' — 等效於 HOST LOCAL 語法
CREATE USER mira@'192.168.%.%' — 等效於 HOST LIKE 語法

③  授權權限

通過GRANTEES來授權用戶或則角色,可以獲得創建該用戶的權限。

  • user — 指定可以授予權限的用戶
  • role — 指定可以授予權限的角色
  • ANY — 可以向任何人授予權限
  • NONE — 可以向 none 授予權限

④:例子

--創建密碼為123456的用戶cc,只能本機登錄:
:) create user cc host ip '127.0.0.1' identified with sha256_password by '123456';
--創建用戶帳戶cao,為其分配角色並將此角色設為默認:
:) CREATE USER cao DEFAULT ROLE role1, role2;
--創建用戶帳戶 john 並將他未來的所有角色設為默認:
:) CREATE USER john DEFAULT ROLE ALL;
--當將來某個角色分配給 john 時,它將自動變為默認值。

--創建用戶帳戶 john 並將他未來的所有角色設為默認,除了 role1 和 role2:
:) CREATE USER john DEFAULT ROLE ALL EXCEPT role1, role2;
--創建用戶帳戶 john 並允許將權限授給具有 jack 帳戶的用戶:
:) CREATE USER john GRANTEES jack;
----  DB::Exception: user `john`: cannot insert because user `john` already exists in local directory: Couldn't insert user `john`. Successfully inserted: none. 

2. 創建角色(Create Role) 

創建角色,角色是一組權限。分配了角色的用戶獲得該角色的所有權限。

CREATE ROLE [IF NOT EXISTS | OR REPLACE] name1 [, name2 ...]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]

一個用戶可以分配多個角色。通過 SET ROLE 分配的角色。權限的范圍是所有應用角色權限的組合集合。用戶可以擁有適用於用戶登錄的默認角色,要設置默認角色,使用 SET DEFAULT ROLE 或 ALTER USER 語句。使用 REVOKE 來撤銷角色,使用 DROP ROLE 來刪除角色。

--創建角色

:) CREATE ROLE zjy;
--給角色授權

:) GRANT SELECT ON dbtest.* TO zjy;
--將角色分配給用戶

 :) GRANT zjy TO cc;
--執行角色擁有的權限

:) SET ROLE zjy;

:) SELECT * FROM testdb.*;

3. 創建行策略(Create ROW POLICY) 

創建行策略,即用於確定用戶可以從表中讀取哪些行的過濾器。注意:行策略僅對具有只讀訪問權限的用戶有意義。

CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1 
        [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2 ...] 
    [FOR SELECT] USING condition
    [AS {PERMISSIVE | RESTRICTIVE}]
    [TO {role1 [, role2 ...] | ALL | ALL EXCEPT role1 [, role2 ...]}]
  • USING:指定過濾行的條件。 如果該行的條件計算為非零,則用戶將看到該行。

TO:應用到適用的用戶和角色。--如果沒有為表定義行策略,則任何用戶都可以從表中選擇所有行。為表定義一個或多個行策略,無論是否為當前用戶定義了這些行策略,都可以根據行策略訪問表。例如::) CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter;

--禁止用戶 mira 和 peter 查看 b != 1 的行,任何未提及的用戶(例如,用戶 paul)根本看不到 mydb.table1 中的行。 CREATE ROW POLICY pol2 ON mydb.table1 USING 1 TO ALL EXCEPT mira, peter --禁止用戶 mira 和 peter 查看表數據。 --AS:允許同時為同一用戶在同一張表上啟用多個策略。所以需要一種方法來組合來自多個策略的條件。 :) CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter; :) CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 AS RESTRICTIVE TO peter, antonio; --當 b=1 和 c=2 時,用戶 peter 才能看到行 
-
--
例如

:) CREATE ROW POLICY filter1 ON mydb.mytable USING a<1000 TO accountant, john@localhost; :) CREATE ROW POLICY filter2 ON mydb.mytable USING a<1000 AND b=5 TO ALL EXCEPT mira; :) CREATE ROW POLICY filter3 ON mydb.mytable USING 1 TO admin;

 

4. 創建熔斷配額策略(CREATE QUOTA) 

創建可以分配給用戶或角色的配額熔斷策略。

CREATE QUOTA [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster_name]
    [KEYED BY {user_name | ip_address | client_key | client_key,user_name | client_key,ip_address} | NOT KEYED]
    [FOR [RANDOMIZED] INTERVAL number {second | minute | hour | day | week | month | quarter | year}
        {MAX { {queries | query_selects | query_inserts | errors | result_rows | result_bytes | read_rows | read_bytes | execution_time} = number } [,...] |
         NO LIMITS | TRACKING ONLY} [,...]]
    [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]

關鍵字:user_name、ip_address、client_key、client_key、user_name和client_key、ip_address對應system.quotas表中的字段。

關鍵字:querys、query_selects、query_inserts、errors、result_rows、result_bytes、read_rows、read_bytes、execution_time對應system.quotas_usage表中的字段。

--將當前用戶的最大查詢數限制為 15 個月內123 次:

CREATE QUOTA qA FOR INTERVAL 15 month MAX queries = 123 TO CURRENT_USER;
--對於默認用戶,在30分鍾之內限制最大執行時間為半秒,將最大查詢數限制為 321,將最大錯誤數限制為 10 :

CREATE QUOTA qB FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321, errors = 10 TO default;
--在用戶、角色和訪問策略建立好之后,后面就需要授權了。

 

5. 創建配置組策略(CREATE SETTINGS PROFILE

創建可分配給用戶或角色的設置配置文件

CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] 
        [, name2 [ON CLUSTER cluster_name2] ...]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...]
--例如:

CREATE SETTINGS PROFILE max_memory_usage_profile SETTINGS max_memory_usage = 100000001 MIN 90000000 MAX 110000000 TO robin

使用 max_memory_usage 設置的值和約束創建 max_memory_usage_profile 設置配置文件,並將其分配給用戶 robin:

6. 權限:權限是指執行特定操作的許可

權限有層級結構,一組允許的操作依賴相應的權限范圍。 

級別(由低到高):

  • COLUMN - 可以授權到列,表,庫或者全局
  • TABLE - 可以授權到表,庫,或全局
  • VIEW - 可以授權到視圖,庫,或全局
  • DICTIONARY - 可以授權到字典,庫,或全局
  • DATABASE - 可以授權到數據庫或全局
  • GLABLE - 可以授權到全局
  • GROUP - 不同級別的權限分組。當授予 GROUP級別的權限時, 根據所用的語法,只有對應分組中的權限才會被分配。

權限的層級:

SELECT

允許執行 SELECT 查詢,權限級別: COLUMN。

:) GRANT SELECT(x,y) ON db.table TO john;

該權限允許 john 對 db.table表的列x,y執行SELECT查詢。

:) GRANT SELECT ON db.table TO john;

該權限允許 john 對 db.table表的所有列執行SELECT查詢。

 

INSERT

允許執行 INSERT 操作,權限級別: COLUMN。

:) GRANT INSERT(x,y) ON db.table TO john;

該權限允許 john 對 db.table表的列x,y執行數據插入操作

:) GRANT INSERT ON db.table TO john;

該權限允許 john 對 db.table表的所有列執行數據插入操作

 

ALTER
允許執行ALTER操作

ALTER TABLE. 級別: GROUP

ALTER UPDATE. 級別: COLUMN. 別名: UPDATE

:) alter table ttt update address = 'TTTT' where id = 1;

 

ALTER DELETE. 級別: COLUMN. 別名: DELETE

:) alter table ttt delete where id = 6;

 

ALTER COLUMN. 級別: GROUP

ALTER ADD COLUMN. 級別: COLUMN. 別名: ADD COLUMN

:) alter table ttt add column col1 String;

 

ALTER DROP COLUMN. 級別: COLUMN. 別名: DROP COLUMN

:) alter table ttt drop column col1;

 

ALTER MODIFY COLUMN. 級別: COLUMN. 別名: MODIFY COLUMN

:) alter table ttt modify column col1 UInt16;

 

ALTER COMMENT COLUMN. 級別: COLUMN. 別名: COMMENT COLUMN

:) alter table ttt comment column col1 'xxxx';

 

ALTER CLEAR COLUMN. 級別: COLUMN. 別名: CLEAR COLUMN

:) alter table ttt clear column col1;

 

ALTER RENAME COLUMN. 級別: COLUMN. 別名: RENAME COLUMN

:) alter table ttt rename column col1 to col2;

 

ALTER INDEX. 級別: GROUP. 別名: INDEX

ALTER ORDER BY. 級別: TABLE. 別名: ALTER MODIFY ORDER BYMODIFY ORDER BY

:) alter table ttt modify order by name;

 

ALTER ADD INDEX. 級別: TABLE. 別名: ADD INDEX

:) alter table ttt add index idx_name(name) type minmax granularity 5;

 

ALTER DROP INDEX. 級別: TABLE. 別名: DROP INDEX

:) alter table ttt drop index idx_name;

 

 

ALTER MATERIALIZE INDEX. 級別: TABLE. 別名: MATERIALIZE INDEX
ALTER CLEAR INDEX. 級別: TABLE. 別名: CLEAR INDEX
ALTER CONSTRAINT. 級別: GROUP. 別名: CONSTRAINTALTER TTL. 級別: TABLE. 別名: ALTER MODIFY TTL, MODIFY TTL
ALTER ADD CONSTRAINT. 級別: TABLE. 別名: ADD CONSTRAINT
ALTER DROP CONSTRAINT. 級別: TABLE. 別名: DROP CONSTRAINT
ALTER MATERIALIZE TTL. 級別: TABLE. 別名: MATERIALIZE TTL
ALTER SETTINGS. 級別: TABLE. 別名: ALTER SETTING, ALTER MODIFY SETTING, MODIFY SETTING
ALTER MOVE PARTITION. 級別: TABLE. 別名: ALTER MOVE PART, MOVE PARTITION, MOVE PART
ALTER FETCH PARTITION. 級別: TABLE. 別名: FETCH PARTITION
ALTER FREEZE PARTITION. 級別: TABLE. 別名: FREEZE PARTITION
ALTER VIEW 級別: GROUP
ALTER VIEW REFRESH. 級別: VIEW. 別名: ALTER LIVE VIEW REFRESH, REFRESH VIEW
ALTER VIEW MODIFY QUERY. 級別: VIEW. 別名: ALTER TABLE MODIFY QUERY
ALTER 權限包含所有其它 ALTER * 的權限:
:) GRANT ALTER  ON testdb.ttt TO zjy;

該權限允許 zjy 對 testdb.ttt表執行數據matution操作,權限包括上面列出來的各個操作:DELETE、UPDATE、ADD/DROP COLUMN/INDEX、MODIFY、TTL等等。
關於 ALTER 更多語法可以看手冊。

 

CREATE
允許執行 CREATE 和 ATTACH 的權限

  • CREATE. 級別: GROUP
  • CREATE DATABASE. 級別: DATABASE
  • CREATE TABLE. 級別: TABLE
  • CREATE VIEW. 級別: VIEW
  • CREATE DICTIONARY. 級別: DICTIONARY
  • CREATE TEMPORARY TABLE. 級別: GLOBAL

CREATE 權限包含所有其它 CREATE * 的權限:

:) GRANT CREATE ON *.* TO zjy;

該權限允許用戶zjy建庫、建表、建視圖、字典、臨時表等。

 

DROP

允許執行 DROP 和 DETACH 權限:

  • DROP. 級別:
  • DROP DATABASE. 級別: DATABASE
  • DROP TABLE. 級別: TABLE
  • DROP VIEW. 級別: VIEW
  • DROP DICTIONARY. 級別: DICTIONARY
:) GRANT DROP ON *.* TO zjy;

該權限允許用戶zjy刪庫、刪表、刪視圖、刪字典等。

TRUNCATE

允許執行 TRUNCATE 權限,權限級別: TABLE.

:) GRANT TRUNCATE ON *.* TO zjy;

該權限允許用戶zjy清空表。

OPTIMIZE

允許執行 OPTIMIZE TABLE 權限,權限級別: TABLE.

:) GRANT OPTIMIZE ON *.* TO zjy;

該權限允許用戶zjy optimize 表。

SHOW

允許根據下面的權限層級來執行 SHOWDESCRIBEUSE, 和 EXISTS :

SHOW. 級別: GROUP

SHOW DATABASES. 級別: DATABASE. 允許執行 SHOW DATABASES, SHOW CREATE DATABASE, USE <database> .
SHOW TABLES. 級別: TABLE. 允許執行 SHOW TABLES, EXISTS <table>, CHECK <table> .
SHOW COLUMNS. 級別: COLUMN. 允許執行 SHOW CREATE TABLE, DESCRIBE .
SHOW DICTIONARIES. 級別: DICTIONARY. 允許執行 SHOW DICTIONARIES, SHOW CREATE DICTIONARY, EXISTS <dictionary> .
:) GRANT SHOW ON *.* TO zjy;

該權限允許用戶zjy 執行show相關權限,show users 權限需要單獨定義。注意:當用戶對指定表,字典或數據庫有其它的權限時,同時會授予SHOW權限。

KILL QUERY

允許根據下面的權限層級來執行 KILL,權限級別: GLOBAL。

:) GRANT KILL QUERY ON *.* TO zjy;

該權限允許用戶zjy 執行 kill query 相關權限。

ACCESS MANAGEMENT
允許執行管理用戶/角色和行規則的操作

ACCESS MANAGEMENT. 級別: GROUP
CREATE USER. 級別: GLOBAL
ALTER USER. 級別: GLOBAL
DROP USER. 級別: GLOBAL
CREATE ROLE. 級別: GLOBAL
ALTER ROLE. 級別: GLOBAL
DROP ROLE. 級別: GLOBAL
ROLE ADMIN. 級別: GLOBAL
CREATE ROW POLICY. 級別: GLOBAL. 別名: CREATE POLICY
ALTER ROW POLICY. 級別: GLOBAL. 別名: ALTER POLICY
DROP ROW POLICY. 級別: GLOBAL. 別名: DROP POLICY
CREATE QUOTA. 級別: GLOBAL
ALTER QUOTA. 級別: GLOBAL
DROP QUOTA. 級別: GLOBAL
CREATE SETTINGS PROFILE. 級別: GLOBAL. 別名: CREATE PROFILE
ALTER SETTINGS PROFILE. 級別: GLOBAL. 別名: ALTER PROFILE
DROP SETTINGS PROFILE. 級別: GLOBAL. 別名: DROP PROFILE
SHOW ACCESS. 級別: GROUP
SHOW_USERS. 級別: GLOBAL. 別名: SHOW CREATE USER
SHOW_ROLES. 級別: GLOBAL. 別名: SHOW CREATE ROLE
SHOW_ROW_POLICIES. 級別: GLOBAL. 別名: SHOW POLICIES, SHOW CREATE ROW POLICY, SHOW CREATE POLICY
SHOW_QUOTAS. 級別: GLOBAL. 別名: SHOW CREATE QUOTA
SHOW_SETTINGS_PROFILES. 級別: GLOBAL. 別名: SHOW PROFILES, SHOW CREATE SETTINGS PROFILE, SHOW CREATE PROFILE
:) grant ACCESS MANAGEMENT on *.* to zjy;

該權限允許用戶zjy管理用戶權限,包括:創建/刪除/修改 用戶、角色、行規則、熔斷規則、SETTING、SHOW 用戶相關等等。

SYSTEM
允許根據下面的權限層級來執行 SYSTEM,改權限包含服務的關閉、刷寫、重載等。

SYSTEM. 級別: GROUP
SYSTEM SHUTDOWN. 級別: GLOBAL. 別名: SYSTEM KILL, SHUTDOWN
SYSTEM DROP CACHE. 別名: DROP CACHE
SYSTEM DROP DNS CACHE. 級別: GLOBAL. 別名: SYSTEM DROP DNS, DROP DNS CACHE, DROP DNS
SYSTEM DROP MARK CACHE. 級別: GLOBAL. 別名: SYSTEM DROP MARK, DROP MARK CACHE, DROP MARKS
SYSTEM DROP UNCOMPRESSED CACHE. 級別: GLOBAL. 別名: SYSTEM DROP UNCOMPRESSED, DROP UNCOMPRESSED CACHE, DROP UNCOMPRESSED
SYSTEM RELOAD. 級別: GROUP
SYSTEM RELOAD CONFIG. 級別: GLOBAL. 別名: RELOAD CONFIG
SYSTEM RELOAD DICTIONARY. 級別: GLOBAL. 別名: SYSTEM RELOAD DICTIONARIES, RELOAD DICTIONARY, RELOAD DICTIONARIES
SYSTEM RELOAD EMBEDDED DICTIONARIES. 級別: GLOBAL. 別名: RELOAD EMBEDDED DICTIONARIES
SYSTEM MERGES. 級別: TABLE. 別名: SYSTEM STOP MERGES, SYSTEM START MERGES, STOP MERGES, START MERGES
SYSTEM TTL MERGES. 級別: TABLE. 別名: SYSTEM STOP TTL MERGES, SYSTEM START TTL MERGES, STOP TTL MERGES, START TTL MERGES
SYSTEM FETCHES. 級別: TABLE. 別名: SYSTEM STOP FETCHES, SYSTEM START FETCHES, STOP FETCHES, START FETCHES
SYSTEM MOVES. 級別: TABLE. 別名: SYSTEM STOP MOVES, SYSTEM START MOVES, STOP MOVES, START MOVES
SYSTEM SENDS. 級別: GROUP. 別名: SYSTEM STOP SENDS, SYSTEM START SENDS, STOP SENDS, START SENDS
SYSTEM DISTRIBUTED SENDS. 級別: TABLE. 別名: SYSTEM STOP DISTRIBUTED SENDS, SYSTEM START DISTRIBUTED SENDS, STOP DISTRIBUTED SENDS, START DISTRIBUTED SENDS
SYSTEM REPLICATED SENDS. 級別: TABLE. 別名: SYSTEM STOP REPLICATED SENDS, SYSTEM START REPLICATED SENDS, STOP REPLICATED SENDS, START REPLICATED SENDS
SYSTEM REPLICATION QUEUES. 級別: TABLE. 別名: SYSTEM STOP REPLICATION QUEUES, SYSTEM START REPLICATION QUEUES, STOP REPLICATION QUEUES, START REPLICATION QUEUES
SYSTEM SYNC REPLICA. 級別: TABLE. 別名: SYNC REPLICA
SYSTEM RESTART REPLICA. 級別: TABLE. 別名: RESTART REPLICA
SYSTEM FLUSH. 級別: GROUP
SYSTEM FLUSH DISTRIBUTED. 級別: TABLE. 別名: FLUSH DISTRIBUTED
SYSTEM FLUSH LOGS. 級別: GLOBAL. 別名: FLUSH LOGS
:) grant SYSTEM  on *.* to zjy;

該權限允許用戶zjy執行SYSTEM相關操作。

INTROSPECTION

SOURCES

允許在 table engines 和 table functions中使用外部數據源。

SOURCES. 級別: GROUP
FILE. 級別: GLOBAL
URL. 級別: GLOBAL
REMOTE. 級別: GLOBAL
YSQL. 級別: GLOBAL
ODBC. 級別: GLOBAL
JDBC. 級別: GLOBAL
HDFS. 級別: GLOBAL
S3. 級別: GLOBAL
:) grant sources  on *.* to zjy; 

該權限允許用戶zjy執行sources相關操作。

dictGet:別名: dictHasdictGetHierarchydictIsIn,權限級別: DICTIONARY

:) grant dictGet  on *.* to zjy;

允許用戶執行 dictGet, dictHas, dictGetHierarchy, dictIsIn 等函數

ALL

給用戶或角色授予所有權限

:) grant ALL  on *.* to zjy;

NONE
不授予任何權限,類似於MySQL的USAGE。

:) grant NONE  on *.* to zjy;

ADMIN OPTION

:) grant xxx to zjy with admin option;

允許用戶將他們的角色分配給其它用戶:把角色xxx分配給zjy,之后zjy用戶也可以分配xxx角色。

GRANT OPTION

:) grant all on *.* to zjy with grant option;

授予 zjy 可以執行 GRANT 操作的權限,可將自身的權限對其他對象進行授權。

7. 授權(Grants privileges)

  • 給ClickHouse的用戶或角色賦予權限
  • 將角色分配給用戶或其他角色

取消權限,使用 REVOKE 語句,查看已授的權限使用 SHOW GRANTS 。

GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION]
  • privilege — 權限類型
  • role — 角色
  • user — 用戶

WITH GRANT OPTION 授予 user 或 role執行 GRANT 操作的權限,之后該用戶可將自身的權限對其他對象進行授權。

GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION]
  • role — 角色
  • user — 用戶

WITH ADMIN OPTION 子句向用戶或角色授予 ADMIN OPTION 特權。

使用 GRANT 賬號必須有 GRANT OPTION的權限。用戶只能將在自身權限范圍內的權限進行授權。如:管理員有權通過下面的語句給 john賬號添加授權

GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION

john 有權執行 GRANT OPTION,他能給其它賬號進行和自己賬號權限范圍相同的授權。可以使用* 號代替表或庫名進行授權操作。同樣,可以忽略庫名,權限將指向當前的數據庫。

可以一次給多個賬號進行多種授權操作:

 GRANT SELECT,INSERT ON *.* TO john,robin;

允許 johnrobin 賬號對任意數據庫的任意表執行 INSERT和 SELECT操作。訪問 systen數據庫總是被允許的。

8. 撤權(revoke privileges)

取消用戶的權限

REVOKE [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} FROM {user | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user | CURRENT_USER} [,...]
例如:
:) revoke alter on *.* from zjy;

說明:移除用戶zjy 的alter權限。

:) GRANT SELECT ON accounts.staff TO mira;
:) REVOKE SELECT(wage) ON accounts.staff FROM mira;

說明:授權 mira賬號能查詢 accounts.staff表的所有列,除了 wage這一列。

取消用戶的角色

REVOKE [ON CLUSTER cluster_name] [ADMIN OPTION FOR] role [,...] FROM {user | role | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user_name | role_name | CURRENT_USER} [,...]
--例如:
:) revoke xxx from zjy;

移除用戶zjy上角色xxx的權限。

9. 修改權限(ALTER)

ALTER USER:修改用戶

復制代碼
ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] 
        [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...]
    [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}]
    [[ADD | DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
    [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ]
    [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...]

--例如: 


-- 改用名
:) alter user zjy rename  to zjj;

-- 改密碼
:) alter user zjj IDENTIFIED with PLAINTEXT_PASSWORD by '123123';

-- 新增白名單
:) alter user zjj add host ip '10.2.2.2';

-- 設置角色:
:) alter user zjj default role all;

-- 修改角色限制/profile
:) alter user zjj SETTINGS PROFILE 'test';

ALTER ROLE:修改角色

ALTER ROLE [IF EXISTS] name [ON CLUSTER cluster_name]
    [RENAME TO new_name]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]
--例如:

-- 修改角色名
:) alter role xyz rename to yyy;

-- 修改角色限制/profile
:) alter role yyy SETTINGS PROFILE 'test';

ALTER ROW POLICY:修改行策略

ALTER [ROW] POLICY [IF EXISTS] name [ON CLUSTER cluster_name] ON [database.]table
    [RENAME TO new_name]
    [AS {PERMISSIVE | RESTRICTIVE}]
    [FOR SELECT]
    [USING {condition | NONE}][,...]
    [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]
--例如:
-- 改名
:) alter row policy pol1 on testdb.ttt rename to pol2;

-- 修改
:) alter row policy pol1 on testdb.ttt using id = 2;

ALTER QUOTA:修改配額熔斷規則

復制代碼
ALTER QUOTA [IF EXISTS] name [ON CLUSTER cluster_name]
    [RENAME TO new_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 | WEEK | MONTH | QUARTER | YEAR}
        {MAX { {QUERIES | ERRORS | RESULT ROWS | RESULT BYTES | READ ROWS | READ BYTES | EXECUTION TIME} = number } [,...] |
        NO LIMITS | TRACKING ONLY} [,...]]
    [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]

--例如:

-- 改名
:) alter QUOTA qB rename to qq;

-- 修改
:) alter QUOTA qq FOR INTERVAL 30 minute MAX execution_time = 1, FOR INTERVAL 3 quarter MAX queries = 4321, errors = 100 TO zjj;

ALTER SETTINGS PROFILE:修改settings配置

ALTER SETTINGS PROFILE [IF EXISTS] name [ON CLUSTER cluster_name]
    [RENAME TO new_name]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...]
--例如:

-- 改名
:) ALTER SETTINGS PROFILE max_memory_usage_profile123 rename to max_memory_usage_profile;

-- 修改
 :) ALTER SETTINGS PROFILE max_memory_usage_profile SETTINGS max_memory_usage = 100000002 MIN 90000001 MAX 110000001;

10. 刪除(drop)

DROP USER:刪除用戶
:) DROP USER [IF EXISTS] name [,...] [ON CLUSTER cluster_name];
--DROP ROLE:刪除角色,刪除的角色將從分配給它的所有實體中撤銷。

:) DROP ROLE [IF EXISTS] name [,...] [ON CLUSTER cluster_name];
--DROP ROW POLICY:刪除行策略,刪除的行策略從分配給它的所有實體中撤銷。

:) DROP [ROW] POLICY [IF EXISTS] name [,...] ON [database.]table [,...] [ON CLUSTER cluster_name];
--DROP QUOTA:刪除配額熔斷。 刪除的配額熔斷將從分配到它的所有實體中撤銷。

:) DROP QUOTA [IF EXISTS] name [,...] [ON CLUSTER cluster_name];
--DROP SETTINGS PROFILE:刪除profile文件。 已刪除的文件將從分配給它的所有實體中撤銷。

:) DROP [SETTINGS] PROFILE [IF EXISTS] name [,...] [ON CLUSTER cluster_name];

11. 查看權限(show)

--SHOW GRANTS:顯示用戶的權限
:) SHOW GRANTS [FOR user]
--SHOW CREATE USER:顯示創建用戶時用到的參數
:) SHOW CREATE USER [name | CURRENT_USER]
--SHOW CREATE ROLE:顯示創建角色時用到的參數
:) SHOW CREATE ROLE name;
--SHOW CREATE ROW POLICY:顯示創建行策略時用到的參數
:) SHOW CREATE [ROW] POLICY name ON [database.]table;
--SHOW CREATE QUOTA:顯示創建時配額熔斷時用到的參數

:) SHOW CREATE QUOTA [name | CURRENT];
--SHOW CREATE SETTINGS PROFILE:顯示創建settings時用到的參數

:) SHOW CREATE [SETTINGS] PROFILE name;
--SHOW USERS:返回用戶列表。查看用戶參數,請參閱系統表system.users。
:) SHOW USERS;
--SHOW ROLES:返回角色列表。查看角色參數,請參閱系統表system.roles 和 system.role-grants。

:) SHOW [CURRENT|ENABLED] ROLES;
--SHOW PROFILES:返回配置文件列表。要查看配置參數,請參閱系統表settings_profiles。

:) SHOW [SETTINGS] PROFILES;
--SHOW POLICIES:返回指定表的行策略列表。 要查看用戶帳戶參數,請參閱系統表system.row_policies。

:) SHOW [ROW] POLICIES [ON [db.]table];
--SHOW QUOTAS:返回配額列表。 要查看配額參數,請參閱系統表system.quotas。

:) SHOW QUOTAS;
--SHOW QUOTA:返回所有用戶或當前用戶的配額。 要查看其他參數,請參閱系統表system.quotas_usage 和 system.quota_usage。

:) SHOW [CURRENT] QUOTA;
--SHOW ACCESS:顯示目前所有的users、roles、profiles、grants信息。

:) SHOW ACCESS;
--SHOW SETTINGS:顯示系統設置的列表。 從 system.settings 表中選擇數據。

:) SHOW [CHANGED] SETTINGS LIKE|ILIKE <name>;

LIKE | ILIKE 允許為設置名稱指定匹配模式。 可以包含諸如 % 或 _ 之類的全局變量。
     LIKE:區分大小寫,
     ILIKE:不區分大小寫。
CHANGED:查詢僅返回從默認值更改的設置。

例如:

復制代碼
-- 使用 LIKE 子句查詢:
:) SHOW SETTINGS LIKE 'send_timeout';

-- 使用 ILIKE 子句查詢:
:) SHOW SETTINGS ILIKE '%CONNECT_timeout%';

-- 使用 CHANGED 子句查詢:
:) SHOW CHANGED SETTINGS ILIKE '%MEMORY%'
復制代碼

SHOW CLUSTER(s):返回集群列表。 所有可用的集群都列在 system.clusters  表中

復制代碼
-- 指定查看一個集群
:) SHOW CLUSTER '<name>';

-- 模糊匹配集群
:) SHOW CLUSTERS [LIKE|NOT LIKE '<pattern>'] [LIMIT <N>];

-- 查看所有集群
:) SHOW CLUSTERS;
復制代碼

到此,訪問權限和賬戶管理的介紹已經結束,包括了配置文件和SQL方式的設置,從用戶創建/修改/刪除、角色創建/修改/刪除、權限創建/撤等等,更多的信息信息可以見官網說明。

實戰

前提條件:因為是通過SQL-driven來進行賬號操作的,在ClickHouse安裝好之后,會有個默認賬戶default,在該用戶下面開 access_management 參數即可。開啟參數:

復制代碼
  <users>

        <default>
            <password>123456</password>
            <networks>
                <ip>::/0</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
            <access_management>1</access_management>
        </default>

    </users>
復制代碼

之后通過default用戶進行SQL-driven的賬號管理操作。

1. 創建賬號

--管理賬號
-- 創建賬號
:) create user dba host ip '127.0.0.1' identified with sha256_password by '123456';

-- 授權,all
:) grant all on *.* to dba with grant option;
--普通業務讀寫賬號
-- 創建賬號
:) create user app host ip '127.0.0.1' identified with sha256_password by '123456';

-- 授權,增刪改查權限
:) grant select,insert,alter delete,alter update on testdb.* to app; 
--只讀賬號
-- 創建賬號
:) create user ro host ip '127.0.0.1' identified with sha256_password by '123456';

-- 授權,增刪改查權限
:) grant select on testdb.* to ro;

更多的語法見上面的CREATE USER。

2. 創建Role

管理Role

復制代碼
-- 創建Role
:) CREATE ROLE DBA;

-- 授權管理
:) GRANT ALL ON *.* TO DBA with grant option;

-- 給用戶授權角色
:) GRANT DBA TO dba1;
復制代碼

讀寫Role

復制代碼
-- 創建Role
:) CREATE ROLE WRITABLE;

-- 授權增刪改查
:) GRANT select,insert,alter delete,alter update ON *.* TO WRITABLE;

-- 給用戶授權角色
:) GRANT WRITABLE TO rw;
復制代碼

只讀Role

復制代碼
-- 創建Role
:) CREATE ROLE READONLY;

-- 授權增刪改查
:) GRANT select ON *.* TO READONLY;

-- 給用戶授權角色
:) GRANT READONLY TO ro;
復制代碼

更多的語法見上面的CREATE ROLE。

3. 創建行策略

用於確定用戶可以從表中讀取哪些行的過濾器,對應配置問了里的filter參數。注意:行策略僅對具有只讀訪問權限的用戶有意義。

復制代碼
-- 創建行策略
:) CREATE ROW POLICY pol1 ON testdb.ttt USING b=1 TO app1;

-- 創建用戶,該用戶需要有select權限,才能應用
:) create user app1 host ip '127.0.0.1' identified with sha256_password by '123456'; 

-- 行策略應用,該策略只能訪問x2表id大於5的數據
:) CREATE ROW POLICY pol1 ON testdb.x2 USING id>5 TO app1;
復制代碼

更多的語法見上面的 CREATE ROW POLICY。

4. 創建QUOTA
分配給用戶或角色的配額熔斷策略,限制用戶的使用資源。 

-- 創建quota
:) CREATE QUOTA qA FOR INTERVAL 5 minute MAX queries = 10 TO app1;

限制用戶app1,5分鍾之內最多執行次數,超過則報錯:

Code: 201. DB::Exception: Received from localhost:9010. DB::Exception: Quota for user `app1` for 300s has been exceeded: queries = 11/10. Interval will end at 2021-07-01 00:20:00. Name of quota template: `qA`.

更多的語法見上面的 CREATE QUOTA。

5. 創建Profile

創建可分配給用戶或角色的的配置文件。

-- 限制用戶app的最大使用內存。
:) CREATE SETTINGS PROFILE max_memory_usage_profile SETTINGS max_memory_usage = 100000001 MIN 90000000 MAX 110000000 TO app;

更多的語法見上面的 CREATE SETTINGS PROFILE。到此,正常的用戶權限設置已經完成。

 簡單應用示例

CREATE SETTINGS PROFILE low_mem_readonly SETTINGS max_threads = 4, max_memory_usage = 2000000000 READONLY;--創建profile,設置最大最小線程 最大最小內存使用范圍,只讀權限
 
CREATE ROLE accountant SETTINGS PROFILE 'low_mem_readonly';--創建角色 設置它依賴的profile
--此處還可以限制配額
--CREATE QUOTA IF NOT EXISTS batch_quota FOR INTERVAL 3600 second MAX queries 60, MAX result_rows 1000000 TO accountant  時間區間內最大查詢次數以及最大返回結果數。
GRANT SELECT ON isv_data_prod.dm_order TO accountant;--將數據庫查詢權限給角色
GRANT SELECT ON isv_data_prod.dwd_merchant_allattr TO accountant;--將數據庫查詢權限給角色
CREATE USER IF NOT EXISTS isv_read_ward IDENTIFIED WITH PLAINTEXT_PASSWORD BY 'TKMWq9WE' DEFAULT ROLE accountant; --不指定ip默認都可以進行連接 把角色分配給用戶
 
 --登錄方式
clickhouse-client -u isv_read_ward -h 10.3.97.14 --password TKMWq9WE

 

總結

從上面看到,通過SQL-driven來設置用戶權限和管理比修改配置文件要方便很多,官方也推薦使用該方式進行用戶權限管理。通過該方式配置的用戶都是以文件形式存儲在access目錄中,該目錄的位置是由參數 local_directory 控制:

      <local_directory>
            <!-- Path to folder where users created by SQL commands are stored. -->
            <!-- <path>/var/lib/clickhouse/access/</path> -->
            <path>/ccdata/clickhouse/access/</path>
        </local_directory>

注意,如果把該目錄的文件刪除,則會讓這些用戶角色全部失效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM