背景信息
数据脱敏是指对某些敏感信息,例如姓名、身份证号码、手机号、固定电话、银行卡号、邮箱等个人信息,通过脱敏算法进行数据变形,以保护敏感隐私数据。
概念介绍
数据脱敏:在数据处理和数据存储过程中,通过一定的算法和技术,将敏感数据进行加工处理、模糊化或替换,使得数据无法识别或难以还原,从而达到保护数据安全、防止数据泄露的目的。
动态脱敏:对敏感数据进行实时的脱敏处理,只有在用户查询数据库时才对数据进行脱敏,而不对数据库中的源数据进行修改。动态脱敏通常用于生产环境,可以保持原始数据的完整性和准确性,同时避免了数据泄露的风险。动态脱敏的缺点是处理速度较慢,可能会影响数据库的查询效率。
静态脱敏:对敏感数据进行预处理,将处理后的数据替换原始数据存储在数据库等存储介质中。静态脱敏通常用于测试、开发和演示环境,可以保护敏感数据不被非授权人员查看,同时也避免了因敏感数据泄露导致的法律责任。静态脱敏的优点是处理速度较快,可以提高查询效率,但其缺点是无法恢复原始数据,可能会影响数据的准确性。
脱敏算法:用于对敏感数据进行脱敏处理的算法。脱敏算法能够有效地保护敏感数据的安全性,避免信息泄露,同时保留数据的格式和结构,以便于查询和使用。
识别规则:在数据脱敏功能中,使用规则来自动识别数据库中的敏感数据。扫描添加敏感列时,会通过添加的识别规则自动识别匹配的敏感列。
敏感列:在数据库表中,包含敏感数据的列。
原理介绍
执行流程
项目管理员在 安全规范 > 脱敏算法 中查看内置脱敏算法并测试脱敏效果。
项目管理员在 ODC 目标项目 > 敏感数据 中手动添加敏感列;如果通过自动扫描方式添加敏感列,需要先创建识别规则。
用户在执行查看表数据、SQL 窗口查询、结果集导出、导出工单、数据库变更工单操作时,包含的敏感列输出为脱敏数据。
前提条件
项目管理员或者 DBA 支持管理敏感列和识别规则。
所有用户均可查看、测试脱敏效果,不允许新建、编辑或者删除脱敏算法。
注意事项
数据脱敏暂未覆盖命令行窗口场景。
数据脱敏暂未覆盖 PL 执行场景。
配置识别规则脚本时,Groovy 只允许用户使用 Java 中的 Objects 类 和 Stirng 类。
配置识别规则脚本时,不支持 Groovy 闭包、自带的闭包函数。
敏感列管理
添加敏感列
示例:将数据库 odc_test 中表 employee 的列 name 数据脱敏。
信息项 | 示例值 |
所属数据源 | mysql_4.2.0 |
源端数据库名称 | odc_test |
表名称 | employee |
在项目协同窗口,单击 项目 > 敏感列 > 添加敏感列 >手动添加/扫描添加。
通过 手动添加 或者 扫描添加 敏感列后,单击 提交。
方法一:手动添加敏感列。
方法二:自动扫描敏感列。
说明自动扫描敏感列前,需要新建识别规则,具体操作请参见本文档中的 识别规则管理。
在 敏感数据 列表中可以查看和启用添加的敏感列。
编辑敏感列
如上图所示,在 敏感数据 列表中,单击操作项下的 编辑 按钮,可以修改敏感列的脱敏算法。
删除敏感列
在 敏感数据 列表中,单击操作项下的 删除 按钮,可以删除敏感列。
识别规则管理
识别规则是敏感数据管理能力的扩展。在手动添加敏感列的基础上,通过自定义识别规则,可以实现敏感列的自动扫描发现。识别规则定义了匹配条件,ODC 会将符合匹配条件的数据列判定为敏感列。ODC 的识别规则提供 3 种方式供用户灵活选择,分别是路径、正则、脚本。
路径:以敏感列所属的库名、表名、列名作为识别对象,填写路径识别表达式作为识别规则。使用点号(.)分隔库表列名称;使用星号(*)作为通配符;使用逗号(,)多个匹配规则。
配置项
是否必填
说明
规则名称
是
识别规则的名称(长度不能超过 64 个字符)。
规则状态
是
识别规则的状态:启用/停用。
匹配的规则
是
用于将数据列匹配为敏感列的规则。
示例:*.*.mobile_phone 表示匹配任意库和表内,名为 mobile_phone 的列。
排除的规则
否
用于将数据列排除为敏感列的规则。
重要在判定数据列是否为敏感列时,优先使用排除的规则进行判断,其次使用匹配的规则。
脱敏算法
是
识别出的敏感列默认使用的脱敏算法。
规则描述
否
识别规则的描述。
正则:以敏感列所属的库名、表名、列名和列备注作为识别对象,填写正则表达式作为识别规则。
配置项
是否必填
说明
规则名称
是
识别规则的名称(长度不能超过 64 个字符)。
规则状态
是
识别规则的状态:启用/停用。
识别对象-库名
否
使用数据库名称匹配的正则表达式。
示例:
*
,表示任何名称的库。识别对象-表名
否
使用数据表名称匹配的正则表达式。
示例:
e[a-z]?.*
,表示以字母 e 开头的任何小写英文表名。识别对象-列名
否
使用列名称匹配的正则表达式。
识别对象-列备注
否
使用列备注匹配的正则表达式。
脱敏算法
是
识别出的敏感列默认使用的脱敏算法。
规则描述
否
识别规则的描述。
脚本:以敏感列所属的库名、表名、列名、列备注和数据类型作为识别对象,填写 Groovy 脚本作为识别规则。
重要脚本的输出必须为布尔值,即
True
或者False
。配置项
是否必填
说明
规则名称
是
识别规则的名称(长度不能超过 64 个字符)。
规则状态
是
识别规则的状态:启用/停用。
Groovy 脚本
是
判断是否为敏感列的符合 Groovy 语法规范的脚本。
脱敏算法
否
识别出的敏感列默认使用的脱敏算法。
规则描述
否
识别规则的描述。
ODC 内置了名为 column 的对象供用户在 Groovy 脚本中引用,对象中的属性和说明如下:
属性
类型
说明
schema
String
列所属的库名。
table
String
列所属的表名。
name
String
列的名称。
comment
String
列的备注。
type
String
列的数据类型。
常用脚本识别规则的示例:
地址
if (("varchar".equals(column.type) || "char".equals(column.type))) {
if (column.name.indexOf("address") >= 0) {
return true;
}
if (column.comment != null &&
(column.comment.toLowerCase().indexOf("address") >= 0
|| column.comment.indexOf("地址") >= 0
|| column.comment.indexOf("住址") >= 0
|| column.comment.indexOf("位置") >= 0)) {
return true;
}
}
return false;
手机号
if (column.name.length() == 11 && ("varchar".equals(column.type) || "char".equals(column.type))) {
if (column.name.indexOf("phone") >= 0 || column.name.indexOf("mobile") >= 0) {
return true;
}
if (column.comment != null &&
(column.comment.toLowerCase().indexOf("phone") >= 0
|| column.comment.indexOf("电话") >= 0
|| column.comment.indexOf("mobile") >= 0
|| column.comment.indexOf("手机") >= 0)) {
return true;
}
}
return false;
身份证号码
if (column.name.length() >= 15 && ("varchar".equals(column.type) || "char".equals(column.type))) {
if (column.name.indexOf("id_number") >= 0 || column.name.indexOf("identity_card") >= 0) {
return true;
}
if (column.comment != null &&
(column.comment.toLowerCase().indexOf("identity card") >= 0
|| column.comment.indexOf("身份证") >= 0)) {
return true;
}
}
return false;
添加识别规则
示例:管理员通过添加数据库 odc_test 中表 employee 的列 name 的识别规则。
在项目协同窗口,单击 项目 > 敏感列 > 添加敏感列 > 扫描添加。
在 扫描添加敏感列 页面中,选择 识别规则 > 管理识别规则。
在 管理识别规则 页面中,单击 新建识别规则。
在 新建识别规则 页面中,填写或选择规则名称、规则状态、识别方式和脱敏算法后,单击新建。
路径示例:
odc_test*.employee.*a,*.*.name
,表示匹配数据库 odc_test 中表 employee 的列 name。在 识别规则 列表中可以查看和启用添加的识别规则。
管理识别规则
如上图所示,单击操作项下的 编辑/删除 按钮,可以修改/删除识别规则。
查看脱敏算法
您可以在项目协同窗口的安全规范>脱敏算法中查看 ODC 支持的脱敏算法。
ODC 支持的脱敏算法包括:
算法名称 | 测试数据 | 结果预览 |
全部遮掩(系统默认) | test value | ***** |
个人姓名(汉字类型) | 个人姓名 | **名 |
个人姓名(字母类型) | Personal Name | P** |
昵称 | Nickname | N***e |
邮箱 | ***@oceanbase.com | ***@oceanbase.com |
地址 | Hangzhou, Zhejiang Province, China | Hangzhou, Z*** |
手机号码 | 1350000**** | 135******00 |
固定电话 | 010-12345678 | **********78 |
证件号码 | 123456789 | 1*******9 |
银行卡号 | 1234 5678 5678 1234 | ***************1234 |
车牌号 | 浙AB1234 | 浙A**234 |
设备唯一识别号 | AB123456789CD | ****89CD |
IP 地址 | 10.123.456.789 | 10...* |
MAC 地址 | ab:cd:ef:gh:hi:jk | ab:*:*:*:*:* |
MD5 | default | c21f969b5f03d33d43e04f8f136e7682 |
SHA256 | default | 37a8eec1ce19687d132fe29051dca629d164e2c4958ba141d5f4133a33f0688f |
SHA512 | default | 1625cdb75d25d9f699fd2779f44095b6e320767f606f095eb7edab5581e9e3441adbb0d628832f7dc4574a77a382973ce22911b7e4df2a9d2c693826bbd125bc |
SM3 | default | 40c357923156504f734717d8b4f5623e75209e9572701f4b51ef2a03d9ced863 |
数值取整 | 123.456 | 123 |
置空 | default | - |
缺省规则 | abcd1234 | abc**234 |
使用场景
添加的敏感列在导出、数据库变更和 SQL 窗口执行均生效。
场景一:导出数据时开启数据脱敏
示例:导出数据库 odc_test 中的表 student 时,会自动开启数据脱敏。
在 SQL 开发窗口的左侧导航栏中,通过工单导出结构和数据表 student 后,在导出列表中的操作中,单击 查看。
在导出任务详情页面的右下角,单击 下载。
在本地磁盘中查看下载的表 student。
场景二:数据库变更
示例:插入数据到表 student 中,会自动开启数据脱敏。
在 SQL 开发窗口的左侧导航栏中,通过工单新建数据库变更,插入数据到表 student 中。
在 SQL 开发窗口的左侧导航栏的中查看数据库 odc_test 中 student 脱敏后的数据。
场景三:SQL 窗口执行语句
示例:插入数据到表 student 中,会自动开启数据脱敏。
在 SQL 窗口中,编辑 SQL 语句,插入数据到表 student 中。
在结果页签中可以查看表 student 中脱敏后的数据。