在 ClickHouse 中创建用户和角色
ClickHouse 支持基于 RBAC 的访问控制管理。
ClickHouse 访问实体:
您可以通过以下方式配置访问实体:
我们推荐使用基于 SQL 的工作流。两种配置方法可以同时工作,因此,如果您使用服务器配置文件来管理账户和访问权限,您可以顺利切换到基于 SQL 的工作流。
您不能同时通过这两种配置方法管理同一个访问实体。
如果您想管理 ClickHouse Cloud Console 用户,请参考此 页面。
要查看所有用户、角色、配置文件等及其所有权限,请使用 SHOW ACCESS
语句。
概述
默认情况下,ClickHouse 服务器提供 default
用户账户,该账户不允许使用基于 SQL 的访问控制和账户管理,但拥有所有权限和权限。当未定义用户名时,例如,从客户端登录或在分布式查询中,使用 default
用户账户。在分布式查询处理中,如果服务器或集群的配置未指定 用户名和密码 属性,则使用默认用户账户。
如果您刚开始使用 ClickHouse,可以考虑以下场景:
- 启用 SQL 驱动的访问控制和账户管理,用于
default
用户。 - 登录到
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
配额
配额限制资源的使用。参见 Quotas。
配额包含一组限额,适用于某些时间段,以及一个角色和/或用户列表,这些角色和/或用户应使用此配额。
管理查询:
启用 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 中工作,请查看 Cloud access management。
本文展示了定义 SQL 用户和角色的基本知识,并将这些特权和权限应用于数据库、表、行和列。
启用 SQL 用户模式
- 在
<default>
用户下的users.xml
文件中启用 SQL 用户模式:
default
用户是唯一一个在新安装时创建的用户,并且默认用于节点间通信的账户。
在生产环境中,建议在使用 SQL 管理用户配置了节点间通信后禁用此用户,并同时配置了 <secret>
、集群凭据和/或节点间 HTTP 和传输协议凭据,因为 default
账户用于节点间通信。
-
重启节点以应用更改。
-
启动 ClickHouse 客户端:
定义用户
- 创建一个 SQL 管理员账户:
- 授予新用户完全的管理权限
ALTER 权限
本文旨在帮助您更好地理解如何定义权限,以及在使用 ALTER
语句时特权用户如何工作。
ALTER
语句分为几类,其中一些是分层的,而另一些不是,必须显式定义。
示例数据库、表和用户配置
- 使用管理员用户创建一个示例用户
- 创建示例数据库
- 创建示例表
- 创建示例管理员用户以授予/撤销权限
要授予或撤销权限,管理员用户必须具有 WITH GRANT OPTION
特权。
例如:
要 GRANT
或 REVOKE
权限,用户必须首先拥有这些权限。
授予或撤销特权
ALTER
层次结构:
- 授予用户或角色
ALTER
权限
使用 GRANT ALTER on *.* TO my_user
只会影响顶层的 ALTER TABLE
和 ALTER VIEW
,其他 ALTER
语句必须单独授予或撤销。
例如,授予基本的 ALTER
权限:
生成的权限集:
这将授予上述示例中 ALTER TABLE
和 ALTER VIEW
下的所有权限,但是,它不会授予其他某些 ALTER
权限,例如 ALTER ROW POLICY
(请参阅层次结构,您会看到 ALTER ROW POLICY
不是 ALTER TABLE
或 ALTER VIEW
的子项)。这些必须显式地授予或撤销。
如果只需要 ALTER
权限的子集,则可分别授予每个权限,如果该权限有子特权,则这些子特权也会自动授予。
例如:
权限将被设置为:
这还会提供以下子特权:
- 从用户和角色撤销
ALTER
权限
REVOKE
语句的工作方式与 GRANT
语句类似。
如果用户/角色被授予了子特权,则可以直接撤销该子特权,或者撤销其继承的更高层特权。
例如,如果用户被授予 ALTER ADD COLUMN
可以单独撤销特权:
或者可以从任何上级撤销(撤销所有列子特权):
附加
特权必须由不仅具有 WITH GRANT OPTION
权限的用户授予,还必须拥有特权本身。
- 要授予管理员用户权限,同时允许他们管理一组权限 以下是一个示例:
现在,该用户可以授予或撤销 ALTER COLUMN
和所有子特权。
测试
- 添加
SELECT
权限
- 向用户添加添加列权限
- 使用受限用户登录
- 测试添加一列
- 测试删除一列
- 测试通过授予权限来测试更改管理员
- 使用更改管理员用户登录
- 授予子特权
- 测试授予权限,该更改管理员用户没有的权限不是管理员用户的授予子权限。
总结
对于 ALTER
,权限在表和视图中是分层的,但对于其他 ALTER
语句则不是。权限可以以细粒度设置或按权限分组设置,并且可以以类似方式撤销。授予或撤销的用户必须具有 WITH GRANT OPTION
以在用户上设置权限,包括实际用户本身,并且必须已经拥有该权限。如果执行用户没有自己的授予选项权限,则不能撤销自己的权限。