暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

GBase 8a MPP Cluster 数据脱敏功能实践

原创 陆户习习门 2022-03-02
28358

背景

在实际项目中,存在某类用户只需访问脱敏数据的业务需求。GBase 8a MPP Cluster可以通过动态数据脱敏,不改变库表实际数据,只是在查询时用该特性控制查询返回的语句,来实现这一需求。

通过用户权限控制,没有unmask权限的用户受脱敏规则影响只能访问到脱敏后的数据。

动态数据脱敏支持四种类型的脱敏函数:

# 类型 语法
1 默认default MASKED WITH(FUNCTION = ‘DEFAULT()’) 默认类型,无参数;
2 随机random MASKED WITH(FUNCTION = ‘RANDOM(min,max)’) min 的最小值为 1,参数 max 的最大值为 100;
3 自定义partial MASKED WITH(FUNCTION =‘PARTIAL(prefix, padding, suffix)’) prefix 表示前缀保留显示字符数量; padding 表示脱敏显示字符; suffix 表示结尾保留显示字符数量;
4 哈希sha MASKED WITH(FUNCTION =‘SHA()’) 无参数;

实践

1.创建脱敏用户

(1)创建脱敏用户 masked

CREATE USER masked IDENTIFIED BY 'masked';

(2)赋予测试库权限(默认不包含unmask权限)

GRANT ALL ON testdb.* TO masked;
2.测试数据准备

(1)创建脱敏测试表

/* 以下sql使用gbase用户操作 */ CREATE TABLE testdb.tb_masked ( /* DEFAULT类型 */ id INT MASKED WITH(FUNCTION = 'DEFAULT()'), username VARCHAR(20) MASKED WITH(FUNCTION = 'DEFAULT()'), updatetime DATETIME MASKED WITH(FUNCTION = 'DEFAULT()'), /* RANDOM类型 */ age INT MASKED WITH(FUNCTION = 'RANDOM(1,4)'), /* PARTIAL类型 */ company VARCHAR(50) MASKED WITH (FUNCTION = 'PARTIAL(4,"XXXX",2)'), /* SHA类型 */ codename VARCHAR(20) MASKED WITH (FUNCTION = 'SHA()') );

(2)插入数据

INSERT INTO testdb.tb_masked VALUES (1001,'Stinky Jefferson',current_timestamp,30,'Amazonworld','Lucky Boy Scout'); INSERT INTO testdb.tb_masked VALUES (1002,'Slaps Rosenthal',current_timestamp-2,25,'Apachescape','Humming Packer'); INSERT INTO testdb.tb_masked VALUES (1003,'Cornbread Endicott',current_timestamp-4,40,'Mazewalk','Crafty King'); INSERT INTO testdb.tb_masked VALUES (1004,'Skidmark Putney',current_timestamp-6,35,'Pinkbeat','Innocent Darling'); /* 查看表 */ gbase> SELECT * FROM testdb.tb_masked; +------+--------------------+---------------------+------+-------------+------------------+ | id | username | updatetime | age | company | codename | +------+--------------------+---------------------+------+-------------+------------------+ | 1001 | Stinky Jefferson | 2022-03-02 13:59:51 | 30 | Amazonworld | Lucky Boy Scout | | 1002 | Slaps Rosenthal | 2022-02-28 13:59:51 | 25 | Apachescape | Humming Packer | | 1003 | Cornbread Endicott | 2022-02-26 13:59:51 | 40 | Mazewalk | Crafty King | | 1004 | Skidmark Putney | 2022-02-24 13:59:51 | 35 | Pinkbeat | Innocent Darling | +------+--------------------+---------------------+------+-------------+------------------+ 4 rows in set (Elapsed: 00:00:00.02)
3.脱敏操作

(1)查看脱敏数据

$ gccli -umasked -pmasked gbase> SELECT * FROM testdb.tb_masked; +------+----------+---------------------+------+------------+----------------------+ | id | username | updatetime | age | company | codename | +------+----------+---------------------+------+------------+----------------------+ | 0 | xxxx | 1900-01-01 00:00:00 | 3 | AmazXXXXld | 88eab1ab36e0c6af474d | | 0 | xxxx | 1900-01-01 00:00:00 | 2 | ApacXXXXpe | 765b9b4014cd721be780 | | 0 | xxxx | 1900-01-01 00:00:00 | 2 | MazeXXXXlk | 135cceee17aa413f0616 | | 0 | xxxx | 1900-01-01 00:00:00 | 2 | PinkXXXXat | 9b65a456ac40a36b6bc6 | +------+----------+---------------------+------+------------+----------------------+ 4 rows in set (Elapsed: 00:00:00.01)

(2)修改mask属性

/* 以下sql使用gbase用户操作 */ -- 删除 ALTER TABLE testdb.tb_masked ALTER age DROP masked; -- 增加 ALTER TABLE testdb.tb_masked ALTER age MASKED WITH (FUNCTION = 'RANDOM(1,4)');

(3)验证函数及其它运算操作对脱敏列的影响

/* 为了更清晰的对比,增加两个未脱敏列 age_unmask、company_unmask,赋予与age、company相同的值 */ ALTER TABLE testdb.tb_masked ADD COLUMN age_unmask INT; ALTER TABLE testdb.tb_masked ADD COLUMN company_unmask VARCHAR(50); UPDATE testdb.tb_masked SET age_unmask = age; UPDATE testdb.tb_masked SET company_unmask = company;
$ gccli -umasked -pmasked gbase> SELECT age_unmask,age,age/20 FROM testdb.tb_masked WHERE age > 25; +------------+------+--------+ | age_unmask | age | age/20 | +------------+------+--------+ | 30 | 4 | 0.0000 | | 40 | 1 | 0.0000 | | 35 | 2 | 0.0000 | +------------+------+--------+ 3 rows in set (Elapsed: 00:00:00.01) gbase> SELECT company_unmask,company,SUBSTR(company,0,6) FROM testdb.tb_masked WHERE SUBSTR(company,0,1) = 'A'; +----------------+------------+---------------------+ | company_unmask | company | substr(company,0,6) | +----------------+------------+---------------------+ | Amazonworld | AmazXXXXld | xxxx | | Apachescape | ApacXXXXpe | xxxx | +----------------+------------+---------------------+ 2 rows in set (Elapsed: 00:00:00.01) gbase> SELECT age_unmask,age,CASE WHEN AGE >30 THEN 'H' ELSE 'L'END FROM testdb.tb_masked; +------------+------+-----------------------------------------+ | age_unmask | age | CASE WHEN AGE >30 THEN 'H' ELSE 'L'END | +------------+------+-----------------------------------------+ | 30 | 4 | L | | 25 | 3 | L | | 40 | 1 | H | | 35 | 3 | H | +------------+------+-----------------------------------------+ 4 rows in set (Elapsed: 00:00:00.00)

当函数或其它运算操作于脱敏列时,按照不同的处理逻辑,脱敏规则的获取方式也不相同,由上示例,大概归纳如下:

  • WHERE条件中、以及不直接返回脱敏列值时,返回按 未脱敏数据 进行判断的结果。
  • SELECT中,直接返回脱敏列值时,
    (1)对脱敏列进行比较或者计算操作时,返回函数以default规则脱敏的结果;
    (2)其他操作,返回按脱敏列脱敏规则进行判断的结果;

总结

依据实际业务场景选用合适的脱敏规则,通过MASKED WITH(FUNCTION = ‘’),对列数据进行动态脱敏,在用户权限上(unmask)控制用户对脱敏数据的访问。

最后修改时间:2022-03-17 09:30:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论