跳到主要内容
跳到主要内容

在 ClickHouse 中创建用户和角色

ClickHouse 支持基于 RBAC 方法的访问控制管理。

ClickHouse 访问实体:

您可以使用以下方式配置访问实体:

  • 基于 SQL 的工作流程。

    您需要 启用 此功能。

  • 服务器 配置文件 users.xmlconfig.xml

我们推荐使用基于 SQL 的工作流程。这两种配置方法可以同时工作,因此如果您使用服务器配置文件来管理账户和访问权限,可以顺利切换到基于 SQL 的工作流程。

备注

您无法同时通过这两种配置方法管理同一访问实体。

备注

如果您希望管理 ClickHouse Cloud 控制台用户,请参考此 页面

要查看所有用户、角色、配置文件等及其所有授权,请使用 SHOW ACCESS 语句。

概述

默认情况下,ClickHouse 服务器提供名为 default 的用户账户,该账户不允许使用基于 SQL 的访问控制和账户管理,但拥有所有权限和授权。当未定义用户名时,例如,从客户端登录或在分布式查询中,使用 default 用户账户。在处理分布式查询时,如果服务器或集群的配置未指定 用户和密码 属性,则使用 default 用户账户。

如果您刚开始使用 ClickHouse,请考虑以下场景:

  1. 启用 SQL 驱动的访问控制和账户管理,针对 default 用户。
  2. 登录到 default 用户账户并创建所需的所有用户。不要忘记创建管理员账户 (GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION)。
  3. 限制权限default 用户并禁用其 SQL 驱动的访问控制和账户管理。

当前解决方案的属性

  • 您可以授予数据库和表的权限,即使它们不存在。
  • 如果表被删除,与该表对应的所有特权不会被撤销。这意味着,即使您稍后创建一个同名的新表,所有的特权仍然有效。要撤销与已删除表对应的特权,您需要执行,例如,REVOKE ALL PRIVILEGES ON db.table FROM ALL 查询。
  • 特权没有生命周期设置。

用户账户

用户账户是一个访问实体,允许在 ClickHouse 中对某人进行授权。用户账户包含:

  • 身份信息。
  • 定义用户可以执行的查询范围的 特权
  • 允许连接到 ClickHouse 服务器的主机。
  • 指派的角色和默认角色。
  • 用户登录时默认应用的设置及其约束。
  • 指派的设置配置文件。

特权可以通过 GRANT 查询授予用户账户,或通过分配 角色。要撤销用户的特权,ClickHouse 提供了 REVOKE 查询。要列出用户的特权,请使用 SHOW GRANTS 语句。

管理查询:

设置应用

可以以不同方式配置设置:针对用户账户、其授予的角色或设置配置文件。在用户登录时,如果为不同的访问实体配置了某个设置,则按以下优先级应用该设置的值和约束(从高到低):

  1. 用户账户设置。
  2. 用户账户的默认角色的设置。如果某些角色中配置了设置,则设置应用的顺序未定义。
  3. 分配给用户或其默认角色的设置配置文件中的设置。如果某些配置文件中配置了设置,则设置应用的顺序未定义。
  4. 默认情况下或从 默认配置文件 应用于整个服务器的设置。

角色

角色是一个容器,可以授予用户账户的访问实体。

角色包含:

  • 特权
  • 设置和约束
  • 指派的角色列表

管理查询:

可以通过 GRANT 查询授予角色特权。要从角色中撤销特权,ClickHouse 提供了 REVOKE 查询。

行策略

行策略是一个过滤器,用于定义某一用户或角色可用的行。行策略包含一个特定表的过滤器,以及应使用此行策略的角色和/或用户列表。

备注

行策略只对具有只读访问权限的用户有意义。如果用户可以修改表或在表之间复制分区,则会破坏行策略的限制。

管理查询:

设置配置文件

设置配置文件是一组 设置。设置配置文件包含设置和约束,以及适用此配置文件的角色和/或用户列表。

管理查询:

配额

配额限制资源使用。请参见 配额

配额包含一组特定时间段的限制,以及应使用此配额的角色和/或用户列表。

管理查询:

