
# 配置Hive动态脱敏
#### 使用场景
Hive动态脱敏功能开启后，配置脱敏列的数据可以参与计算，计算结果输出时不可见，在集群内脱敏策略会根据血缘关系自动传递，更大地发挥数据的价值同时保障数据的隐私性。
#### 使用约束
- 本章节仅适用于MRS 3.5.0及之后版本。
- 不支持Hudi表的脱敏。
- 不支持涉及直接读写HDFS的操作的脱敏。
- 不支持复杂数据类型array、map、struct的脱敏。
- 自定义脱敏策略仅支持字符串类型字段，且脱敏后的值会强制设置为"\*\*\*"。
- 脱敏策略传递时，若目标表已有脱敏策略且与源表有冲突，则目标表脱敏策略强制重置为"Custom:"\*\*\*""。
- MRS 3.5.0版本，简单的未提交Yarn任务的查询操作，脱敏结果与Ranger上配置的脱敏策略一致，Customer类型脱敏策略输出结果为"\*\*\*"。简单的查询操作例如：**select \* from** *表名;、* **select \* from** *表名* **limit** *xxx*;。
- 提交Yarn任务的复杂查询（MRS 3.5.0版本），字符串字段类型脱敏结果与Ranger上配置的脱敏策略一致，其他类型字段脱敏都按"Nullify"脱敏策略处理。
 
#### 配置Hive动态脱敏
1. 登录FusionInsight Manager页面，选择"集群 \> 服务 \> Hive \> 配置"，在搜索框中搜索"hive.dynamic.masked.enabled"，修改HiveServer实例的该参数值为"true"。 
   MRS 3.6.0-LTS之前版本，单击"保存"保存配置。单击"实例"，勾选所有HiveServer实例，选择"更多 \> 重启实例"，输入当前用户密码后单击"确定"重启所有HiveServer实例。
   MRS 3.6.0-LTS及之后版本，单击"保存"保存配置。等待界面提示"操作成功"，单击"完成"，配置已修改。该参数动态生效，不需要重启HiveServer实例。
   
   
2. 以客户端安装用户登录安装了Hive客户端节点，执行如下命令： 
   切换至客户端安装目录：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   加载组件环境变量：
   ```
   source Hive/component_env
   ```
   认证用户，如果集群未启用Kerberos认证（普通模式）请跳过该操作：
   ```
   kinit Hive业务用户
   ```
   
   
3. 登录Hive客户端，并执行以下命令创建Hive表： 
   登录Hive客户端：
   ```
   beeline
   ```
   创建表：
   ```
   create table hivetest(a int, b string);
   ```
   向表中插入数据：
   ```
   insert into hivetest values (1,"test01"), (2,"test02");
   ```
   
   
4. 参考[配置Hive数据脱敏](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1858.html#mrs_01_1858__section13736165383316)，给**hivetest** 表的字段**b** 配置脱敏策略，验证脱敏是否生效：
   
   ```
   select  * from hivetest;
   ```
   如下图显示则表示数据脱敏成功：
   图1配置脱敏策略成功   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002060706704.png)
   
   
5. 验证脱敏策略的传递性：
   
   ```
   create table hivetest02 as select * from hivetest;
   ```
   等待1分钟左右Ranger策略同步至Hive组件后，执行以下命令验证脱敏策略是否传递成功：
   ```
   select * from hivetest02;
   ```
   如下图显示则表示脱敏策略传递成功：
   图2脱敏策略传递成功   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002060865036.png)
   
   
6. [5]新建的表数据脱敏成功则表示动态脱敏配置已生效，可使用管理员用户**rangeradmin** 登录Ranger管理页面，在首页中单击"HADOOP SQL"区域的"Hive"，单击"Masking"页签，可以查看到自动生成的对应表的脱敏策略。例如，表**hivetest02** 的脱敏策略"policy_synced_from_table_default_hivetest02_b"：
   
   图3自动生成的表的脱敏策略   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002096905305.png "点击放大")
   
   
 
