更新时间:2024-11-29 GMT+08:00

ClickHouse用户及权限管理

用户权限模型

ClickHouse用户权限管理实现了对集群中各个ClickHouse实例上用户、角色、权限的统一管理。通过Manager UI的权限管理模块进行创建用户、创建角色、绑定ClickHouse访问权限配置等操作,通过用户绑定角色的方式,实现用户权限控制。

管理资源:Clickhouse权限管理支持的资源如表1所示。

资源权限:ClickHouse支持的资源权限如表2所示。

表1 ClickHouse支持的权限管理对象

资源列表

是否集成

备注

数据库

是(一级)

-

是(二级)

-

视图

是(二级)

与表一致

表2 资源权限列表

资源对象

可选权限

备注

数据库(DATABASE)

创建

CREATE DATABASE/TABLE/VIEW/DICTIONARY权限

数据库(DATABASE)

删除

DROP/TRUNCATE DATABASE/TABLE/VIEW/DICTIONARY权限

数据库(DATABASE)

管理

CREATE/SHOW/SELECT/INSERT/ALTER/DROP/TRUNCATE/OPTIMIZE/SYSTEM/dictGet权限

表/视图/字典(TABLE/VIEW/DICTIONARY)

SELECT权限

表/视图/字典(TABLE/VIEW/DICTIONARY)

INSERT权限

表/视图/字典(TABLE/VIEW/DICTIONARY)

修改

ALTER权限

表/视图/字典(TABLE/VIEW/DICTIONARY)

删除

DROP/TRUNCATE权限

前提条件

  • ClickHouse服务运行正常,Zookeeper服务运行正常。
  • 用户在集群中创建数据库或者表时需使用ON CLUSTER语句,保证各个ClickHouse节点上数据库、表的元信息相同。

ClickHouse赋权成功后,权限生效时间大约为1分钟。

添加ClickHouse角色

  1. 登录Manager,选择“系统 > 权限 > 角色”,在“角色”界面单击“添加角色”按钮,进入添加角色页面。

  2. 在添加角色界面输入“角色名称”,在配置资源权限处单击集群名称,进入服务列表页面,单击ClickHouse服务,进入ClickHouse权限资源页面。

    根据业务需求确定是否要创建具有ClickHouse管理员权限的角色。

    • ClickHouse管理员权限为:除去对user/role的创建、删除和修改之外的所有数据库操作权限。
    • 对于用户和角色的管理,仅有ClickHouse的内置用户clickhouse具有权限。
    • 是,执行3
    • 否,执行4

  3. 勾选“ClickHouse管理员权限”,单击“确定”操作结束。
  4. 单击“ClickHouse Scope”,进入ClickHouse数据库资源列表。勾选“创建”权限,则该角色将拥有该数据库下的创建(CREATE)权限。

    根据业务需求确定是否赋权。

    • 是,单击“确定”操作结束。
    • 否,执行5

  5. 单击“资源名称 > 待操作的数据库资源名称”,进入表、视图页面,根据业务需要,勾选“读”(SELECT权限)或者“写”(INSERT权限)权限,单击“确定”。

