古语有云:“道路千万条,安全第一条,开车不规范,亲人两行泪”
纵观历史上的知名删库跑路战役,MongoDB、ES、Redis之前都出过由于权限缺失导致的重大安全事故。
ClickHouse 的访问控制包括以下元素:
- 用户帐户
- 角色(Role)
- 行策略(Row Policy)
- 设置配置文件(Profile)
- 配额(Quota)
配置访问权限方式有两种:
SQL语句的工作流,类似MySQL。默认关闭需要启用此功能。
服务器配置文件 users.xml 和 config.xml
目前两种方式同时生效,如果使用服务器配置文件来管理用户和访问权限,可以轻松地过渡到基于SQL语句的。
但是要注意:不能通过两种配置方法同时管理同一访问实体。
下面就对这两种方式分别测试下。
基于SQL方式的权限管理
官方建议使用SQL语句的方式来管理权限,虽然这是在最近版本中才加入的。
ClickHouse新版本已支持基于RBAC方法的访问控制管理
关于RBAC:
https://en.wikipedia.org/wiki/Role-based_access_control
默认情况下,ClickHouse服务器使用用户default连接数据库,它具有所有的权限,不需要密码。但却是基于配置文件管理的。
新部署的ClickHouse建议使用以下方式管理用户:
为default用户启用 SQL方式 的访问控制
用default用户登录并创建所有必需的用户。
建议创建一个管理员帐户:
GRANT ALL ON *.* TO ch_dba WITH GRANT OPTION
限制default用户权限,并禁用 SQL方式 访问控制和帐户管理。
举个例子:
# 直接建立用户会报错:
bj80 :) CREATE USER ch_dba HOST IP '127.0.0.1' IDENTIFIED WITH sha256_password BY 'qwerty';
CREATE USER ch_dba IDENTIFIED WITH sha256_hash BY '65E84BE33532FB784C48129675F9EFF3A682B27168C0EA744B2CF58EE02337C5' HOST LOCAL
Received exception from server (version 20.4.2):
Code: 497. DB::Exception: Received from localhost:9000. DB::Exception: default: Not enough privileges. To execute this query it s necessary to have the grant CREATE USER ON *.*.
0 rows in set. Elapsed: 0.811 sec.
# 修改配置文件
/etc/clickhouse-server/users.xml
# 在user default 用户里添加一行 access_management 参数启动SQL方式认证 (1启动 0禁止,默认0)
<users>
<default>
<!-- User can create other users and grant rights to them. -->
<!-- <access_management>1</access_management> -->
<access_management>1</access_management>
</default>
</users>
# 再次建用户成功了:
bj80 :) CREATE USER ch_dba HOST IP '127.0.0.1' IDENTIFIED WITH sha256_password BY 'qwerty';
CREATE USER ch_dba IDENTIFIED WITH sha256_hash BY '65E84BE33532FB784C48129675F9EFF3A682B27168C0EA744B2CF58EE02337C5' HOST LOCAL
Ok.
0 rows in set. Elapsed: 0.001 sec.
bj80 :)
# 对DBA用户进行授权:(官方文档中的语法有误,WITH GRANT OPTION要放在最后)
bj80 :) GRANT ALL ON *.* WITH GRANT OPTION TO ch_dba;
Syntax error: failed at position 18:
GRANT ALL ON *.* WITH GRANT OPTION TO ch_dba;
Expected one of: Comma, ON, TO, token
bj80 :) GRANT ALL ON *.* TO ch_dba WITH GRANT OPTION;
GRANT ALL ON *.* TO ch_dba WITH GRANT OPTION
Ok.
0 rows in set. Elapsed: 0.001 sec.
bj80 :)
# 检查下权限:
bj80 :) show create user ch_dba;
SHOW CREATE USER ch_dba
┌─CREATE USER ch_dba────────────┐
│ CREATE USER ch_dba HOST LOCAL │
└───────────────────────────────┘
1 rows in set. Elapsed: 0.001 sec.
bj80 :) show grants for ch_dba;
SHOW GRANTS FOR ch_dba
┌─GRANTS FOR ch_dba────────────────────────────┐
│ GRANT ALL ON *.* TO ch_dba WITH GRANT OPTION │
└──────────────────────────────────────────────