安全数据库GreatDB作为万里数据库自主研发的一款核心数据库产品,于2023年底首批通过安全可靠测评,可根据用户需求选择集中式或分布式方式部署。
GreatDB拥有哪些特性?解决了用户的哪些痛点难题?基于此,万里数据库悉心推出【产品解读】专栏,将从非阻塞式DDL、读写分离、备份方式等多个维度深入阐述GreatDB产品特性,帮您了解并用好GreatDB~
01
什么是数据脱敏?
数据脱敏是指对敏感数据进行变形、转换或屏蔽等处理,使其在不影响数据使用价值的前提下,降低数据的敏感性,保护数据所涉及的个人隐私、商业机密或其他敏感信息不被泄露的技术手段。
02
数据脱敏需求场景
1. 应对内外部威胁
数据库管理员、开发 测试人员、第三方合作方可能因权限过大或操作不当接触敏感数据,脱敏可降低 “无意泄露” 或 “恶意窃取” 的风险。
2. 减少数据暴露面
在数据共享、迁移、备份、分析等场景中,敏感数据可能被不必要地扩散。
3. 安全的数据共享与协作
企业与合作伙伴、第三方机构共享数据时,需在数据价值利用与隐私保护间实现平衡。脱敏后的数据可用于联合建模、业务分析等,同时避免核心数据资产流失。
4. 开发测试环境的安全保障
开发 测试阶段需要真实的数据,用来验证业务逻辑,但直接使用生产数据,存在极大安全隐患,因此需要数据脱敏。
03
GreatDB如何实现数据脱敏?
安全数据库GreatDB在数据库服务器上实现了数据脱敏功能。DBA可制定数据脱敏策略(脱敏算法),并将脱敏策略应用到数据表的列上,非脱敏特权用户在查询脱敏数据列时,查询结果中,脱敏数据列会显示为脱敏后的数据,即通过脱敏算法处理后的数据,从而限制了非授权用户对隐私数据的访问。
GreatDB数据脱敏-相关概念解释:
脱敏标签:指数据库表中需要脱敏字段的别名;
脱敏策略:指对脱敏字段数据施加的脱敏算法及参数;
脱敏特权用户:指拥有super权限的用户和使用sys_masking.policy_add_user特别指定的用户。对于脱敏特权用户,脱敏数据列将不进行脱敏处理。
04
如何使用GreatDB数据脱敏功能?
1)安装脱敏元数据库sys_masking
source $GREATDB_HOME/share/sys_masking.sql
备注:$GREATDB_HOME 是GreatDB的安装目录。
2)创建脱敏标签
sys_masking.create_label( 'db_name', 'table_name', 'field_name' , 'mask_label_name');
功能:创建脱敏标签,指向需要脱敏的字段,允许一个脱敏标签指向多个字段。
参数:
•db_name :数据库的名称 (不区分大小写)
•table_name :表名称 (不区分大小写)
•field_name :字段名称 (不区分大小写)
•mask_label_name :脱敏标签名称
3)创建脱敏策略
sys_masking.create_policy('policy_name','mask_function', 'args')
功能:创建脱敏策略,为脱敏策略指定脱敏函数及参数。
参数:
•policy_name :策略名称 , 字符长度必须大于1
•mask_function :脱敏函数名称 ,当前支持maskall和mask_inside
•args :脱敏函数的参数,多个参数使用逗号进行分割;不指定或者指定为'',将使用默认参数。
4)将脱敏策略施加到脱敏标签
sys_masking.policy_add_label('policy_name', 'mask_label_name')
功能:将脱敏策略应用到脱敏标签,一个脱敏标签只能有一个脱敏策略。
参数:
•policy_name :脱敏策略名称
•mask_label_name:脱敏标签名称
5)添加脱敏特权用户
sys_masking.policy_add_user('policy_name', 'user_name');
功能: 添加排除脱敏策略之外的脱敏特权用户。
参数:
•policy_name :脱敏策略名称
•user_name:对上面脱敏策略豁免的用户名, 格式为 username@hostname
05
测试验证
脱敏方案设计:针对tpccdb的表bmsql_customer进行脱敏,c_phone列都替换为9,c_street_1和c_street_2替换为*,同时允许用户readuser1查看c_phone的真实数据。
##-- 检查tpccdb数据库下的表bmsql_customer结构GreatDB V1.0> desc bmsql_customer;+----------------+---------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------------+---------------+------+-----+---------+-------+| c_w_id | int | NO | PRI | NULL | || c_d_id | int | NO | PRI | NULL | || c_id | int | NO | PRI | NULL | || c_discount | decimal(4,4) | YES | | NULL | || c_credit | char(2) | YES | | NULL | || c_last | varchar(16) | YES | | NULL | || c_first | varchar(16) | YES | | NULL | || c_credit_lim | decimal(12,2) | YES | | NULL | || c_balance | decimal(12,2) | YES | | NULL | || c_ytd_payment | decimal(12,2) | YES | | NULL | || c_payment_cnt | int | YES | | NULL | || c_delivery_cnt | int | YES | | NULL | || c_street_1 | varchar(20) | YES | | NULL | || c_street_2 | varchar(20) | YES | | NULL | || c_city | varchar(20) | YES | | NULL | || c_state | char(2) | YES | | NULL | || c_zip | char(9) | YES | | NULL | || c_phone | char(16) | YES | | NULL | || c_since | timestamp | YES | | NULL | || c_middle | char(2) | YES | | NULL | || c_data | varchar(500) | YES | | NULL | |+----------------+---------------+------+-----+---------+-------+21 rows in set (0.02 sec)
1)创建一个只读用户readuser和readuser1,使用户查询脱敏数据
##-- 创建测试用readuser和readuser1create user readuser identified by 'readpass';grant select on *.* to readuser;grant PROCESS on *.* to readuser;GRANT LOCK TABLES ON tpccdb.* TO readuser;create user readuser1 identified by 'readpass';grant select on *.* to readuser1;
2)调用sys_masking的函数实现脱敏策略
##-- 创建脱敏标签bmsql_customer.phoneCALL sys_masking.create_label('tpccdb', 'bmsql_customer', 'c_phone', 'bmsql_customer.phone') ;##-- 创建脱敏标签bmsql_customer.streetCALL sys_masking.create_label('tpccdb', 'bmsql_customer', 'c_street_1', 'bmsql_customer.street') ;CALL sys_masking.create_label('tpccdb', 'bmsql_customer', 'c_street_2', 'bmsql_customer.street') ;##-- 创建脱敏策略policy_maskall9,全部替换为9CALL sys_masking.create_policy('policy_maskall9', 'maskall', '9' ) ;##-- 创建脱敏策略policy_maskall*,全部替换为*CALL sys_masking.create_policy('policy_maskall*', 'maskall', '*' ) ;mask_inside(str, margin1, margin2 [, mask_char])##-- 将脱敏策略应用到脱敏标签CALL sys_masking.policy_add_label('policy_maskall9', 'bmsql_customer.phone');CALL sys_masking.policy_add_label('policy_maskall*', 'bmsql_customer.street');##-- 添加特权用户readuser1@%豁免脱敏策略policy_maskall9CALL sys_masking.policy_add_user('policy_maskall9', 'readuser1@%');
3)脱敏数据查询,确认脱敏列已脱敏
readuser用登录后,查询结果:
GreatDB V1.0> select c_id,c_zip,c_street_1,c_street_2,c_phone from bmsql_customer limit 10;+------+-----------+----------------------+----------------------+------------------+| c_id | c_zip | c_street_1 | c_street_2 | c_phone |+------+-----------+----------------------+----------------------+------------------+| 1 | 912211111 | ************** | ************* | 9999999999999999 || 2 | 749611111 | ********** | ************ | 9999999999999999 || 3 | 959011111 | ******************** | *************** | 9999999999999999 || 4 | 427311111 | *********** | ****************** | 9999999999999999 || 5 | 698111111 | ******************* | ****************** | 9999999999999999 || 6 | 765611111 | ******************* | ****************** | 9999999999999999 || 7 | 417011111 | ************ | ************ | 9999999999999999 || 8 | 806011111 | ************** | ************** | 9999999999999999 || 9 | 549711111 | ******************* | ******************** | 9999999999999999 || 10 | 329811111 | ********** | ************* | 9999999999999999 |+------+-----------+----------------------+----------------------+------------------+10 rows in set (0.01 sec)
实现了脱敏方案设计:c_phone列都替换为9,c_street_1和c_street_2替换为*
readuser1的查询结果:
GreatDB V1.0> select c_id,c_zip,c_street_1,c_street_2,c_phone from bmsql_customer limit 10;+------+-----------+----------------------+----------------------+------------------+|c_id | c_zip | c_street_1 | c_street_2 | c_phone |+------+-----------+----------------------+----------------------+------------------+| 1 | 912211111 | *************** | ************* | 1331460095850705 || 2 | 749611111 | ********** | ************ | 6582303057609489 || 3 | 959011111 | ******************** | *************** | 4682297596375316 || 4 | 427311111 | *********** | ****************** | 7403039273118317 || 5 | 698111111 | ******************* | ****************** | 1573713730341581 || 6 | 765611111 | ******************* | ****************** | 7839165491380732 || 7 | 417011111 | ************ | ************ | 0406886203637324 || 8 | 806011111 | ************** | ************** | 4705093824634267 || 9 | 549711111 | ******************* | ******************** | 5705799209973197 || 10 | 329811111 | ********** | ************* | 9329119448979110 |+------+-----------+----------------------+----------------------+------------------+10 rows in set (0.01 sec)
对于readuser1豁免了c_phone列的数据脱敏。
4)使用greatdbdump导出脱敏表,脱敏列数据已脱敏
greatdbdump -ureaduser -preadpass -h127.0.0.1 --set-gtid-purged=off tpccdb bmsql_customer >aa.sql
检查aa.sql,确认脱敏列数据已脱敏。
INSERT INTO `bmsql_customer` VALUES(3,1,1,0.2553,'GC','BARBARBAR','zWzbrTjItbR',50000.00,-8692.49,8692.49,4,1,'**************','*************','iafbzpZWvUN','ID','912211111','9999999999999999','2025-03-2507:20:34','OE','j2uYpkt1vvrKuuMEguq1xf3YpAAyXWhfu0638OzQ4AqPQLa4RsycmXyAE9XZttvg5HivMiw7wcjiO8BaUzHjEQlVCGplwAEnMEQWPAcGOZq8zPbHoOSN0RWwN8t8z2BS3LLgb4sGMnOjHq2Qs2PTHMHqvE41jGvmrqOnbWFXcbX5pxtB9xAYD6KxxYvVPRNO1jlLUUxcoBoBkRd81w4tgWpBEXKuT6XQp1oUCC1Uk2fJmzjnrKEpKPaX1GaNM2CoLC356npEysPOn91bNB9GjiCJHq0fZrokLyTpwFmmSeGOWZ82GbhX2ALd54ZPzrebbE6gtOD5lkk8OQJ2xKERavP5FNzNR3BnHIlazSjOEfIHoAQdo'),(3,1,2,0.1115,'GC','BARBAROUGHT','eaXrWk9YaO',50000.00,50309.95,4709.85,3,2,'**********','************','PVBNFb7u0B','EB','749611111','9999999999999999','2025-03-25 07:20:34','OE','gBqmE2FiYMTthR9E5yH8kivcUs7KtVNlEyaCSJgatSe8TNcpWnwiE6G2bSAJBBK2kOCOsYoSgxLD44kN82A3QabFd9pJGd4PUyklG3a3Dg1E94qLHwyGnv16DGnN7xcGuS1Owcx3z4SaSsoIo6ln49ttoYefvdqouOdgwPCLt4cpdAQcplulv6qIRoIxQKHIN7FIJ3fhHXkuW9oKtQjNv38ZUmbVozIWox7Fi0eRcfefQH8BAccrnlAvuJTAk4PaEiqPJ9adAnKYsAf772MKsiHIWiyhb8wtUJN1pfUHyNnWXkzqHqvAtXpCiQpL3ZqOakKjt6cyCG9LIgSeLCCYnpSyFr5jrjp3QKTghmQdYGt0k30dP9FBB1gATa8tr9kfk7WtkMgd5nZRnG31ehgLYhgGdirgG9CmLb7x4jy3B1ZWdDok43HBF6KbYT8GFaNzRe8wU5HGm19FqilPZJuCE')......
06
总 结
安全数据库GreatDB的数据脱敏功能,可以帮助客户实现数据库整体的脱敏目标。不仅允许DBA制定数据脱敏策略,将脱敏策略应用到数据表的列上,限制了非授权用户对隐私数据的访问,同时又对脱敏特权用户的脱敏行为进行赦免,保留了脱敏设置的灵活性。
基于此,安全数据库GreatDB为客户应对内外部敏感数据泄露威胁、减少数据暴露面,实现安全的数据共享与协作,以及为开发测试环境带来安全保障等维度均提供了有效的解决方案。







