KingbaseES数据脱敏-青学会&金仓专栏(3)
想学会更多实用技巧,请联系小助手,欢迎加入青学会MOP技术社区(实名社区)。
同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。
如果你有想了解的知识点希望我们发文可以后台私信。
正文开始
数据脱敏是一种保护敏感信息的技术手段,通过特定的规则和算法对原始数据进行转换或掩盖,以防止未经授权的访问者获取真实的数据内容。
静态数据脱敏 (Static Data Masking, SDM)
静态数据脱敏是指将敏感数据从生产环境复制到另一个环境中(如开发或测试环境),然后在这个过程中对数据进行变形处理。这样做的目的是确保目标环境中的数据不再包含任何可以识别个人身份的信息或其他敏感信息。一旦数据被脱敏,它就可以安全地用于开发、测试或者分析目的,而不会泄露实际用户的隐私信息。
特点:
适用于非实时的应用场景。 通常是一次性的过程,在数据迁移时执行。 数据一旦脱敏后,源数据与脱敏后的数据是分离的。 可以支持复杂的脱敏逻辑,包括但不限于替换、混淆、部分遮掩等方法。 对性能的影响较小,因为处理是在数据移动时完成的。
动态数据脱敏 (Dynamic Data Masking, DDM)
动态数据脱敏则是在用户请求访问生产环境中的数据时即时执行的一种技术。这意味着当授权用户查询数据库时,系统会根据预定义的规则即时地改变返回给用户的数据,从而保护那些未授权查看敏感信息的用户的访问。这种方式允许企业在不修改原始数据的情况下提供安全的数据访问。
特点:
适用于需要实时访问生产数据的场景。 不涉及数据的实际移动或存储变化,因此对于保持数据的一致性和完整性非常有用。 脱敏规则可以在运行时根据不同的用户角色或权限动态调整。 可能会对系统的性能产生一定影响,因为它涉及到额外的处理步骤来判断哪些数据应该被脱敏以及如何脱敏。 实现方式多样,有的是直接在数据库层面实现,有的则是通过中间件或是应用程序层实现。
Kingbase数据库主要提供动态数据脱敏功能,还支持备份数据脱敏化和应用级敏感数据保护。
应用场景:
企业内部管理:
想象一个公司的人力资源管理系统,其中包含了所有员工的个人信息。HR部门可能需要查看完整的员工信息来进行管理和决策,但其他部门(如财务部)只需知道员工的基本信息而无需了解详细的身份证号码。通过设置数据脱敏策略,系统可以在向非HR用户展示信息时自动将身份证号中间几位替换为星号或其他字符。
在医院的信息系统中,医生需要访问病人的完整健康记录以做出准确诊断,但是行政人员只需要处理预约、账单等事务,并不需要看到病人的详细医疗信息。在这种情况下,可以通过动态数据脱敏技术让行政人员只能看到经过脱敏处理后的病人基本信息。
银行或金融机构经常处理客户的账户信息和交易记录。客户服务代表在帮助客户解决问题时可能会查看账户详情,但他们并不需要知道客户的全部银行账号或者信用卡号码。通过数据脱敏,可以将部分账号数字隐藏起来,既保证了服务的质量也保护了客户的隐私安全。
学校的学生信息系统里有学生的个人资料和成绩报告。教师可能需要全面了解学生的表现,以便提供个性化的辅导和支持,但对于家长来说,他们可能只需要知道孩子的总体表现情况而不必得知具体分数。这时,系统可以根据不同角色设定相应的脱敏规则,比如向家长展示的成绩单上仅显示等级而非具体的分数。
KingbaseES数据库中的数据脱敏功能支持以下对象和特性:
用户表:可以对用户自定义的表配置数据脱敏策略。 物化视图:可以在物化视图上配置数据脱敏策略,但一旦配置了脱敏策略,该物化视图将无法更新数据。此外,不支持在已经配置了脱敏策略的表上创建新的物化视图。 分区表:可以在分区表的主表上配置数据脱敏策略,但需要注意的是,脱敏策略仅作用于主表层面。
数据脱敏存在以下限制:
权限限制:只有安全员(sso)有权限配置及查看数据脱敏策略,其他用户没有这些权限。
单一策略:每个脱敏对象(列)只能配置一种脱敏策略。
不支持的对象:
不支持在系统表上进行数据脱敏。
不支持对普通视图配置脱敏策略;如果在配置了脱敏策略的表上建立视图,那么通过该视图查询的数据对于脱敏用户而言将是脱敏后的值。
不支持在已建立物化视图的表上配置脱敏策略,因为这会导致物化视图无法更新。
数据脱敏函数与特性
数据脱敏功能通过使用脱敏函数来实现,KingbaseES支持默认完整脱敏、部分数据脱敏、随时数据脱敏和邮件数据脱敏四种脱敏函数。使用数据库脱敏函数需要结合对应的脱敏策略.
默认完整脱敏
默认脱敏default是一种完整数据脱敏,无需指定,当指定脱敏函数为空时默认指定为默认脱敏。支持的数据类型和各类型数据脱敏结果如下:
| 函数 | 支持的数据类型 | 描述 |
|---|---|---|
| default | varchar,char,text,timestamp, timestamptz,date,time,timetz,integer,smallint,tinyint,bigint,smallserial,serial, bigserial,boolean,real,double | 默认脱敏,无需指定,当指定脱敏函数为空时默认指定为默认脱 敏,各类型数据脱敏结果如下:字符类型:空值数字类型:0(不保证精度)布尔类型:f时间类型:年月日部分:1970-01-01, 时分秒部分:00:00:00 |
部分数据脱敏
可以使用函数partial自定义数据脱敏,对部分数据进行脱敏输出。部分数据脱敏需要在实际数据中设置脱敏的开始位置和结束位置,这部分数据将用符号*进行脱敏。支持的数据类型和脱敏结果如下:
| 函数 | 支持的数据类型 | 描述 |
|---|---|---|
| partial(prefix int,suffix int) | varchar,char,text | 部分脱敏(自定义脱敏),prefix为保留的前n位,suffix为保 留的后n位,其余位用*进行脱敏,例如partial(2,2) |
随机数据脱敏
在随机脱敏中,通过将整个值替换成随机值来实现数据脱敏。每次查询结果集显示的脱敏数据都会随机变化,随机脱敏的数据将很难从直观上与真实数据区分开来。KingbaseES支持字符类型、时间类型、数字类型的随机脱敏,具体支持的数据类型和脱敏结果如下:
| 函数 | 支持的数据类型 | 描述 |
|---|---|---|
| random_string | varchar,char,text | 对字符数据类型进行随机脱敏,变长数据根据原数据的数据长度 生成随机字符串,定长数据为根据最大长度生成随机字符串 |
| random_date | timestamp,timestamptz,date, time,timetz | 对时间数据类型进行随机脱敏,生成1900-01-01 00:00:00至今 之间的随机时间(根据数据类型改变) |
| random_int | integer,smallint,tinyint, bigint,smallserial,serial, bigserial | 对数字数据类型进行随机脱敏,生成0至该数据类型的最大值的 随机数 |
邮件数据脱敏
KingbaseES支持邮件格式字符串专用脱敏函数email_mask,将email字符数据最后一个符号.之前的所有字符都将用符号*进行脱敏。具体支持的数据类型和脱敏结果如下:
| 函数 | 支持的数据类型 | 描述 |
|---|---|---|
| email_mask | varchar,char,text | 邮件格式字符串专用脱敏函数,将email字符数据最后一个.之前 的所有字符替换为,@符号保留,例如 " zhangsan @ kingbase . com.cn" 脱敏为 " ***@******** .cn",没有.符号时不 保留后缀字符串 |
接下来我们进入实验环节:
修改配置文件
首先,你需要修改 KingbaseES 的配置文件 kingbase.conf 来加载 sys_anon 插件。找到 shared_preload_libraries 参数,并设置如下:
shared_preload_libraries = 'sys_anon'
确保该行没有被注释掉(即前面没有 # 号)。如果 shared_preload_libraries 参数已经存在并且包含其他库,请用逗号分隔这些库名,例如:
shared_preload_libraries = 'some_other_library, sys_anon'
新建数据库需要安装扩展
CREATE EXTENSION sys_anon;
数据脱敏开关
KingbaseES数据库中对数据脱敏功能设置了开关。数据脱敏功能关闭时,数据库不会对脱敏对象进行脱敏处理。安全员(sso)如果要使 KingbaseES 系统中的数据脱敏设置生效,必须打开该开关。
anon.enable设置审计功能是否开启的总开关,有on和off两种选择,缺省为 off。
on表示打开数据脱敏功能;
off表示关闭数据脱敏功能;
打开(或关闭)数据脱敏开关的方式有如下方式:
在KingbaseES启动之前,通过修改 kingbase.conf 文件,将
anon.enable设置为on(或off)在KingbaseES启动后,以安全员用户连接数据库,利用ALTER SYSTEM命令将
anon.enable设置为on | off。打开(或关闭)数据脱敏开关,重载配置后,数据库系统中的数据脱敏功能立即生效(或失效)。打开(或关闭)数据脱敏开关并重载的命令:
ALTER SYSTEM SET anon.enable = on | off;
CALL sys_reload_conf();
脱敏案例:
默认脱敏策略:
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# create table wy1(a int);
CREATE TABLE
test=# \c test sso
#通过安全员(SSO)登录数据库,默认密码为12345678ab
Password for user sso:
You are now connected to database "test" as userName "sso".
test=> select anon.add_policy('pol1', 'wy1.a', '','','');
add_policy
------------
(1 row)
#插入数据校验
kingbase=# \c test system
You are now connected to database "test" as userName "system".
test=# select * from wy1;
a
---
(0 rows)test=# insert into wy1 values(1);
INSERT 0 1
test=# select * from wy1;
a
---
0
(1 row)
部分数据脱敏:
test=# create table wy2(name varchar);
CREATE TABLE
; ^
test=# insert into wy2 values('我爱电科金仓数据库');
INSERT 0 1
test=# select * from wy2;
name
--------------------
我爱电科金仓数据库 #脱敏策略
test=# \c test sso
#通过安全员(SSO)登录数据库,默认密码为12345678ab
Password for user sso:
You are now connected to database "test" as userName "sso".
test=> select anon.add_policy('pol2','wy2.name','','partial','2,2');
add_policy
------------
(1 row)
#查看脱敏后的数据
kingbase=# \c test system
You are now connected to database "test" as userName "system".
test=# select * from wy2;
name
-------------------------
***********************
(1 row)
随机数据脱敏 :
test=# create table wy3(name varchar);
CREATE TABLE
test=# insert into wy3 values('我爱电科金仓数据库');
INSERT 0 1
test=# select * from wy3;
name
--------------------
我爱电科金仓数据库
(1 row)#脱敏策略
test=# \c test sso
#通过安全员(SSO)登录数据库,默认密码为12345678ab
Password for user sso:
You are now connected to database "test" as userName "sso".
test=> select anon.add_policy('pol3', 'wy3.name', '','random_string','');
add_policy
------------
(1 row)
#查看脱敏后的数据
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# select * from wy3;
name
-----------------------------
4agmsyEKQW28ekqwCIOU06ciouA
(1 row)
邮件数据脱敏:
test=# create table wy4(mail_address varchar);
CREATE TABLE
test=# insert into wy4 values('[email protected]');
INSERT 0 1#脱敏策略
test=# \c test sso
#通过安全员(SSO)登录数据库,默认密码为12345678ab
Password for user sso:
You are now connected to database "test" as userName "sso".
test=> select anon.add_policy('pol4', 'wy4.mail_address', '','email_mask','');
add_policy
------------
(1 row)
#查看脱敏后的数据
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# select * from wy4;
mail_address
-----------------
********@**.com
(1 row)
数据脱敏策略语法:
添加脱敏策略 :
anon.add_policy(policy_name text,
objname text,
username text,
func_desc text,
para_list text
) 参数说明:
policy_name
脱敏策略名,不可为空,策略名唯一。
objname
待脱敏的对象,不可为空,格式为:模式.表.列(不写模式时为表.列,模式默认设置为public)。
username
待脱敏的对象用户名,可为空,为空对所有用户脱敏。
func_desc
脱敏使用的函数(只需要填写函数名),可为空,为空设置为默认脱敏。
支持使用的脱敏函数详见表 脱敏函数说明。
para_list
脱敏函数的参数列表(目前仅适用于部分脱敏),若函数无参数,则该项无效;若函数为部分脱敏时需要填写,参数之间用‘,’分隔,例如’2,2’,参数列表个数为2。
返回值说明:无返回值
修改脱敏策略:
anon.alter_policy(policy_name text,
username text,
func_desc text,
para_list text
)
参数说明policy_name
脱敏策略名,不可为空。
username
待脱敏的对象用户名,可为空,为空时不修改脱敏用户。
func_desc
脱敏使用的函数(只需要填写函数名),可为空,为空时不修改脱敏函数。
para_list
脱敏函数的参数列表(目前仅适用于部分脱敏),可为空,为空时不修改参数列表。
返回值说明:无返回值
删除脱敏策略 :
anon.remove_policy(policy_name text)
参数说明policy_name
脱敏策略名,为空时删除所有策略。
返回值说明:无返回值
数据脱敏配置查询相关:
| 列名 | 数据类型 | 说明 |
|---|---|---|
| policy_name | text | 数据脱敏策略名 |
| table_name | text | 脱敏对象名 |
| schema_name | text | 脱敏对象模式名 |
| column_name | text | 脱敏列名 |
| masking_user | text | 被脱敏用户名 |
| masking_func | text | 脱敏函数 |
| func_parameters | text | 脱敏函数参数列表 |
脱敏函数注意事项:
部分脱敏的处理:
如果你想要保留的字符数量超过了实际字符串的长度,那么系统会采用一个默认的部分脱敏方法。 对于奇数长度的字符串,系统会隐藏最中间的那个字符。 对于偶数长度的字符串,系统会隐藏最中间的那两个字符。
定长与变长字符串的处理:
如果你的字符串是固定长度(比如CHAR类型),系统会按照这个最大长度来进行脱敏处理。 如果你的字符串是可变长度(比如VARCHAR类型),系统则会根据每个字符串的实际长度来进行脱敏处理。
更改数据类型时的限制:
如果你有一个列已经设置了脱敏策略,并且你想改变这个列的数据类型,那么新的数据类型必须是当前脱敏策略支持的类型。也就是说,不是所有的数据类型都可以随便改,只能改成那些能够和现有的脱敏规则兼容的类型。
结语:
通过这些规则,金仓数据库能够确保敏感数据在显示或传输时被适当隐藏,同时保证数据类型的一致性和脱敏策略的有效性。这样可以保护用户隐私和企业机密,减少数据泄露的风险。
此外,如果您对kingbase数据库感兴趣,请继续关注我们的专栏。
往期文章回顾
MOP社区新闻
金仓专栏
告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)
DBA实战小技巧
实战:记一次RAC故障排查
DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
DBA实战运维小技巧存储篇(一)根目录满了如何处理
DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储
MOP社区投稿-内核开发
简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理
简单讨论 PostgreSQL C语言拓展函数返回数据表的方式
简单分析 pg_config 程序的作用与原理
Redis 日志机制简介(一):SlowLog
Redis 日志机制简介(二):AOF 日志
Redis 日志机制简介(三):RDB 日志
pg_cron插件使用介绍
Redis 的指令表实现机制简介
pg几款源码工具介绍
Redis 事务功能简介