ClickHouse集群用户行策略与分片数据可见性异常问题咨询
ClickHouse分布式表行策略权限问题解析
核心原因:不是Bug,是跨分片查询的权限传递逻辑
这是ClickHouse分布式表的正常行为,并非Bug。关键在于分布式表跨分片查询时的身份传递规则:
- 当你用
admin_user查询分布式表时,当前节点会自动以default用户的身份,向其他分片的节点发起子查询,拉取对应分片本地表的数据。 - 仅给
admin_role添加行策略时,其他分片的default用户没有访问local_table的行权限(行策略仅授权给admin_role),所以远程节点返回空数据,最终你只能看到当前分片的数据。 - 给
default添加行策略后,远程节点的default用户具备了访问本地表的权限,能正常返回数据,所以admin_user就能拿到全部分片的数据。
对应验证步骤的逻辑解释
- 未添加行策略时:
default用户默认拥有全量权限,跨分片查询时远程节点能正常返回数据,所以admin_user和default都能看到全部分片数据。 - 仅给
admin_role加行策略后:- 当前分片:
admin_user通过admin_role的行策略可以访问本地表,能拿到当前分片数据。 - 其他分片:远程查询用
default身份,但default没有对应行策略,无法访问本地表,返回空。 - 最终
admin_user只能看到当前分片数据,而default因为没有行策略,连当前分片数据也看不到。
- 当前分片:
- 给
default加行策略后:远程查询的default能访问所有分片的本地表,所以admin_user能获取到全量数据。
正确解决方法
不需要给default用户添加行策略,推荐以下两种更安全的方式:
- 让分布式表使用发起查询的用户身份跨分片查询
创建分布式表时指定user参数,让跨分片查询复用当前用户的身份:
若已创建分布式表,可修改配置:CREATE TABLE testdb.distributed_table ON CLUSTER '{cluster}' AS testdb.local_table ENGINE = Distributed('{cluster}', testdb, local_table, rand(), 'admin_user');ALTER TABLE testdb.distributed_table ON CLUSTER '{cluster}' MODIFY SETTING user = 'admin_user'; - 给跨分片查询的用户配置对应权限(不推荐,有安全风险)
如果必须用default做跨分片查询,确保default拥有本地表的行权限,但这会扩大default的权限范围,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Maik Jevdokimov
相关产品推荐
相关产品推荐