添加用户并将ClickHouse对应角色绑定到该用户

  1. 登录Manager,选择“系统 > 权限 > 用户”,单击“添加用户”,进入添加用户页面。
  2. “用户类型”选择“人机”,在“密码”和“确认新密码”参数设置该用户对应的密码。

    • 用户名:添加的用户名不能包含字符“-”,否则会导致认证失败。
    • 密码:设置的密码不能携带“$”、“.”、“#”特殊字符,否则会导致认证失败。

  3. 在“角色”处单击“添加”,在弹框中选择具有ClickHouse权限的角色,单击“确定”添加到角色,单击“确定”完成操作。

  4. 登录ClickHouse客户端安装节点,使用新添加的用户及设置的密码连接ClickHouse服务。

    1. 执行以下命令,切换到客户端安装目录。

      cd /opt/客户端安装目录

    2. 执行以下命令配置环境变量。

      source bigdata_env

    3. 执行以下命令连接ClickHouse服务。命令中用户需要具有创建ClickHouse表的权限,具体请参见添加ClickHouse角色,为用户绑定对应角色。

      当前集群已启用Kerberos认证:

      clickhouse client --host ClickHouse的实例IP --user 用户名 --password --port 9440 --secure

      输入用户密码

      当前集群未启用Kerberos认证:

      clickhouse client --host ClickHouse的实例IP --user 用户名 --multiline --port ClickHouse的端口号

      • 普通模式的用户为默认的default用户,或使用ClickHouse社区开源能力添加管理用户,或使用Manager页面添加具有ClickHouse权限的用户。
      • 普通模式使用default用户时执行命令为:

        clickhouse client --host ClickHouse的实例IP --user default --password --port ClickHouse的端口号

        输入用户密码

      • ClickHouse的实例IP地址可登录集群FusionInsight Manager,然后选择“集群 > 服务 > ClickHouse > 实例”,获取ClickHouseServer实例对应的业务IP地址。

异常场景下登录客户端操作赋权

ClickHouse集群默认每个节点上的表元信息是相同的,因此在Manager的权限管理页面上默认采集的是任意ClickHouse节点的表信息,如果有个别节点上创建DATABASE/TABLE时未使用ON CLUSTER语句,则权限操作可能无法展示该资源,不保证可以对其赋权。对于这样单个ClickHouse节点中的本地表,如果需要赋权,则可以通过后台客户端进行操作。

以下操作,需要提前获取到需要赋权的角色、数据库或表名称、对应的ClickHouseServer实例所在的节点IP。

  • ClickHouseServer的实例IP地址可登录集群FusionInsight Manager,然后选择“集群 > 服务 > ClickHouse > 实例”,获取ClickHouseServer实例对应的业务IP地址。
  • 系统域名:默认为hadoop.com。可登录集群FusionInsight Manager,单击“系统 > 权限 > 域和互信”,“本端域”参数值即为系统域名。在执行命令时改为小写。
  1. 以root用户登录ClickHouseServer实例所在的节点。
  2. 执行以下命令获取“clickhouse.keytab”文件路径。

    ls ${BIGDATA_HOME}/FusionInsight_ClickHouse_*/install/FusionInsight-ClickHouse-*/clickhouse/keytab/clickhouse.keytab

  3. 以客户端安装用户,登录安装客户端的节点。
  4. 执行以下命令,切换到客户端安装目录。

    cd /opt/client

  5. 执行以下命令配置环境变量。

    source bigdata_env

    export CLICKHOUSE_SECURITY_ENABLED=true

  6. 执行如下命令使用客户端命令连接ClickHouseServer实例。

    如果当前集群已启用Kerberos认证,执行以下命令:

    clickhouse client --host ClickHouseServer实例所在节点IP --user clickhouse/hadoop.<系统域名> --password 2中获取的clickhouse.keytab路径 --port ClickHouse的端口号 --secure

    如果当前集群未启用Kerberos认证,执行以下命令:

    clickhouse client --host ClickHouseServer实例所在节点IP --user clickhouse --port ClickHouse的端口号

  7. 对某DATABASE进行赋权操作,执行如下命令。

    授权操作语法,其中DATABASE为要操作的数据库名称,role为需要操作的角色。

    GRANT [ON CLUSTER cluster_name] privilege ON {DATABASE|TABLE} TO {user | role]

    例如,给用户testuser授予数据库t2的CREATE权限:

    GRANT CREATE ON m2 to testuser;

  8. 对TABLE/VIEW进行赋权操作,执行如下命令,其中TABLE为要操作的表或视图名称,user为需要操作的角色。

    对某数据库下的表赋予查询权限:

    GRANT SELECT ON TABLE TO user;

    对某数据库下的表赋予写入权限:

    GRANT INSERT ON TABLE TO user;

  9. 执行如下命令,退出客户端。

    quit;