在 ClickHouse 中创建用户和角色
ClickHouse 支持基于 RBAC 方法的访问控制管理。
ClickHouse 访问实体
您可以使用以下方法配置访问实体
我们建议使用 SQL 驱动的流程。两种配置方法同时工作,因此如果您使用服务器配置文件来管理帐户和访问权限,您可以顺利切换到 SQL 驱动的流程。
您不能同时使用两种配置方法来管理同一个访问实体。
如果您希望管理 ClickHouse Cloud Console 用户,请参考此 页面
要查看所有用户、角色、配置文件等以及它们的全部授予,请使用 SHOW ACCESS 语句。
概述
默认情况下,ClickHouse 服务器提供 default
用户帐户,该帐户不允许使用 SQL 驱动的访问控制和帐户管理,但拥有所有权限。default
用户帐户在未定义用户名的情况下使用,例如,从客户端登录或在分布式查询中。在分布式查询处理中,如果服务器或集群的配置未指定 用户和密码 属性,则会使用默认用户帐户。
如果您刚刚开始使用 ClickHouse,请考虑以下场景
- 启用
default
用户的 SQL 驱动的访问控制和帐户管理。 - 登录到
default
用户帐户并创建所有必需的用户。不要忘记创建管理员帐户(GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION
)。 - 限制
default
用户的权限并禁用其 SQL 驱动的访问控制和帐户管理。
当前解决方案的属性
- 即使数据库和表不存在,您也可以授予其权限。
- 如果表被删除,则所有与该表对应的特权都不会被撤销。这意味着即使您稍后创建具有相同名称的新表,所有特权仍然有效。要撤销与已删除表对应的特权,您需要执行例如
REVOKE ALL PRIVILEGES ON db.table FROM ALL
查询。 - 特权没有生命周期设置。
用户帐户
用户帐户是一个访问实体,允许在 ClickHouse 中授权某人。用户帐户包含
- 身份信息。
- 特权,定义用户可以执行的查询范围。
- 允许连接到 ClickHouse 服务器的主机。
- 分配的角色和默认角色。
- 用户登录时默认应用其约束的设置。
- 分配的设置配置文件。
可以通过 GRANT 查询或分配 角色 来授予用户帐户权限。要撤销用户的权限,ClickHouse 提供了 REVOKE 查询。要列出用户的权限,请使用 SHOW GRANTS 语句。
管理查询
设置应用
设置可以以不同的方式配置:对于用户帐户、其授予的角色以及设置配置文件。在用户登录时,如果为不同的访问实体配置了设置,则将按以下顺序应用此设置的值和约束(从高到低优先级)
- 用户帐户设置。
- 用户帐户的默认角色的设置。如果在某些角色中配置了设置,则设置应用顺序未定义。
- 分配给用户或其默认角色的设置配置文件中的设置。如果在某些配置文件中配置了设置,则设置应用顺序未定义。
- 默认情况下或从 默认配置文件 应用于所有服务器的设置。
角色
角色是访问实体的容器,可以授予用户帐户。
角色包含
- 特权
- 设置和约束
- 分配角色列表
管理查询
可以通过 GRANT 查询来授予角色权限。要撤销角色的权限,ClickHouse 提供了 REVOKE 查询。
行策略
行策略是一个过滤器,定义哪些行对用户或角色可用。行策略包含针对特定表的过滤器,以及应使用此行策略的角色和/或用户列表。
行策略仅对具有只读访问权限的用户有意义。如果用户可以修改表或在表之间复制分区,它将破坏行策略的限制。
管理查询
设置配置文件
设置配置文件是 设置 的集合。设置配置文件包含设置和约束,以及应用此配置文件的角色和/或用户列表。
管理查询
- CREATE SETTINGS PROFILE
- ALTER SETTINGS PROFILE
- DROP SETTINGS PROFILE
- SHOW CREATE SETTINGS PROFILE
- SHOW PROFILES
配额
配额限制资源使用。请参阅 配额。
配额包含一些持续时间的限制集,以及应使用此配额的角色和/或用户列表。
管理查询
启用 SQL 驱动的访问控制和帐户管理
设置配置存储的目录。
ClickHouse 将访问实体配置存储在 access_control_path 服务器配置参数中设置的文件夹中。
启用 SQL 驱动的访问控制和帐户管理,至少针对一个用户帐户。
默认情况下,所有用户都禁用了 SQL 驱动的访问控制和帐户管理。您需要在
users.xml
配置文件中配置至少一个用户,并将access_management
、named_collection_control
、show_named_collections
和show_named_collections_secrets
设置的值设置为 1。
定义 SQL 用户和角色
如果您在使用 ClickHouse Cloud,请参阅 云访问管理。
本文介绍了定义 SQL 用户和角色以及将这些权限和许可应用于数据库、表、行和列的基本知识。
启用 SQL 用户模式
在
users.xml
文件中,在<default>
用户下启用 SQL 用户模式<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>注意default
用户是唯一在全新安装时创建的用户,也是默认用于节点间通信的帐户。在生产环境中,建议在使用 SQL 管理员用户配置节点间通信并使用
<secret>
、集群凭据和/或节点间 HTTP 和传输协议凭据设置节点间通信后禁用此用户,因为default
帐户用于节点间通信。重新启动节点以应用更改。
启动 ClickHouse 客户端
clickhouse-client --user default --password <password>
定义用户
- 创建一个 SQL 管理员帐户
CREATE USER clickhouse_admin IDENTIFIED BY 'password';
- 授予新用户完全的管理权限
GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;
ALTER 权限
本文旨在让您更好地了解如何定义权限,以及在对特权用户使用 ALTER
语句时权限如何工作。
ALTER
语句分为几个类别,其中一些是分层的,而另一些则不是分层的,必须明确定义。
示例 DB、表和用户配置
- 使用管理员用户创建一个示例用户
CREATE USER my_user IDENTIFIED BY 'password';
- 创建示例数据库
CREATE DATABASE my_db;
- 创建一个示例表
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
- 创建一个示例管理员用户来授予/撤销权限
CREATE USER my_alter_admin IDENTIFIED BY 'password';
要授予或撤销权限,管理员用户必须具有 WITH GRANT OPTION
权限。例如
GRANT ALTER ON my_db.* WITH GRANT OPTION
要授予或撤销权限,用户首先必须拥有这些权限本身。
授予或撤销权限
ALTER
层次结构
.
├── ALTER (only for table and view)/
│ ├── ALTER TABLE/
│ │ ├── ALTER UPDATE
│ │ ├── ALTER DELETE
│ │ ├── ALTER COLUMN/
│ │ │ ├── ALTER ADD COLUMN
│ │ │ ├── ALTER DROP COLUMN
│ │ │ ├── ALTER MODIFY COLUMN
│ │ │ ├── ALTER COMMENT COLUMN
│ │ │ ├── ALTER CLEAR COLUMN
│ │ │ └── ALTER RENAME COLUMN
│ │ ├── ALTER INDEX/
│ │ │ ├── ALTER ORDER BY
│ │ │ ├── ALTER SAMPLE BY
│ │ │ ├── ALTER ADD INDEX
│ │ │ ├── ALTER DROP INDEX
│ │ │ ├── ALTER MATERIALIZE INDEX
│ │ │ └── ALTER CLEAR INDEX
│ │ ├── ALTER CONSTRAINT/
│ │ │ ├── ALTER ADD CONSTRAINT
│ │ │ └── ALTER DROP CONSTRAINT
│ │ ├── ALTER TTL/
│ │ │ └── ALTER MATERIALIZE TTL
│ │ ├── ALTER SETTINGS
│ │ ├── ALTER MOVE PARTITION
│ │ ├── ALTER FETCH PARTITION
│ │ └── ALTER FREEZE PARTITION
│ └── ALTER LIVE VIEW/
│ ├── ALTER LIVE VIEW REFRESH
│ └── ALTER LIVE VIEW MODIFY QUERY
├── ALTER DATABASE
├── ALTER USER
├── ALTER ROLE
├── ALTER QUOTA
├── ALTER [ROW] POLICY
└── ALTER [SETTINGS] PROFILE
- 授予用户或角色
ALTER
权限
使用 GRANT ALTER on *.* TO my_user
仅会影响顶层的 ALTER TABLE
和 ALTER VIEW
,其他 ALTER
语句必须分别授予或撤销。
例如,授予基本 ALTER
权限
GRANT ALTER ON my_db.my_table TO my_user;
产生的权限集
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3
┌─GRANTS FOR my_user───────────────────────────────────────────┐
│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user │
└──────────────────────────────────────────────────────────────┘
这将授予上例中 ALTER TABLE
和 ALTER VIEW
下的所有权限,但不会授予某些其他 ALTER
权限,例如 ALTER ROW POLICY
(请参阅层次结构,您会发现 ALTER ROW POLICY
不是 ALTER TABLE
或 ALTER VIEW
的子级)。这些必须明确授予或撤销。
如果只需要 ALTER
权限的子集,那么每个权限都可以单独授予,如果有该权限的子权限,那么这些子权限也会自动授予。
例如
GRANT ALTER COLUMN ON my_db.my_table TO my_user;
授权将设置为
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2
┌─GRANTS FOR my_user────────────────────────────────┐
│ GRANT ALTER COLUMN ON default.my_table TO my_user │
└───────────────────────────────────────────────────┘
1 row in set. Elapsed: 0.004 sec.
这也提供以下子权限
ALTER ADD COLUMN
ALTER DROP COLUMN
ALTER MODIFY COLUMN
ALTER COMMENT COLUMN
ALTER CLEAR COLUMN
ALTER RENAME COLUMN
- 从用户和角色撤销
ALTER
权限
REVOKE
语句的工作方式与 GRANT
语句类似。
如果用户/角色被授予子权限,您可以直接撤销该子权限,也可以撤销下一个上级权限。
例如,如果用户被授予 ALTER ADD COLUMN
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683
┌─GRANTS FOR my_user──────────────────────────────────┐
│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │
└─────────────────────────────────────────────────────┘
权限可以单独撤销
REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user;
或者可以从任何上层级别撤销(撤销所有 COLUMN 子权限)
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user
Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: e7d341de-de65-490b-852c-fa8bb8991174
Ok.
0 rows in set. Elapsed: 0.003 sec.
其他 权限必须由具有 WITH GRANT OPTION
且自身也具有这些权限的用户授予。
- 要授予管理员用户权限并允许他们管理一组权限,以下是一个示例
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
现在,用户可以授予或撤销 ALTER COLUMN
及其所有子权限。
测试
- 添加
SELECT
权限
GRANT SELECT ON my_db.my_table TO my_user;
- 向用户添加添加列权限
GRANT ADD COLUMN ON my_db.my_table TO my_user;
- 使用受限用户登录
clickhouse-client --user my_user --password password --port 9000 --host <your_clickhouse_host>
- 测试添加列
ALTER TABLE my_db.my_table ADD COLUMN column2 String;
ALTER TABLE my_db.my_table
ADD COLUMN `column2` String
Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5
Ok.
0 rows in set. Elapsed: 0.010 sec.
DESCRIBE my_db.my_table;
DESCRIBE TABLE my_db.my_table
Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272
┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ UInt64 │ │ │ │ │ │
│ column1 │ String │ │ │ │ │ │
│ column2 │ String │ │ │ │ │ │
└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
- 测试删除列
ALTER TABLE my_db.my_table DROP COLUMN column2;
ALTER TABLE my_db.my_table
DROP COLUMN column2
Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED)
- 通过授予权限来测试 ALTER 管理员
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
- 使用 ALTER 管理员用户登录
clickhouse-client --user my_alter_admin --password password --port 9000 --host <my_clickhouse_host>
- 授予子权限
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba
Ok.
- 测试授予 ALTER 管理员用户没有的权限,这不是管理员用户的授权子权限。
GRANT ALTER UPDATE ON my_db.my_table TO my_user;
GRANT ALTER UPDATE ON my_db.my_table TO my_user
Query id: 191690dc-55a6-4625-8fee-abc3d14a5545
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED)
总结 ALTER
权限对于使用表格和视图的 ALTER
是分层的,但对于其他 ALTER
语句则不是。可以按粒度级别或按权限分组来设置权限,并且可以类似地撤销它们。授予或撤销权限的用户必须具有 WITH GRANT OPTION
以设置用户权限,包括他们自己,并且必须已经拥有该权限。如果用户自身没有授予选项权限,则他们无法撤销自己的权限。