作者:pupillord​

【是否原创】是 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 本身的生态发展,同时也能让更多的开发人员可以加入进来,社区也会更加丰富和活跃。