#### 特性说明（MRS 3.6.0-LTS及之后版本）
- Hive动态脱敏后返回字段类型与输出列的schema类型一致，无法保持一致的使用null表示脱敏后的结果。
- 支持配置不脱敏UDF名单和强制hash脱敏UDF名单。
  登录FusionInsight Manager界面，选择"集群 \> 服务"，在服务列表单击"Hive"进入概览页面，单击"配置"，在搜索框中搜索对应参数进行配置。
  表1配置不脱敏UDF名单和强制hash脱敏UDF名单 
  | 参数                         | 参数描述                                                                                                                                                                                     | 默认值                                                        |
  |:---|:---|:---|
  | hive.udf.hash.dynamic.mask | 开启动态脱敏后，使用"Partial mask: show last 4"、"Partial mask: show first 4"、"Custom"脱敏策略脱敏时，需要强制使用hash脱敏处理的函数名单。如果有多个函数需要强制使用hash脱敏处理，则以英文逗号隔开。对于Custom脱敏策略，如果使用特定的mask_partial自定义函数进行脱敏，则不参与此规则。 | substr,substring,concat,concat_ws,lpad,repeat,rpad,reverse |
  | hive.udf.skip.dynamic.mask | 用于设置开启Hive动态脱敏后不需要脱敏处理的函数名单。如果有多个函数不需要脱敏处理，则以英文逗号隔开。                                                                                                                                     | count                                                      |
     
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  "hive.udf.skip.dynamic.mask"参数的优先级大于"hive.udf.hash.dynamic.mask"参数，如果一个函数名同时配置在这两个参数中，会按照"hive.udf.skip.dynamic.mask"参数的逻辑处理，不进行脱敏处理。
  
