其他分享
首页 > 其他分享> > [ClickHouse] 管理用户权限的两种方案

[ClickHouse] 管理用户权限的两种方案

作者:互联网

目录

1. 序言

一般情况下, 可以通过配置文件/etc/clickhouse-server/users.xml来设置用户权限, 比如设置用户的资源占用/参数取值/对某个数据库的读写权限等. 但是对于一些更精细的权限管理, 使用配置文件很难实现或者实现起来特别麻烦, 比如考虑这样一个应用场景: 有两个数据库 A 和 B, 用户 test 对数据库 A 只有读取权限, 对数据库 B 有读写和修改权限. 对于这种情况, 可以使用 ClickHouse 给出的另一种更灵活的权限管理方案SQL-driven workflow(SQL驱动的工作流)来解决, 这也是 ClickHouse 官方比较推荐的方案, 本文主要介绍这种方案的使用方法.

2. 通过配置文件管理用户权限

详情参考下面这篇讲解非常详细的文章
ClickHouse学习系列之二【用户权限管理】

3. 通过 SQL 驱动方式管理用户权限

SQL 驱动方式简单来说就是通过 SQL 语句(主要是 GRANT/REVOKE 命令)来为用户赋予或撤销权限, 直接使用 SQL 将某个权限赋予某个用户是可行的, 问题是当涉及到的权限和用户比较多时, 这种做法会很不方便, 于是 ClickHouse 中定义了另外一个概念角色(role)
角色可以理解为权限的集合体, 先将一系列权限赋予某个角色, 然后将角色赋予某个用户(通过 GRANT 命令), 这样就可以将角色携带的权限赋予用户. 在管理权限时, 可以将若干个权限赋予某个角色, 也可以将若干个角色赋予某个用户, 这样就能在保证灵活性的同时降低管理的复杂度.

3.1 开启SQL驱动方式的访问权限和账户管理

默认情况下是不能通过SQL驱动方式来访问权限和账户管理的, 需要在配置文件中为某个用户开启这项功能, 具体来说就是在/etc/clickhouse-server/users.xml中的users中的某个用户下添加下面这一行代码

<access_management>1</access_management>

3.2 创建用户

创建用户时有一点需要注意, 事先已经在配置文件中配置过的用户是无法通过 SQL 驱动方式来操作的, 需要使用 SQL 创建用户.

CREATE USER IF NOT EXISTS test IDENTIFIED BY '123456'
CREATE USER OR REPLACE test IDENTIFIED BY '123456'

3.3 创建角色

CREATE ROLE IF NOT EXISTS read_db_a
CREATE ROLE OR REPLACE read_db_a

3.4 为用户或角色赋予权限

SHOW GRANTS FOR user/role
GRANT SELECT ON A.* TO test
CREATE ROLE OR REPLACE role_a;
GRANT SELECT ON A.* TO role_a;
GRANT role_a TO test;

对于开头提出的应用场景, 使用 SQL 驱动方式的解决方法如下

// 创建用户
CREATE USER OR REPLACE test IDENTIFIED BY '123456'
// 创建只读数据库 A 的角色 role_a
CREATE ROLE OR REPLACE role_a;
GRANT SELECT ON A.* TO role_a;
// 创建能读写和修改数据库 B 的角色 role_b
CREATE ROLE OR REPLACE role_b;
GRANT SELECT,INSERT,ALTER ON B.* TO role_b;
// 将 role_a 和 role_b 的权限赋予用户 test
GRANT role_a,role_b TO test;

上面的例子只是一个基础的示例, 通过 SQL 驱动方式可以管理精细到表和列的权限, 详情参考官网 https://clickhouse.tech/docs/zh/sql-reference/statements/grant/#admin-option-privilege

3.5 从用户撤销权限

撤销用户权限时有一点需要注意, 如果用户的权限是通过 GRANT 直接赋予的, 那么可以使用 REVOKE 直接撤销, 但如果用户的权限是通过角色赋予的, 那么撤销权限时也要通过角色, 不能使用 REVOKE 直接撤销.

REVOKE SELECT ON A.* FROM role_a;
REVOKE SELECT ON A.* FROM test;
REVOKE SELECT ON A.* FROM role_a;

标签:角色,赋予,用户,role,SQL,权限,ClickHouse
来源: https://blog.csdn.net/weixin_42902669/article/details/117327164