写点什么

关于 TiDB 数据脱敏的一些想法

  • 2022 年 7 月 11 日
  • 本文字数:2503 字

    阅读完需:约 8 分钟

作者: pupillord 原文来源:https://tidb.net/blog/097c74b2


【是否原创】是


【首发渠道】TiDB 社区


【正文】

关于 TiDB 数据脱敏

数据库安全一直都是用户十分关注的点,尤其在一些核心系统与特殊领域之中,当掌握了一定规模的敏感数据后,就需要时刻避免数据的泄露和丢失,所以对于数据库的管理和使用都有着杂繁琐的流程和复杂的权限,这其中就有一个重要的安全技术 — 数据脱敏。

数据脱敏

数据脱敏是指对于数据库中存储的一些敏感信息进行规则的改造,保护敏感数据不会被随意的读取和泄露。像身份证,手机号,银行卡号等敏感信息,都会进行数据脱敏,所以我们比较常见的就是数据掩码,用*字符号来代替中间的数据。


比如电话号码 123456789 经过脱敏变为 123******6789.


在如今,我们经常都能看到各种数据泄露,用户数据被卖等相关新闻,数据安全和网络安全也是我们越来越重视的一面。国家现在也是不断的出台各种政策,要求相关企业做好数据的保护与脱敏,尤其是一些海外企业,对于数据的管理会更加严格。


而作为一名数据库工程师,靠着数据库近的人,更是需要去了解和重视数据脱敏这项技术。

脱敏方式

关于数据脱敏的方式大概有两种,静态脱敏和动态脱敏。

静态脱敏

对于静态脱敏其实非常好理解,就是在已知数据的结构和需要脱敏的内容后,通过一些脱敏算法对于这些数据进行一定的处理,转换成其他的数据形式。


静态脱敏往往需要将数据先从数据库中提取出来,然后放到已经实现脱敏算法的工具中进行批量的转换,最后将脱敏后的数据放到其他需要的地方。那么这种方式不需要与应用或者是数据库建立直接的联系,单纯的数据处理。

动态脱敏

动态脱敏则是实时的分析查询的数据是否存在需要脱敏的内容,如果存在则将数据通过不同的脱敏算法进行脱敏后返回到应用端。


所以现在动态脱敏的实现往往都是建立一个代理层,放在应用和数据库之间,拦截查询的 SQL 或者是返回的数据结果集,进行检索和判断,是否存在敏感信息,敏感信息的类型如何,如果存在,就使用相应的脱敏算法对于 SQL 进行改造,或者直接将结果集进行改造后返回。两种方法都存在。

数据脱敏平台

现在世面上的数据脱敏平台还是挺多的,其实我们也有一款自己的数据动态脱敏平台产品 - TDMP,最近也是用 TiDB 集群进行了功能测试,平台支持的功能在 TiDB 上都能正常使用。


当然这也是在我们的预料之中,不得不说因为 TiDB 对于 MySQL 的完全兼容,让很多对接 MySQL 的工具都能在 TiDB 上去直接使用。

技术实现

TDMP 脱敏的整体实现思路简单介绍:


  1. TDMP-DM 使用作为反向代理技术,部署在运维工具、应用及数据库之间。

  2. 当用户执行的查询语句进来时,会通过执行的用户权限和执行语句进行检查,是否存在敏感信息的查询,执行用户是否有权查看敏感信息。

  3. 如果触发的脱敏条件,则会从两种方式中选择一种进行脱敏,一是直接改写 SQL 语句,二是将查询的结果集进行修改。具体选择那种方式和那种脱敏算法,则要通过用户的配置,查询结果的大小,性能的评估等来决定。

  4. 最后将脱敏后的数据返回给用户或者应用端。


咋的一看,整个实现思路还挺简单,但是实际去实现 SQL 的检验,脱敏算法和选择优化时,整个实现难度还是比较高的,尤其是在 SQL 检测这一边,干多了运维的都懂,大千世界,什么样的 SQL 都有,想要去写一个通用的检测算法,比较麻烦点。


在脱敏核心这块的实现其实有点类似与数据库 SQL 解析层的处理,也就是 TiDB Server 的模式:


  1. 对于用户查询的 SQL 进行 Parse 解析,解析成一个我们自定义的树结构体,和抽象语法树非常的像。

  2. 基于规则的审核,判断一个查询是否要进行脱敏,或者需要进行那些脱敏操作,我们会建立一个规则列表(包括用户权限,用户配置的规则和自带的一系列检测),遍历这个规则列表,判断每一个是否需要在该次查询中使用到,如果可以用到则需要进行记录。

  3. 基于物理的优化,其实做一个数据库中间件去进行数据脱敏,对于数据库的查询性能会有很大的影响,因为这一类的操作是要具体到数据中去修改的,所以在真正的去执行某一个脱敏的方式时,除开用户的配置,我们也会进行一定的优化,通过判断本次查询的数据大小和查询复杂程度等来优化。


整个过程是不是非常的像 TiDB Server 对于 SQL 的处理:


SQL - > Parser -> RBO -> CBO -> Executor


关于 TDMP 这个平台的详细信息可以看下官网介绍 这里就不做过多的介绍了

关于 TiDB 的一些想法

脱敏函数

上面介绍过脱敏实现的简单思路,其实和 TiDB Server 中 SQL 的执行过程非常相似。所以现在有一个想法,就是直接在 TiDB Server 中添加一个简单的脱敏功能,可以是一个脱敏函数。



select id data_mask(name, '*') data_mask(phone,'·') from student;
复制代码


返回的结果:


| id | name | phone |


|—-|——|———-|


| 1 | J**k |123····999|


| 2 | C**l |156····888|



select id data_change(name) data_change(phone) from student;
复制代码


返回的结果:


| id | name | phone |


|—-|——|———-|


| 1 | sdan |5486446468|


| 2 | wnru |6848789786|

敏感字段声明

除了增加这种类似的数据脱敏函数以外,也可以增加权限相关的脱敏策略。例如可以在建立数据字段的时候添加关键字sensitive来声明该字段为敏感信息,普通数据库用户在查看的时候,该字段会进行自动的脱敏。



create table student(
id int,
name varchar(255) sensitive,
phone int sensitive,
primary key(id)
)
复制代码

TiDB 脱敏扩展工具

虽然现在有着各种各样的脱敏平台使用,但是他们都太过于重了,使用起来会非常的麻烦,需要交钱部署等等一套,这种一般用于大企业,有钱的公司。但是对于一些小的企业公司,也许只需要一个简单的脱敏功能就够了,这个时候他更需要的只是一个脱敏的小工具来帮助他。


类似 PostgreSQL 中的 Extension,只需要执行一行命令,下载一个扩展工具就可以在 TiDB 中使用简单的脱敏功能。所以我们最近也在考虑将 TDMP 平台中的脱敏功能,单独抽出来并进行简化,然后做成一个非常简单易用的小工具。


说到 Extension 功能,TiDB 作为一款开源数据库,其实是非常需要去提供一些固定的接口,来让社区的人可以开发一些小的功能组件作为扩展,不仅可以帮助 TiDB 本身的生态发展,同时也能让更多的开发人员可以加入进来,社区也会更加丰富和活跃。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
关于TiDB数据脱敏的一些想法_实践案例_TiDB 社区干货传送门_InfoQ写作社区