
# ClickHouse用户及权限管理
#### 用户权限模型
ClickHouse用户权限管理实现了对集群中各个ClickHouse实例上用户、角色、权限的统一管理。通过Manager UI的权限管理模块进行创建用户、创建角色、绑定ClickHouse访问权限配置等操作，通过用户绑定角色的方式，实现用户权限控制。
管理资源：ClickHouse权限管理支持的资源如[表1]所示。
资源权限：ClickHouse支持的资源权限如[表2]所示。
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
本章节不支持MRS 3.1.0普通模式（未开启Kerberos认证）集群。
 表1ClickHouse支持的权限管理对象 
| 资源列表 | 是否集成  | 备注   |
|:---|:---|:---|
| 数据库  | 是（一级） | -    |
| 表    | 是（二级） | -    |
| 视图   | 是（二级） | 与表一致 |
   
 表2资源权限列表 
| 资源对象             | 可选权限          | 备注                                      |
|:---|:---|:---|
| 数据库（DATABASE）    | CREATE        | CREATE DATABASE/TABLE/VIEW/DICTIONARY权限 |
| 表/视图（TABLE/VIEW） | SELECT/INSERT | -                                       |
   
#### 前提条件
- ClickHouse服务运行正常，ZooKeeper服务运行正常。
- 用户在集群中创建数据库或者表时需使用ON CLUSTER语句，保证各个ClickHouse节点上数据库、表的元信息相同。
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
ClickHouse赋权成功后，权限生效时间大约为1分钟。
 #### 添加ClickHouse角色
1. 登录Manager，选择"系统 \> 权限 \> 角色"，在"角色"界面单击"添加角色"按钮，进入添加角色页面。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001139705079.png)
   
   
2. 在添加角色界面输入"角色名称"，在配置资源权限处单击集群名称，进入服务列表页面，单击ClickHouse服务，进入ClickHouse权限资源页面。 
   根据业务需求确定是否要创建具有ClickHouse管理员权限的角色。
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - ClickHouse管理员权限为：除去对user/role的创建、删除和修改之外的所有数据库操作权限。
   
   - 对于用户和角色的管理，仅有ClickHouse的内置用户**clickhouse**具有权限。
    
   - 是，执行[3]。
   
   - 否，执行[4]。
   
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001092803278.png)
   
   
3. 勾选"ClickHouse管理员权限"，单击"确定"操作结束。
4. 单击"ClickHouse Scope"，进入ClickHouse数据库资源列表。勾选"创建"权限，则该角色将拥有该数据库下的创建（CREATE）权限。
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001139622263.png)
   根据业务需求确定是否赋权。
   - 是，单击"确定"操作结束。
   
   - 否，执行[5]。
   
   
   
   
5. 单击"资源名称 \> *待操作的数据库资源名称* "，进入表、视图页面，根据业务需要，勾选"读"（SELECT权限）或者"写"（INSERT权限）权限，单击"确定"。
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001092962950.png)
   
   
 
#### 添加用户并将ClickHouse对应角色绑定到该用户
1. 登录Manager，选择"系统 \> 权限 \> 用户"，单击"添加用户"，进入添加用户页面。
2. "用户类型"选择"人机"，在"密码"和"确认密码"参数设置该用户对应的密码。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 用户名：添加的用户名不能包含字符"-"，否则会导致认证失败。
   
   - 密码：设置的密码不能携带"$"、"."、"#"特殊字符，否则会导致认证失败。
    
   
   
3. 在"角色"处单击"添加"，在弹框中选择具有ClickHouse权限的角色，单击"确定"添加到角色，单击"确定"完成操作。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001184520669.png)
   
   
4. 登录ClickHouse客户端安装节点，使用新添加的用户及设置的密码连接ClickHouse服务。 
   - 执行以下命令，切换到客户端安装目录。 **cd /opt/** *客户端安装目录*
     
   
   - 执行以下命令配置环境变量。 **source bigdata_env**
     
   
   - 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户，当前用户需要具有创建ClickHouse表的权限，具体请参见[添加ClickHouse角色]，为用户绑定对应角色。如果当前集群未启用Kerberos认证，则无需执行本步骤。
     如果是MRS 3.1.0版本集群，则需要先执行：**export CLICKHOUSE_SECURITY_ENABLED=true**
     **kinit** ***[1]*** *中添加的用户*
     
   
   - 使用新添加的用户登录验证。 **当前集群未启用Kerberos认证：**
     **clickhouse client --host** *ClickHouse的实例IP* **--multiline** **--port** *ClickHouse的端口号* **--secure**
     **当前集群已启用Kerberos认证：**
     **clickhouse client --host** *ClickHouse的实例IP* **--user** *用户名* **--password** **--port** 9440 **--secure**
     *输入用户密码*
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
     普通模式的用户为默认的default用户，或者使用 ClickHouse社区开源能力添加管理用户。不能使用在FusionInsight Manager页面创建的用户。
     
   
   
   
   
 
#### 异常场景下登录客户端操作赋权
ClickHouse集群默认每个节点上的表元信息是相同的，因此在Manager的权限管理页面上默认采集的是任意ClickHouse节点的表信息，如果有个别节点上创建DATABASE/TABLE时未使用ON CLUSTER语句，则权限操作可能无法展示该资源，不保证可以对其赋权。对于这样单个ClickHouse节点中的本地表，如果需要赋权，则可以通过后台客户端进行操作。
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
以下操作，需要提前获取到需要赋权的角色、数据库或表名称、对应的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**
   如果是MRS 3.1.0版本集群并且集群已启用Kerberos认证，则还需要执行：
   **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** *t2* **to** *testuser* **;**
   
   
8. 对TABLE/VIEW进行赋权操作，执行如下命令，其中*TABLE* 为要操作的表或视图名称，*user* 为需要操作的角色。
   
   对某数据库下的表赋予查询权限：
   **GRANT SELECT ON** *TABLE* **TO** *user* ***;***
   对某数据库下的表赋予写入权限：
   **GRANT INSERT ON** *TABLE* **TO** *user；*
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   更多ClickHouse授权操作及详细权限说明可参考<https://clickhouse.com/docs/zh/sql-reference/statements/grant/>。
   
   
9. 执行如下命令，退出客户端。 
   **quit;**
   
   
 
