一、 需求背景
业务方希望用户能访问系统表,但只能访问到本用户相关数据,不要访问到其他用户。
系统表列表:
表名 | 描述 |
---|
system.users | 用户 | system.columns | 字段 | system.parts | 分区 | system.tables | 表 | system.databases | 数据库 | system.roles | 角色 | system.data_skipping_indices | 二级索引 | system.grants | 授权 |
用户列表:user1,user2,user3,user4,user5
二、 需求实现
1.?创建角色
create role role_db_metadata on cluster my_cluster;
2. 授权角色与用户
GRANT show users on *.* TO role_db_metadata on cluster my_cluster; -- system.users
GRANT SELECT ON system.tables TO role_db_metadata on cluster my_cluster;
GRANT SELECT ON system.data_skipping_indices TO role_db_metadata on cluster my_cluster;
GRANT show roles on *.* TO 用户名 on cluster my_cluster; -- system.roles,测试show roles on *.* 加给role后再授权无效
GRANT role_db_metadata to 用户名 on cluster my_cluster;
备注:
- system.columns,system.parts,system.databases 不需要额外授权和加行策略
- system.roles,system.tables 不需要额外加行策略
- system.grants = show users on *.* + show roles on *.* ,不需要额外授权
?
3. 为角色/用户建行策略
- CREATE ROW POLICY 策略名 ON db名.表名 FOR SELECT USING 行策略条件 TO ALL EXCEPT default on cluster my_cluster;
- TO ALL EXCEPT default 表示对除default用户外的所有用户均生效
CREATE ROW POLICY policy_query_users_for_users ON system.users FOR SELECT USING name = currentUser() TO ALL EXCEPT default on cluster my_cluster;
CREATE ROW POLICY policy_query_skip_for_users ON system.data_skipping_indices FOR SELECT USING database = currentDatabase() TO ALL EXCEPT default on cluster my_cluster;
CREATE ROW POLICY policy_query_grants_for_users ON system.grants FOR SELECT USING user_name = currentUser() TO ALL EXCEPT default on cluster my_cluster;
三、 生成脚本
因为用户较多,一个个写授权sql比较麻烦,可以用shell脚本生成语句
#!/bin/sh
# 批量生成授权语句
ch_list=(user1 user2 user3 user4 user5)
logfile=grant_to_user.txt
for i in {0..4}
do
echo -e "grant role_db_metadata to ${ch_list[$i]} on cluster my_cluster;" >> $logfile
echo -e "grant show roles on *.* to ${ch_list[$i]} on cluster my_cluster;\n" >> $logfile
done
参考?ROW POLICY | ClickHouse文档
|