美文网首页clickhouse
clickhouse 行权限踩坑

clickhouse 行权限踩坑

作者: 定金喜 | 来源:发表于2023-01-18 11:45 被阅读0次

    背景

    clickhouse权限管理是基于RBAC(Role-Based Access Control)的访问控制管理,即通过SQL-driven来进行管理。在 RBAC 中,权限与角色相关联,通过成为角色的成员而得到这些角色的权限。简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,ClickHouse推荐使用该方式进行用户权限管理。更多的信息可以看官方文档。https://clickhouse.com/docs/zh/operations/access-rights/#access-rights

    增加用户

    项目需要增加一个新的只读用户,但是该用户只有部分表的部分数据权限,按照官方文档,大概的步骤如下:
    1.手动开启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>
    

    2.用default用户登录,如果我们要新增一个用户B,这个用户只需要表C和D的no=10的权限,库名test,则整个sql如下:

    create user B IDENTIFIED WITH PLAINTEXT_PASSWORD BY '123456';
    create role IF NOT EXISTS test_role;
    GRANT select on test.C to test_role;
    GRANT select on test.D to test_role;
    GRANT test_role TO test;
    
    create row policy test_C_policy_no10 on test.C using no=10 to test_role;
    create row policy test_D_policy_no10 on test.D using no=10 to test_role;
    

    执行完这些sql,登录用户B进入数据库,确实这个用户只有C和D表no=10的数据,本来觉得一切已经大功告成了,但是过了几个小时,突然被同事告知线上有问题,我一想我也没干啥,除了.....,但是我只是增加了一个新用户,老用户我也没动,不可能有问题吧,然后我去测试环境试了下,没想到执行同样的sql后,我发现此时default用户已经查不到C和D表任何数据
    ----使用default用户--------
    select count() from test.C; ---0
    select count(
    ) from test.D; ---0

    什么情况啊,当时我只想日了够

    问题原因排查

    因为以前也新建过只读用户,但是没有设置行权限,所以我觉得唯一可能出现问题的地方就是行权限的设置,所以我先把行权限删除,先恢复,切换到default用户执行:
    drop row policy test_C_policy_no10 on test.C;
    drop row policy test_D_policy_no10 on test.D;

    删除后去执行count,发现此时已经恢复正常,所以行权限设置可能存在问题,然后去官方又瞄了几眼,然后发现了这样几行描述


    意思就是说,新建对一个表的行权限,当这个行权限赋给用户A时,那么除了A之外的所有用户会失去对这个A表所有数据的权限,所以需要通过新建个全量的权限给除了A用户之外的用户
    CREATE ROW POLICY pol2 ON mydb.table1 USING 1 TO ALL EXCEPT A

    然后我特意去咨询了下作者,我觉得这么设计有点不好理解,作者也给出了自己的理解。


    所以回到我们上面的问题,新建行权限的sql就变为:

    ------先执行这个,防止先执行后两行导致default瞬间无数据权限,可能会导致线上故障-------------------
    create row policy test_C_policy_noALL on test.C using 1 EXCEPT B;
    create row policy test_D_policy_noALL on test.D using 1 EXCEPT B;

    create row policy test_C_policy_no10 on test.C using no=10 to test_role;
    create row policy test_D_policy_no10 on test.D using no=10 to test_role;

    相关文章

      网友评论

        本文标题:clickhouse 行权限踩坑

        本文链接:https://www.haomeiwen.com/subject/dzexhdtx.html