Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1745555
  • 博文数量: 107
  • 博客积分: 1715
  • 博客等级: 上尉
  • 技术积分: 3168
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-18 18:42
个人简介

阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736

文章分类

全部博文(107)

文章存档

2014年(2)

2013年(38)

2012年(67)

分类: Mysql/postgreSQL

2012-09-27 22:19:05

1 目的

       由于开发频繁请求数据,且请求数据包含用户的重要信息。为了用户信息的保密,需要对敏感的信息进行过滤。之前的处理方法是:DBA将需要的线上数据导出后,首先在临时环境下将数据恢复,然后根据过滤规则将数据进行修改,再将数据导出并发送给开发,最后清理临时环境。整个过程中,中间处理过程占据了大量的时间和空间资源。

       为了简化该处理过程,使得DBA在导出线上数据后,即为过滤后的目标数据。基于该目的,修改mysqldump源码,增加过滤敏感信息功能,从而简化数据请求流程。

2 设计思路

       mysqlfilter的敏感信息过滤主要设计思路:依据mysqldumpwhere条件的设计思想,从而过滤查询条件的方式,获取所需条件的数据内容。由此,在mysqldump中增加sets条件,通过将敏感字段的列出,用逗号分割,从而过滤掉敏感信息。此外,在mysqldump中添加rule条件,通过配置文件方式,将大量过滤条件通过配置文件,按照一定的规则,进行过滤处理。

       sets条件的针对过滤条件比较简单的过滤方式,主要对少量比较特殊的条件进行过滤。而rule条件主要针对当dump大量库或表时,对多个表中的多个字段进行敏感数据过滤时,可以通过在规则文件中指定。

       为了不影响现有的mysqldump导入/导出工具,将新的工具定义为mysqlfilter,使用方式同mysqldump一致,只是额外增加setsrule参数。

3 详细设计

       根据设计思路,将详细设计的过程分为两个方面:修改源码和增加代码。修改源码主要是对现有的mysqldump.c源码文件进行修改,使其处理增加的规则。代码增加部分主要包括过滤条件的存储设计,以及对过滤条件的相关操作。以下对这两个方面进行详细的设计。

3.1代码增加

       代码增加部分包括三个部分:过滤条件的存储结构、过滤条件的相关操作、过滤规则文件解析。

3.1.1 存储结构

       根据数据库、表和字段三级关系,将存储结构设计为链式队列。这是由于多个库之间以队列的方式进行存储,通过队列头可以遍历整个队列。并且每个库有多个表,多个表之间也是队列关系,每个库存储指向表队列头的指针。依次,每个表中存储一个指向多个字段和替换值的队列头的指针。通过这种链式结构,可以定位具体的过滤信息。

       具体设计如下:

       敏感字段结构体(sensitive_field),主要包括字段(key)、替换字段的值(value)、以及指向下一个字段的指针(next)。此外,定义敏感字段队列头结构体(sensitive_field_head),有两个指针,分别指向敏感字段队列的头(tqh_first)和尾(tqh_last)。具体的关系如下图1所示。

 

图1 敏感字段结构

 

       敏感表结构体(sensitive_table),包括表名(tb_name)和指向敏感字段队列头的指针(field_lists)。敏感表队列头结构体(sensitive_table_head)同sensitive_field_head设计,分别指向敏感表队列的头和尾。具体的关系如下图2所示。

 

2 敏感表结构

 

       敏感库结构体(sensitive_db)类似sensitive_table的设计,包括库名(db_name)和指向敏感表队列头的指针(table_lists)。敏感库队列头结构体(sensitive_db_head)同sensitive_field_head设计,分别指向敏感库队列的头和尾。具体的关系如图3所示。

 

3 敏感库结构

      

 

       根据以上结构体的设计,忽略具体的字段,仅仅关注结构的关系。整个数据结构关系布局如下所示:

 

 

 

3.1.2 过滤条件相关操作

       过滤条件的相关操作,首先是对于队列的通用操作,其次是根据以上结构,对敏感字段、敏感表以及敏感的库进行初始化节点、查找节点、增加节点、删除节点、清除节点、析构节点等一些列操作。

3.1.3 过滤规则文件解析

       过滤规则文件解析,主要对通过flex来解析规则文件,然后通过bison执行响应的操作。该部分代码主要是关于规则制定的部分,需要熟悉flex规则和bison语法解析。具体原理和过程参考相关文档。

3.2源码修改

       源码的修改主要涉及增加参数选项、参数选项处理、修改dump处理流程以及。

3.2.1 添加参数选项

       my_long_options中添加setsrule选项。增加的选项需要定义相应的全局变量,用于获取输入参数的值。添加细节参考where参数选项的过程。

3.2.2 参数选项处理

       参数选项处理分别处理sets参数的输入值和rule参数输入的规则文件地址。其中sets参数的处理需要分解输入的替换策略,而rule参数的处理主要调用规则文件解析处理。

3.2.3 修改dump处理流程

       dump的处理流程是通过查询select * from table的方式进行查询,然后获取查询出来的结果,组合成对应的插入语句。修改过程主要是将“*”处理成对应字段,如果字段是敏感信息,用替换的信息代替字段。

4 编译安装

       源码下载地址sourceforge:

        github源码下载地址:git clone

       编译依赖mysql的源码,编译需要将过滤敏感信息相应的文件拷贝到mysql源码的client文件夹下。如果与源码文件冲突,则替换现有的源码文件。

       过滤敏感信息相应的文件主要有:filter.hfilter.cfilter_parser.yfilter_lex.lmysqlfilter.c。此外,还包括filter_lex.l生成的lex.yy.cfilter_parser.y生成的filter_parser.hfilter_parser.c文件。生成的文件可以通过相应的工具自己生成。

4.1 生成词法语法文件

生成词法解析文件lex.yy.c

 

flex  filter_lex.l

 

       生成语法解析文件filter_parser.hfilter_parser.c

 

bison  -bfilter –ofilter_parser.c -d filter_parser.y

 

4.2 源码编译、安装

       源码编译同mysql源码编译、安装通之前一样,没有任何区别。安装完成后,在安装目录bin下,有mysqlfilter可执行程序,表明安装成功。

总结

       mysqlfilter是基于mysqldump,增加setsrule两个参数,对敏感信息过滤,可以有效的提高DBA的处理效率,缩短DBA和开发需求之间的时间差。由于该工具仍然处于测试阶段,目前还没有对所有的函数进行测试。因此,该工具如果有什么问题,希望积极提出,进一步改进。

 

阅读(5153) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~