数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化脱敏策略来实现对隐私数据保护的技术,可以在保留原始数据的前提下有效地解决非授权用户对敏感信息访问的问题。当管理员指定待脱敏对象和定制数据脱敏策略后,用户所查询的数据库资源如果关联到对应的脱敏策略时,则会根据用户身份和脱敏策略进行数据脱敏,从而限制非授权用户对隐私数据的访问。事实上,MogDB 数据库自1.1.0版本就引入了动态数据脱敏机制。
函数名 | 示例 |
---|---|
creditcardmasking | '4880-9898-4545-2525'将会被脱敏为'xxxx-xxxx-xxxx-2525',该函数仅对后4位之前的数字进行脱敏。 |
basicemailmasking | abcd@gmail.com将会被脱敏为xxxx@gmail.com,对出现第一个'@'之前的文本进行脱敏。 |
fullemailmasking | abcd@gmail.com将会被脱敏为xxxx@xxxxx.com,对出现最后一个'.'之前的文本(除'@'符号外)进行脱敏。 |
alldigitsmasking | 'alex123alex'将会被脱敏为'alex000alex',仅对文本中的数字进行脱敏。 |
shufflemasking | 'hello word'将会被随机打乱顺序脱敏为'hlwoeor dl',该函数通过字符乱序排列的方式实现,属于弱脱敏函数,语义较强的字符串不建议使用该函数脱敏。 |
randommasking | 'hello word'将会被脱敏为'ad5f5ghdf5',将文本按字符随机脱敏。 |
regexpmasking | 需要用户顺序输入四个参数:reg为被替换的字符串;replace_text为替换后的字符串;pos为目标字符串开始替换的初始位置,为整数类型;reg_len为替换长度,为整数类型。reg、replace_text可以用正则表达,pos如果不指定则默认为0,reg_len如果不指定则默认为-1,即pos后所有字符串。如果用户输入参数与参数类型不一致,则会使用maskall方式脱敏。CREATE MASKING POLICY msk_creditcard regexpmasking('[\d+]', 'x', 5, 9) ON LABEL(label_for_creditcard); |
maskall | '4880-9898-4545-2525'将会被脱敏为'xxxxxxxxxxxxxxxxxxx'。 |
特性约束
-
动态数据脱敏策略需要由具备POLADMIN或SYSADMIN属性的用户或初始用户创建,普通用户没有访问安全策略系统表和系统视图的权限。
-
动态数据脱敏只在配置了脱敏策略的数据表上生效,而审计日志不在脱敏策略的生效范围内。
-
在一个脱敏策略中,对于同一个资源标签仅可指定一种脱敏方式,不可重复指定。
-
不允许多个脱敏策略对同一个资源标签进行脱敏,除以下脱敏场景外:使用FILTER指定策略生效的用户场景,包含相同资源标签的脱敏策略间FILTER生效场景无交集,此时可以根据用户场景明确辨别资源标签被哪种策略脱敏。
-
Filter中的APP项建议仅在同一信任域内使用,由于客户端不可避免的可能出现伪造名称的情况,该选项使用时需要与客户端联合形成一套安全机制,减少误用风险。一般情况下不建议使用,使用时需要注意客户端仿冒的风险。
-
对于带有query子句的INSERT或MERGE INTO操作,如果源表中包含脱敏列,则上述两种操作中插入或更新的结果为脱敏后的值,且不可还原。
-
在内置安全策略开关开启的情况下,执行ALTER TABLE EXCHANGE PARTITION操作的源表若在脱敏列则执行失败。
-
对于设置了动态数据脱敏策略的表,需要谨慎授予其他用户对该表的trigger权限,以免其他用户利用触发器绕过脱敏策略。
-
最多支持创建98个动态数据脱敏策略。
-
仅支持使用上述预置脱敏策略。
-
仅支持对只包含COLUMN属性的资源标签做脱敏。
-
仅支持对基本表的列进行数据脱敏。
-
仅支持对SELECT查询到的数据进行脱敏。
实际案例
开启安全策略
sql
MogDB=# alter system set enable_security_policy=on;
ALTER SYSTEM SET
MogDB=# show enable_security_policy;
enable_security_policy
------------------------
on
(1 row)
参数说明: 安全策略开关,控制统一审计和数据动态脱敏策略是否生效。
1. 证件保留尾号脱敏(creditcardmasking)
sql
MogDB=# create user mask_user password 'Password#123';
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# alter user mask_user sysadmin;
ALTER ROLE
[omm@master01 ~]$ gsql -r -d postgres -U mask_user -W "Password#123"
gsql ((MogDB 5.0.4 build 070c88a0) compiled at 2023-11-25 12:57:09 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=> CREATE TABLE creditcard_info (id_number int, name varchar(100),credit_card varchar(19));
CREATE TABLE
MogDB=> INSERT INTO creditcard_info values(1,'Wusx','4880-9898-4545-2525');
INSERT 0 1
MogDB=> CREATE RESOURCE LABEL label_for_creditcard ADD COLUMN(mask_user.creditcard_info.credit_card);
CREATE RESOURCE LABEL
MogDB=> CREATE MASKING POLICY mask_creditcard creditcardmasking ON LABEL(label_for_creditcard);
CREATE MASKING POLICY
MogDB=> select * from mask_user.creditcard_info;
id_number | name | credit_card
-----------+------+---------------------
1 | Wusx | xxxx-xxxx-xxxx-2525
2、邮箱地址前缀 脱敏(basicemailmasking)
sql
[omm@master01 ~]$ gsql -r -d postgres -U mask_user -W Password#123
gsql ((MogDB 5.0.4 build 070c88a0) compiled at 2023-11-25 12:57:09 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=> create table mail_list(id_number int, name varchar(100),mail_addr varchar(200));
CREATE TABLE
MogDB=> INSERT INTO mail_list values(1,'Wusx','shixing.wu@enmotech.com');
INSERT 0 1
MogDB=> CREATE RESOURCE LABEL label_for_mail_list ADD COLUMN(mask_user.mail_list.mail_addr);
CREATE RESOURCE LABEL
MogDB=> CREATE MASKING POLICY mask_mail_list basicemailmasking ON LABEL(label_for_mail_list);
CREATE MASKING POLICY
MogDB=> select * from mask_user.mail_list;
id_number | name | mail_addr
-----------+------+-------------------------
1 | Wusx | xxxxxxxxxx@enmotech.com
(1 row)
3、邮箱地址前缀+域名脱敏(fullemailmasking)
sql
[omm@master01 ~]$ gsql -r -d postgres -U mask_user -W Password#123
gsql ((MogDB 5.0.4 build 070c88a0) compiled at 2023-11-25 12:57:09 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=> drop MASKING POLICY mask_mail_list;
DROP MASKING POLICY
MogDB=> CREATE MASKING POLICY mask_mail_list fullemailmasking ON LABEL(label_for_mail_list);
CREATE MASKING POLICY
MogDB=> select * from mask_user.mail_list;
id_number | name | mail_addr
-----------+------+-------------------------
1 | Wusx | xxxxxxxxxx@xxxxxxxx.com
(1 row)
4、数字脱敏(alldigitsmasking)
properties
MogDB=> create table account_detail(id_number int, name varchar(100),balance_detail varchar(2000));
CREATE TABLE
MogDB=> INSERT INTO account_detail values(1,'Wusx','余额:9999888800');
INSERT 0 1
MogDB=> CREATE RESOURCE LABEL label_for_account_detail ADD COLUMN(mask_user.account_detail.balance_detail);
CREATE RESOURCE LABEL
MogDB=> CREATE MASKING POLICY mask_account_detail alldigitsmasking ON LABEL(label_for_account_detail);
CREATE MASKING POLICY
MogDB=> select * from mask_user.account_detail;
id_number | name | balance_detail
-----------+------+------------------
1 | Wusx | 余额:0000000000
(1 row)
5、乱序脱敏(shufflemasking)
cs
[omm@master01 ~]$ gsql -r -d postgres -U mask_user -W Password#123
gsql ((MogDB 5.0.4 build 070c88a0) compiled at 2023-11-25 12:57:09 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=>
MogDB=> INSERT INTO account_detail values(2,'Thomas Anderson','余额:9999888800');
INSERT 0 1
MogDB=> CREATE RESOURCE LABEL label_for_account_detail_name ADD COLUMN(mask_user.account_detail.name);
CREATE RESOURCE LABEL
MogDB=> CREATE MASKING POLICY mask_account_detail_name shufflemasking ON LABEL(label_for_account_detail_name);
CREATE MASKING POLICY
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+-----------------
2 | or ssAanToendhm
(1 row)
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+-----------------
2 | sdmTosne Aanohr
(1 row)
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+-----------------
2 | ods rTamhAneosn
(1 row)
6、随机字符替代脱敏(randommasking)
properties
MogDB=> drop MASKING POLICY mask_account_detail_name;
DROP MASKING POLICY
MogDB=> CREATE MASKING POLICY mask_account_detail_name randommasking ON LABEL(label_for_account_detail_name);
CREATE MASKING POLICY
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+-----------------
2 | b3b0b109ff5e150
(1 row)
7、正则表达式脱敏(regexpmasking)
properties
MogDB=> drop MASKING POLICY mask_account_detail_name;
DROP MASKING POLICY
MogDB=> CREATE MASKING POLICY mask_account_detail_name regexpmasking('Thomas', 'Halo', 0, 9 ) ON LABEL(label_for_account_detail_name);
CREATE MASKING POLICY
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+---------------
2 | Halo Anderson
(1 row)
8、全遮蔽脱敏(maskall)
properties
MogDB=> drop MASKING POLICY mask_account_detail_name;
DROP MASKING POLICY
MogDB=> CREATE MASKING POLICY mask_account_detail_name maskall ON LABEL(label_for_account_detail_name);
CREATE MASKING POLICY
MogDB=> select id_number,name from mask_user.account_detail where id_number=2;
id_number | name
-----------+-----------------
2 | xxxxxxxxxxxxxxx
(1 row)
关于作者
许玉晨,云和恩墨 MogDB 技术支持工程师,有12年左右的金融、保险、政府、地税、运营商等业务关键型系统的运维经验,曾担任公司异常恢复东区接口人,负责紧急异常恢复工作,目前负责国产化 MogDB 数据库的推广工作。
数据驱动,成就未来,云和恩墨,不负所托!
云和恩墨创立于2011年,以"数据驱动,成就未来"为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。
云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库基础软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能分析处理、隐私计算)等领域为各个组织提供可信赖的产品、服务和解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。