- Custom脱敏策略支持配置mask_partial函数。
  - 处理数值类型的**mask_partial** 函数介绍
    **mask_partial(** column_name, mask_digital, mask_from\[, mask_to\]**)**
    针对数值类型数据（int、decimal、float、bigint、tinyint、smallint、double），将第mask_from到mask_to位的数字部分脱敏成mask_digital对应的数字，返回值的类型与入参column_name数据类型相同。
    表2处理数值类型的**mask_partial** 参数说明 
    | 参数           | 参数描述                |
    |:---|:---|
    | mask_to      | 允许缺省，缺省时即脱敏到数据结束位置。 |
    | mask_digital | 只能取\[1,9\]区间内的数字。   |
       
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    对于decimal、float、double类型数据，小数点参与计数，但不参与脱敏。例如，列内容为3.1415926，则**mask_partial('2',1,3）**的返回值为2.2415926。
    
  
  - 处理字符类型的**mask_partial** 函数介绍
    **mask_partial(** column_name , mask_char, mask_from\[, mask_to\]**)**
    针对字符类型数据（char、varchar、string），对照指定的输入输出格式，将第mask_from到mask_to位的数字部分脱敏成mask_char指定的字符，返回值类型与入参column_name数据类型相同。
    表3处理字符类型的**mask_partial** 参数说明 
    | 参数        | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
    |:---|:---|
    | mask_char | 脱敏字符，仅允许长度为1的任意字符。支持的字符范围： - 大写字母：A\~Z  - 小写字母：a\~z  - 阿拉伯数字：0、1、2、3、4、5、6、7、8、9  - 标点符号：句号（.）、逗号（,）、问号（?）、感叹号（!）、冒号（:）、分号（;）、引号（"）、括号（**(** 或**)** 、**\[** 或**\]** 、**{** 或 **}**）、连字符（-）  - 特殊符号：@ 符号（@）、井号（#）、美元符号（$）、百分号（%）、和号（\&）、星号（\*）、加号 （+）、等号（=）、波浪号（\~）、下划线（_）、竖线（\|）   |
    | mask_from | 脱敏范围的起始位置，要求大于0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
    | mask_to   | 脱敏范围的结束位置，允许缺省。缺省时，即脱敏到原始数据结束位置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
       
    
  
  - 处理时间类型的**mask_partial** 函数介绍
    **mask_partial(** column_name, mask_digital, mask_from\[, mask_to\]**)**
    针对时间类型数据（Date、TimeStamp），将第mask_from到mask_to位的数字部分脱敏成mask_digital对应的数字，返回值类型与入参column_name数据类型相同。
    表4处理时间类型的**mask_partial** 参数说明 
    | 参数           | 参数描述                |
    |:---|:---|
    | mask_to      | 允许缺省，缺省时即脱敏到数据结束位置。 |
    | mask_digital | 只能取\[1,9\]区间内的数字。   |
       
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    - Date只支持年、月、日的脱敏。
    
    - TimeStamp支持年、月、日、时、分、秒、毫秒、微秒、纳秒的脱敏。
      - Date、TimeStamp中的"-"、"/"、空格、":"参与计数，不脱敏。
      
      - Date、TimeStamp中，月、日的值脱敏后超过正常范围后将进行反转处理，例如： 月的值为02，脱敏后为33，最终值为33%12=9。
        日的值为10，脱敏后为44，最终值为44% (脱敏后的年对应的脱敏后的月的天数) , 假设脱敏后的年为2024，脱敏后的月为9（2024年9月有30天）， 最终值为14。
        
       
    
    - TimeStamp中的时、分、秒、毫秒、微秒、纳秒脱敏后，超过正常范围后也进行反转处理。
      - 时的值为20，脱敏后为66，最终值为66%24=18。
      
      - 分的值为30，脱敏后为66，最终值为66%60=6。
      
      - 秒的值为50，脱敏后为66，最终值为66%60=6。
      
      - 毫秒、微秒、纳秒不涉及超出正常值范围场景。例如： date类型脱敏：值为1920-01-03，使用**mask_partial('2',5,8)**脱敏后，结果为1920-10-03。
        TimeStamp类型脱敏：值为'2023-12-05 12:34:56.789' ，使用**mask_partial('2',5,8)**脱敏后，结果为'2023-10-05 12:34:56.789'。
        
       
      
  
  - mask_partial使用约束与限制说明
    - mask_partial的入参中不支持嵌套UDF。
    
    - mask_partial遇到数值、字符、时间之外的不支持的数据类型时，统一返回null。
    
    - mask_from从1开始计数，即mask_from的值要求是大于0的整数，小于1时，默认按照1处理。
    
    - mask_to可以不填，不填时，默认为对应字符的结束位置，mask_to可以为负数，-1表示字符的结束位置。
    
    - mask_to对应字符串的位置不能在mask_from之前，遇到该情况时，统一返回null。
    
    - mask_partial处理类型为数值类型，且mask_digital不属于\[1,9\]区间内的数字时，UDF函数返回null。
    
    - mask_partial处理类型为字符类型，且mask_char不支持该字符类型时，UDF函数返回null。
    
    - 遇到mask_partial编写错误、入参不支持、入参有误等场景， 引擎直接报异常错误。
     
  
  - mask_partial使用介绍 使用Ranger管理员用户**rangeradmin** 登录Ranger管理页面，在首页中单击"HADOOP SQL"区域的"Hive"，单击"Masking"页签，单击"Add New Policy"新增脱敏策略，在"Policy Details"区域配置数据脱敏信息，在"Mask Conditions"区域的"Select Masking Option"列选择"Custom"，并在自定义输入框中填写"mask_partial(*mask_digital* , *mask_from* \[, *mask_to*\])"，其中mask_digital需要使用单引号括起来，例如'9'、'\*'。
    图4配置mask_partial脱敏策略   
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002202606789.png "点击放大")
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    在"Mask Conditions"区域的"Select Masking Option"列选择"Custom"配置**mask_partial**脱敏函数时，第一个入参不需要指定列名，直接从mask_partial函数介绍中的第二个入参开始填写，即mask_digital。
    
   
 
