背景
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;
网友评论