更新时间:2025-12-15 GMT+08:00
分享

配置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数据脱敏,给hivetest表的字段b配置脱敏策略,验证脱敏是否生效:

    select  * from hivetest;

    如下图显示则表示数据脱敏成功:

    图1 配置脱敏策略成功

  5. 验证脱敏策略的传递性:

    create table hivetest02 as select * from hivetest;

    等待1分钟左右Ranger策略同步至Hive组件后,执行以下命令验证脱敏策略是否传递成功:

    select * from hivetest02;

    如下图显示则表示脱敏策略传递成功:

    图2 脱敏策略传递成功

  6. 5新建的表数据脱敏成功则表示动态脱敏配置已生效,可使用管理员用户rangeradmin登录Ranger管理页面,在首页中单击“HADOOP SQL”区域的“Hive”,单击“Masking”页签,可以查看到自动生成的对应表的脱敏策略。例如,表hivetest02的脱敏策略“policy_synced_from_table_default_hivetest02_b”:

    图3 自动生成的表的脱敏策略

特性说明(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

    “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]区间内的数字。

      对于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]区间内的数字。

      • 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脱敏策略

      在“Mask Conditions”区域的“Select Masking Option”列选择“Custom”配置mask_partial脱敏函数时,第一个入参不需要指定列名,直接从mask_partial函数介绍中的第二个入参开始填写,即mask_digital。

相关文档