配置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动态脱敏
- 登录FusionInsight Manager页面,选择“集群 > 服务 > Hive > 配置”,在搜索框中搜索“hive.dynamic.masked.enabled”,修改HiveServer实例的该参数值为“true”。
MRS 3.6.0-LTS之前版本,单击“保存”保存配置。单击“实例”,勾选所有HiveServer实例,选择“更多 > 重启实例”,输入当前用户密码后单击“确定”重启所有HiveServer实例。
MRS 3.6.0-LTS及之后版本,单击“保存”保存配置。等待界面提示“操作成功”,单击“完成”,配置已修改。该参数动态生效,不需要重启HiveServer实例。
- 以客户端安装用户登录安装了Hive客户端节点,执行如下命令:
切换至客户端安装目录:
cd 客户端安装目录加载环境变量:
source bigdata_env
加载组件环境变量:
source Hive/component_env
认证用户,如果集群未启用Kerberos认证(普通模式)请跳过该操作:
kinit Hive业务用户 - 登录Hive客户端,并执行以下命令创建Hive表:
登录Hive客户端:
beeline
创建表:
create table hivetest(a int, b string);向表中插入数据:
insert into hivetest values (1,"test01"), (2,"test02");
- 参考Hive数据脱敏,给hivetest表的字段b配置脱敏策略,验证脱敏是否生效:
select * from hivetest;如下图显示则表示数据脱敏成功:
图1 配置脱敏策略成功
- 验证脱敏策略的传递性:
create table hivetest02 as select * from hivetest;
等待1分钟左右Ranger策略同步至Hive组件后,执行以下命令验证脱敏策略是否传递成功:
select * from hivetest02;如下图显示则表示脱敏策略传递成功:
图2 脱敏策略传递成功
- 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支持年、月、日、时、分、秒、毫秒、微秒、纳秒的脱敏。
- TimeStamp中的时、分、秒、毫秒、微秒、纳秒脱敏后,超过正常范围后也进行反转处理。
- 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。
- 处理数值类型的mask_partial函数介绍