
# Hive用户权限说明
Hive是建立在Hadoop上的数据仓库框架，提供类似SQL的HQL操作结构化数据。
MRS提供用户、用户组和角色，集群中的各类权限需要先授予角色，然后将用户或者用户组与角色绑定。用户只有绑定角色或者加入绑定角色的用户组，才能获得权限。Hive授权相关信息请参考：<https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization>。
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
- Hive在安全模式下需要进行权限管理，在普通模式下无需进行权限管理。
- MRS 3.x及后续版本支持Ranger，如果当前组件使用了Ranger进行权限控制，须基于Ranger配置相关策略进行权限管理，具体操作可参考[添加Hive的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_1858.html)。
 
#### Hive权限模型
使用Hive组件，必须对Hive数据库和表（含外表和视图）拥有相应的权限。在MRS中，完整的Hive权限模型由Hive元数据权限与HDFS文件权限组成。使用数据库或表时所需要的各种权限都是Hive权限模型中的一种。
- Hive元数据权限。 与传统关系型数据库类似，MRS的Hive数据库包含"建表"和"查询"权限，Hive表和列包含"查询"、"插入"和"删除"权限。Hive中还包含拥有者权限"OWNERSHIP"和"Hive管理员权限"。
  

- Hive数据文件权限，即HDFS文件权限。 Hive的数据库、表对应的文件保存在HDFS中。默认创建的数据库或表保存在HDFS目录"/user/hive/warehouse"。系统自动以数据库名称和数据库中表的名称创建子目录。访问数据库或者表，需要在HDFS中拥有对应文件的权限，包含"读"、"写"和"执行"权限。
  
用户对Hive数据库或表执行不同操作时，需要关联不同的元数据权限与HDFS文件权限。例如，对Hive数据表执行查询操作，需要关联元数据权限"查询"，以及HDFS文件权限"读"和"写"。
使用Manager界面图形化的角色管理功能来管理Hive数据库和表的权限，只需要设置元数据权限，系统会自动关联HDFS文件权限，减少界面操作，提高效率。
#### Hive用户对象
MRS提供了用户和角色来使用Hive，比如创建表、在表中插入数据或者查询表。Hive中定义了"USER"类，对应用户实例；定义了"GROUP"类，对应角色实例。
使用Manager设置Hive用户对象的权限，只支持在角色中设置，用户或用户组需要绑定角色才能获得权限。支持授予Hive管理员权限、访问数据库、表和列的权限。
#### Hive使用场景及对应权限
用户使用Hive并创建数据库需要加入hive组，不需要角色授权。用户在Hive和HDFS中对自己创建的数据库或表拥有完整权限，可直接创建表、查询数据、删除数据、插入数据、更新数据以及授权他人访问表与对应HDFS目录与文件。
如果用户访问别人创建的表或数据库，需要授予权限。所以根据Hive使用场景的不同，用户需要的权限可能也不相同。
表1Hive使用场景 
| 主要场景          | 用户需要的权限                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|
| 使用Hive表、列或数据库 | 使用其他用户创建的Hive表、列或数据库，不同的场景需要不同的Hive权限，例如： - 创建表，需要"建表"。  - 查询数据，需要"查询"。  - 插入数据，需要"插入"。  - 删除数据，需要"删除"。   |
| 关联使用其他组件      | 部分场景除了Hive权限，还可能需要组件的权限，例如： - 执行部分HQL命令，例如**insert** **，** **count** ，**distinct** ，**group by** ，**order by** ，**sort by** 或**join**等语句时，需要设置YARN权限。建议为每个Hive用户的角色添加此权限。  - 使用Hive over HBase，例如在Hive中查询HBase表数据，需要设置HBase权限。                                                                                |
   
在一些特殊Hive使用场景下，需要单独设置其他权限。
表2Hive授权注意事项 
| 可能场景                                                                                 | 用户需要的权限                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|
| 创建Hive数据库、表、外表，或者为已经创建的Hive表或外表添加分区，且Hive用户指定数据文件保存在"/user/hive/warehouse"以外的HDFS目录。 | 需要此目录已经存在，Hive用户是目录的属主，且用户对目录拥有"读"、"写"和"执行"权限。同时用户对此目录上层的每一级目录都拥有"读"和"写"权限。然后管理员通过角色管理功能授予角色使用Hive的权限，会自动关联HDFS权限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| Hive用户使用**load**将指定目录下所有文件或者指定文件，导入数据到Hive表。                                         | - 数据源为Linux本地磁盘，指定目录时需要此目录已经存在，系统用户"omm"对此目录以及此目录上层的每一级目录拥有"r"和"x"的权限。指定文件时需要此文件已经存在，"omm"对此文件拥有"r"的权限，同时对此文件上层的每一级目录拥有"r"和"x"的权限。  - 数据源为HDFS，指定目录时需要此目录已经存在，Hive用户是目录属主，且用户对此目录及其子目录拥有"读"、"写"和"执行"权限，并且其上层的每一级目录拥有"读"和"写"权限。指定文件时需要此文件已经存在，Hive用户是文件属主，且用户对文件拥有"读"、"写"和"执行"权限，同时对此文件上层的每一级目录拥有"读"和"执行"权限。   说明： 使用**load**从Linux本地磁盘导入数据时，文件需上传到执行命令的HiveServer并修改权限。建议使用客户端执行命令，可查看客户端连接的HiveServer。例如，Hive客户端显示"0: jdbc:hive2://10.172.0.43:21066/\>"，表示当前连接的HiveServer节点IP地址为"10.172.0.43"。 |
| 创建函数、删除函数或者修改任意数据库。                                                                  | 需要授予"Hive管理员权限"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 操作Hive中所有的数据库和表。                                                                     | 需加入到supergroup用户组，并且授予"Hive管理员权限"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 集群未启用Kerberos认证（普通模式）开启Ranger鉴权                                                      | 集群未启用Kerberos认证（普通模式）默认关闭Ranger鉴权，如果启用Ranger鉴权，新增以下限制： - 白名单限制：未配置的参数将不允许在客户端设置。白名单开关由Hive配置页面的"hive.security.whitelist.switch"参数控制，设置为"OFF"即可支持在客户端设置未配置的参数，存在安全风险，请谨慎操作。  - 不允执行reflect、reflect2、java_method和in_file函数。如果业务需要，可在HiveServer自定义参数中新增"hive.server2.builtin.udf.blacklist"参数项，值为"mpty_blacklist"来允许Hive执行这些函数，存在安全风险，请谨慎操作。                                                                                                                                                                                                                                                                       |
   
