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

在 ClickHouse 中创建用户和角色

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

ClickHouse 访问实体:

您可以通过以下方式配置访问实体:

  • 基于 SQL 的工作流。

    您需要 启用 此功能。

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

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

备注

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

备注

如果您想管理 ClickHouse Cloud Console 用户,请参考此 页面

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

概述

默认情况下,ClickHouse 服务器提供 default 用户账户,该账户不允许使用基于 SQL 的访问控制和账户管理,但拥有所有权限和权限。当未定义用户名时,例如,从客户端登录或在分布式查询中,使用 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 查询。

行策略

行策略是定义用户或角色可用哪些行的过滤器。行策略包含针对特定表的过滤器,以及应使用此行策略的角色和/或用户列表。

备注

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

管理查询:

设置配置文件

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

管理查询:

配额

配额限制资源的使用。参见 Quotas

配额包含一组限额,适用于某些时间段,以及一个角色和/或用户列表,这些角色和/或用户应使用此配额。

管理查询:

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

  • 设置用于配置存储的目录。

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

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

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

定义 SQL 用户和角色

提示

如果您在 ClickHouse Cloud 中工作,请查看 Cloud access management

本文展示了定义 SQL 用户和角色的基本知识,并将这些特权和权限应用于数据库、表、行和列。

启用 SQL 用户模式

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

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

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

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

  2. 启动 ClickHouse 客户端:

定义用户

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

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

可以单独撤销特权:

或者可以从任何上级撤销(撤销所有列子特权):

附加

特权必须由不仅具有 WITH GRANT OPTION 权限的用户授予,还必须拥有特权本身。

  1. 要授予管理员用户权限,同时允许他们管理一组权限 以下是一个示例:

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

测试

  1. 添加 SELECT 权限
  1. 向用户添加添加列权限
  1. 使用受限用户登录
  1. 测试添加一列
  1. 测试删除一列
  1. 测试通过授予权限来测试更改管理员
  1. 使用更改管理员用户登录
  1. 授予子特权
  1. 测试授予权限,该更改管理员用户没有的权限不是管理员用户的授予子权限。

总结 对于 ALTER,权限在表和视图中是分层的,但对于其他 ALTER 语句则不是。权限可以以细粒度设置或按权限分组设置,并且可以以类似方式撤销。授予或撤销的用户必须具有 WITH GRANT OPTION 以在用户上设置权限,包括实际用户本身,并且必须已经拥有该权限。如果执行用户没有自己的授予选项权限,则不能撤销自己的权限。