内容纲要
概要描述
本文主要介绍,如何在defensor中添加自定义udf作为脱敏算法函数,并实现脱敏功能。
适用范围:defensor-3.2.0之前的版本
详细说明
当前在inceptor数据库中,存在一张emp员工表,其中sal是敏感字段,我们需要对该字段进行脱敏
1. java代码编写打包
UDF支持使用java代码实现,示例以及要求如下:
package io.udf;
import java.util.Random;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
//该udf的描述,创建完成后可使用命令desc function extended rand来查看此信息
@Description(name = "rand",
value = "_FUNC_([seed]) - Returns a pseudorandom number between 0 and 1")
public class RandomNumber extends UDF {
private Random random;
private final DoubleWritable result = new DoubleWritable();
public UDFRand() {
}
//udf需要实现此evaluate()接口,调用时从此接口调用
public DoubleWritable evaluate() {
if (random == null) {
random = new Random();
}
result.set(random.nextDouble());
return result;
}
//一个udf可以实现多个evaluate()接口,以支持不同类型的参数
public DoubleWritable evaluate(LongWritable seed) {
if (random == null) {
random = new Random(seed.get());
}
result.set(random.nextDouble());
return result;
}
}
完成后将代码打包
mvn clean package -DskipTests
2. 将jar包做udf镜像持久化
**4.X版本:**
1) udf.jar放到/usr/lib/hive/lib中(每个executor节点);
2) add jar /usr/lib/hive/lib/udf.jar;
3) create permanent function func_name as 'package.classname';
**5.X版本以上**
1) 把udf.jar放到/usr/lib/inceptor/lib目录下,push到镜像仓库;
2) 重启inceptor来获取最新镜像;
3) create permanent function func_name as 'package.classname';
注意:
1) udf无论是临时还是永久,如果要删除并重新创建使用相同类或者jar的话,都要重启inceptor server;
2) 官方不推荐使用using jar的方式是因为此方法存在异常隐患,会报找不到jar包的错误。
实际执行如下:
inceptor> create permanent function random_number as 'io.udf.RandomNumber';
inceptor> DESCRIBE FUNCTION EXTENDED random_number;
inceptor> SELECT random_number() FROM system.dual;
该函数,会生成0到1之间的随机小数:
3. 在kundb中添加udf信息
//连接KunDB
mysql -h -P15307 -uxxx -pxxx
//将新建UDF信息插入到表中
mysql> use protection_defensor1; // 找到defensor实例对应的库名,根据实际情况替换
//查找脱敏算法的根节点
SELECT * FROM protection_navigator WHERE parent_uuid =
(SELECT uuid FROM protection_navigator WHERE parent_uuid = '-' AND category = 'MASK_ALGORITHM');
需要自己定义将新建的UDF放在哪一类脱敏算法中,即parent_uuid以及parent_ids,该项在protection_navigator表中选择一个即可,也可以选择自己新建,
假设添加一个名为rand的UDF,属于随机替换脱敏类的算法,那么它的parent_uuid值为 a43a40d337da4b408d577eaf2fb896f2,parent_ids值为 1/3。因为随机替换脱敏算法的父节点id是1,它的id是3。
INSERT INTO protection_navigator(uuid,parent_uuid,name,parent_ids,node_type,category,description,owner,tenant)
select
REPLACE(UUID(), '-', ''),
'7a4fe639d9044b4bbc5123cf5ae7087f',
'random_number',
'1/3',
'FILE',
'MASK_ALGORITHM',
'生成介于(0,1)之间的随机小数',
'Anonymous',
'Anonymous';
//记录一下上述条目插入后的uuid,假设为5b7f399b2d8d4105878d25f8a19fd458,后续插入算法详情时需要用到
//将新建UDF的详细信息插入到protection_mask_algorithm表中
mysql> INSERT INTO protection_mask_algorithm(uuid,param_description,param_tips,udf_name,udf_column_types)
VALUES ('48830ae86bcb11ed8736005056abf6b9','生成介于(0,1)之间的随机小数','int seed or null','random_number','INTEGER');
4. Defensor页面操作
上面的步骤,我们已经将random_number
这个udf函数放到了【随机替换脱敏】中,
通过foundation gateway页面进入Defensor,静态脱敏中创建脱敏任务,
脱敏方式,选择【手动脱敏】
脱敏模式,选择【全量】
脱敏周期,选择【无周期】
源端配置:
我们选择inceptor数据库中,default
库下的emp
表的sal
字段,该字段为薪资字段,比较敏感;
在脱敏算法中,我们选择【随机替换脱敏】中的random_number
目标端配置:
自定义一张目标表表名
点击右上角【保存】-【发布】-【执行】,完成后可以在inceptor中看到保存的脱敏后的表emp_dst01