使用ProxySQL做数据库审计
                                 2017/08/24
                                  posted in  
                                  
                                      ProxySQL
                                         
                                  
                                   
                                      
                                  
                                   
                                     
                                
                                 2017/08/24
                                  posted in  
                                  
                                      ProxySQL
                                         
                                  
                                   
                                      
                                  
                                   
                                     
                                
数据库审计是数据库运维中的一项重要手段,mysql的主流发行版本都提供有各种数据库审计的插件。
Oracle公司对MySQL企业版提供了官方的审计插件。
Mcafee公司也对MySQL提供了相应的审计插件。
但是审计插件的使用会有一定的性能开销,并且也存着相应的风险。
但是如果我们使用了中间件后,在中间件中对MySQL做审计,则完全没有了这样的顾虑。
使用proxysql做审计的思路很简单,在proxysql的转发规则中我们可以设置对指定规则记录日志。那么我们就可以对一些敏感操作进行审计。
首先,我们来创建一个存放日志的目录:
mkdir -p /data/ProxySQL/log
然后在ProxySQL中配置日志的地址
# 首先进入管理端口:
$ mysql -uadmin -padmin -h127.0.0.1 -P6032
# 然后设置变量,并加载和持久化:
set mysql-eventslog_filename = ‘/data/ProxySQL/log/sql.log’
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
在mysql_query_rules表中设置路由规则
# 记录所有delete操作
Insert into mysql_query_rules(rule_id,active,match_digest,log,apply) values(1000,1,’^delete’,1,1)
这样,所有通过proxysql的delete操作都会记入日志
但是proxysql的日志时二进制格式的,我们需要通过proxysql提供的一个工具eventslog_reader_sample进行解析
但是我们安装的rpm包里并没有这个工具,我们需要单独下载并编译它
在 https://github.com/sysown/proxysql/tree/v1.4.2/tools 我们可以看到eventslog_reader_sample.cpp和Makefile文件
我们需要下载并make一下,就可以生成可用的工具了。
我在编译eventslog_reader_sample的时候遇到了一些问题,在编译好以后使用eventslog_reader_sample解析二进制log时会报错
这可能和proxysql的版本有关系,在eventslog_reader_sample执行时会判断log文件的第一个字节是否为0x00,而我输出的log都是以0x81开头的。所以总会报错。
解决的方法是修改cpp文件,我直接将99-105行的判断
switch (et) {
  case PROXYSQL_QUERY:
    read_query(f);
    break;
  default:
    break;
}
给去掉了,直接改成了
read_query(f);
再进行编译,然后就可以用了。
以上。