启用 SQL 驱动的访问控制和账户管理

  • 设置配置存储目录。

    ClickHouse 将访问实体的配置存储在 access_control_path 服务器配置参数所设置的文件夹中。

  • 针对至少一个用户账户启用 SQL 驱动的访问控制和账户管理。

    默认情况下,所有用户的 SQL 驱动的访问控制和账户管理都是禁用的。您需要在 users.xml 配置文件中配置至少一个用户,并将 access_managementnamed_collection_controlshow_named_collectionsshow_named_collections_secrets 设置的值设置为 1。

定义 SQL 用户和角色

提示

如果您在 ClickHouse Cloud 中工作,请参阅 Cloud 访问管理

本文展示了定义 SQL 用户和角色的基础知识以及如何将这些特权和权限应用到数据库、表、行和列。

启用 SQL 用户模式

  1. users.xml 文件中的 <default> 用户下启用 SQL 用户模式:

    备注

    default 用户是新安装时唯一创建的用户,并且也是默认用于节点间通信的账户。

    在生产环境中,建议在以 SQL 管理用户配置了节点间通信并使用 <secret>、集群凭据和/或节点间 HTTP 和传输协议凭据配置之后禁用此用户,因为 default 账户用于节点间通信。

  2. 重启节点以应用更改。

  3. 启动 ClickHouse 客户端:

定义用户

  1. 创建 SQL 管理员账户:
  2. 授予新用户完全的管理权限:

ALTER 权限

本文旨在帮助您更好地理解如何定义权限,以及在使用 ALTER 语句时权限如何工作。

ALTER 语句分为几个类别,其中一些是层次结构的,有些则不是,必须明确地定义。

示例数据库、表和用户配置

  1. 使用管理员用户创建示例用户:
  1. 创建示例数据库:
  1. 创建示例表:
  1. 创建示例管理员用户以授予/撤销权限:
备注

要授予或撤销权限,管理员用户必须具备 WITH GRANT OPTION 特权。 例如:

GRANTREVOKE 权限,用户必须首先具备这些权限。

授予或撤销权限

ALTER 层次结构:

  1. 授予用户或角色 ALTER 权限

使用 GRANT ALTER on *.* TO my_user 将仅影响顶级 ALTER TABLEALTER VIEW,其他 ALTER 语句必须单独授予或撤销。

例如,授予基本的 ALTER 特权:

结果集的特权:

这将授予上述示例中 ALTER TABLEALTER VIEW 下的所有权限,但不会授予其他某些 ALTER 权限,如 ALTER ROW POLICY(请参见层次结构,您将看到 ALTER ROW POLICY 并不是 ALTER TABLEALTER VIEW 的子项)。这些必须明确授予或撤销。

如果只需要一部分 ALTER 权限,则可以单独授予每个权限,如果该权限有子特权,那么这些子特权也会自动授予。

例如:

授予将在下列情况下设置:

这还授予了以下子特权:

  1. 从用户和角色撤销 ALTER 权限

REVOKE 语句的工作方式与 GRANT 语句类似。

如果某个用户/角色被授予了一个子特权,您可以直接撤销该子特权或撤销它继承的高级权限。

例如,如果用户被授予 ALTER ADD COLUMN

可以单独撤销一个特权:

或者可以从任何上层撤销(撤销所有的 COLUMN 子特权):

额外说明

特权必须由不仅具备 WITH GRANT OPTION 还具备这些特权的用户授予。

  1. 授予管理用户特权,并允许他们管理一组特权 以下是一个示例:

现在用户可以授予或撤销 ALTER COLUMN 和所有子特权。

测试

  1. 添加 SELECT 权限:
  1. 为用户添加列权限:
  1. 使用限制用户登录:
  1. 测试添加列:
  1. 测试删除列:
  1. 测试通过授予权限的 alter 管理员:
  1. 使用 alter 管理员用户登录:
  1. 授予子特权:
  1. 测试授予一项权限,该 alter 管理员用户没有该权限且该权限不是该管理员用户授予的子权限。

总结 ALTER 权限在表和视图的 ALTER 中是层次性的,但在其他 ALTER 语句中则不是。可以在细粒度水平或通过权限组授予权限,也可以以类似方式撤销。授予或撤销特权的用户不仅必须具备 WITH GRANT OPTION 还必须具备特权自身。如果行为用户没有授予权限的特权,则不能撤销自己的权限。