背景
在实际项目中,存在某类用户只需访问脱敏数据的业务需求。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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。