Clickhouse 系统表授权与行策略

本文介绍如何在ClickHouse中实现用户访问系统表的精细权限控制,包括创建角色、分配权限、行策略应用,以及使用shell脚本批量授权。重点在于确保用户只能访问与其自身相关数据,而不能访问其他用户的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 需求背景

业务方希望用户能访问系统表,但只能访问到本用户相关数据,不要访问到其他用户。

系统表列表:

表名描述
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;
-- 上面行策略会使default用户也无法查询user信息(虽然有加EXCEPT default),利用本策略覆盖
CREATE ROW POLICY policy_query_users_default ON system.users FOR SELECT USING 1 = 1 TO 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
# 批量生成授权语句
user_list=(user1 user2 user3 user4 user5)
logfile=grant_to_user.log
 
for user in ${user_list[@]}
do
    echo -e "grant role_db_metadata to ${user} on cluster my_cluster;" >> $logfile
    echo -e "grant show roles on *.* to ${user} on cluster my_cluster;\n" >> $logfile
done

参考 ROW POLICY | ClickHouse文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值