【问题标题】:Can I set a user which can read one database and read/write another database in clickhouse我可以在clickhouse中设置一个可以读取一个数据库并读取/写入另一个数据库的用户吗
【发布时间】:2020-08-27 22:29:05
【问题描述】:

Clickhouse官方文档暗示一个用户只能有一个配置文件,并且数据库配置在user部分,readonly配置在配置部分,所以readonly将影响所有用户的数据库。 那么,如何设置用户x只能读取数据库dbA,但可以读写数据库dbB

【问题讨论】:

    标签: readonly clickhouse access-rights


    【解决方案1】:

    考虑使用SQL-driven access control management

    1. 准备测试环境:
    CREATE DATABASE db_01;
    CREATE DATABASE db_02;
    CREATE TABLE db_01.table_01 (id Int32) Engine = Memory();
    CREATE TABLE db_02.table_02 (id Int32) Engine = Memory();
    INSERT INTO db_01.table_01 VALUES (1), (2);
    INSERT INTO db_02.table_02 VALUES (10), (20);
    
    1. 创建用户并分配所需的权限:
    CREATE USER user_01 HOST ANY PROFILE 'default';
    
    /* Set readonly access to DB 'db_01'. */
    GRANT SELECT ON db_01.* TO user_01;
    
    /* Set read-write access to DB 'db_02'. */
    GRANT SELECT ON db_02.* TO user_01;
    GRANT INSERT ON db_02.* TO user_01;
    
    1. 测试(需要以user_01身份登录):
    SELECT currentUser(); /* Make sure that user is right. */
    /*
    ┌─currentUser()─┐
    │ user_01       │
    └───────────────┘
    */
    
    SHOW GRANTS; /* Double check the assigned privileges. */
    /*
    ┌─GRANTS─────────────────────────────────────┐
    │ GRANT SELECT ON db_01.* TO user_01         │
    │ GRANT INSERT, SELECT ON db_02.* TO user_01 │
    └────────────────────────────────────────────┘
    */
    
    SELECT * FROM db_01.table_01; /* OK */
    INSERT INTO db_01.table_01 VALUES (3); /* DB::Exception: user_01: Not enough privileges. */
    
    SELECT * FROM db_02.table_02; /* OK */
    INSERT INTO db_02.table_02 VALUES (30); /* OK */
    

    上面的代码只是为了演示,你需要考虑引入角色/配额/..,继承另一个用户配置文件(更严格,不是'默认')等。

    【讨论】:

    • 这个新功能似乎随新版本(20.x)发布,但我们在生产中使用的是 18.16。还有其他方法可以做到这一点吗?如果没有,我会考虑升级版本。
    • 不幸的是没有别的办法。创建两个单独的用户也许有意义——一个是可写的,第二个是只读的? (仅供参考:allow_databases 部分也很有用)
    • 非常感谢。但是我需要在一个会话中查询多个数据库,所以我必须使用同一个用户。我会考虑其他解决方案或更新ck。
    • Direct create user is throw error on version 21.12.2.7 。将其更改为:CREATE USER user_01 HOST ANY SETTINGS PROFILE 'default';
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2013-03-31
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多