GaussDB 数据库架构师修炼(十三)安全管理(5)-动态数据脱敏
1 业务场景
数据隐私保护是数据库安全所需要具备的安全能力之一, 可以在一定程度上限制非授权用户对隐私数据的访问,保证隐私数据安全。
隐私数据,个人敏感的数据,比如银行卡号,电子邮箱,手机号码,个人工资等等
2 动态数据脱敏定义
动态数据脱敏( Dynamic Data Masking),就是将敏感数据通过变形、屏蔽等方式处理以保护隐私数据信息,防止数据泄露和恶意窥探。
3 动态脱敏特性实现方式
动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。
注:
1)动态数据脱敏策略需要由具备POLADMIN(策略管理员)属性的用户或 初始用户创建,普通用户没有访问安全策略系统表和系统视图的权限。
2)动态数据脱敏仅支持对SELECT查询到的数据进行脱敏
4 GaussDB预置的脱敏函数
预置的脱敏函数如下表所示, 用户也可以根据自己的业务场景通过自定义函数UDF创建脱敏规则。
脱敏函数名 | 示例 |
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);'4880-9898-4545-2525' 将会被脱敏为 '4880-xxxx-xxxx-2525' 。 |
maskall | '4880-9898-4545-2525' 将会被脱敏为 'xxxxxxxxxxxxxxxxxxx' |
5 脱敏策略举例
1)动态数据脱敏机制基于资源标签进行脱敏策略的定制化,可根据实际场景选择特定的脱敏方式,也可以针对某些特定用户制定脱敏策略。
2)使用动态数据脱敏首先需要开启安全策略开关,设置GUC参数enable_security_policy=on,脱敏策略才可以 生效。
3)完全举证:
步骤1:确实enable_security_policy安全策略开关是否开启
gaussdb=> show enable_security_policy;enable_security_policy
------------------------off
(1 row)gaussdb=>
执行GUC命令开启安全策略开关
[Ruby@dtest1 ~]$ gs_guc set -Z datanode -I all -N all -c "enable_security_policy='on'";
The gs_guc run with the following arguments: [gs_guc -Z datanode -I all -N all -c enable_security_policy='on' set ].
Begin to perform the total nodes: 3.
Popen count is 3, Popen success count is 3, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 3, Command success count is 3, Command failure count is 0.Total instances: 3. Failed instances: 0.
ALL: Success to perform gs_guc!gaussdb=> show enable_security_policy;enable_security_policy
------------------------on
(1 row)
步骤2:埋点数据,创建table1表
[Ruby@dtest1 ~]$ gsql -dcsdn -p8000 -U csdn -W '******' -ar
gsql ((GaussDB Kernel 505.2.1 build 159cea95) compiled at 2024-12-27 09:22:44 commit 10161 last mr 21504 release)
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.csdn=>
csdn=>
csdn=> set search_path=csdn;
SET
csdn=>
csdn=>
csdn=> create table table1(name varchar2(64),credicart varchar2(128));
CREATE TABLE
csdn=>
csdn=>
csdn=> insert into table1 values('李大慧','4880-9898-4545-2525');
INSERT 0 1
步骤3:为table1.credicart、table1.name添加资源标签
csdn=> create resource label label_for_credicart add column(csdn.table1.credicart);
CREATE RESOURCE LABEL
csdn=> create resource label label_for_name add column(csdn.table1.name);
CREATE RESOURCE LABEL
csdn=>
步骤4:使用预置函数 creditcardmasking 和 randommasking进行脱敏
csdn=> create masking policy msk_creditcard creditcardmasking ON LABEL(label_for_credicart);
CREATE MASKING POLICY
csdn=>
步骤5:验证结果
csdn=> select * from table1;name | credicart
--------+---------------------李大慧 | xxxx-xxxx-xxxx-2525
(1 row)csdn=>