[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
  • 使用 SQL 为用户赋予读取权限
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;
  • 从用户撤销权限(权限通过 GRANT 直接赋予)
REVOKE SELECT ON A.* FROM test;
  • 从用户撤销权限(权限通过角色 role_a 赋予)
REVOKE SELECT ON A.* FROM role_a;
上一篇:Redis-20Spring缓存机制整合Redis


下一篇:微服务统一管理swagger及简单接口测试功能