使用ProxySQL做数据库审计

2017/08/24 posted in  ProxySQL
Tags: 

为什么要使用中间件做审计

数据库审计是数据库运维中的一项重要手段,mysql的主流发行版本都提供有各种数据库审计的插件。

Oracle公司对MySQL企业版提供了官方的审计插件。

Mcafee公司也对MySQL提供了相应的审计插件

PerconaMariaDB也分别有官方提供的审计插件。

但是审计插件的使用会有一定的性能开销,并且也存着相应的风险。

但是如果我们使用了中间件后,在中间件中对MySQL做审计,则完全没有了这样的顾虑。

使用proxysql做审计

使用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)

这样,所有通过proxysqldelete操作都会记入日志

但是proxysql的日志时二进制格式的,我们需要通过proxysql提供的一个工具eventslog_reader_sample进行解析

但是我们安装的rpm包里并没有这个工具,我们需要单独下载并编译它

https://github.com/sysown/proxysql/tree/v1.4.2/tools 我们可以看到eventslog_reader_sample.cppMakefile文件

我们需要下载并make一下,就可以生成可用的工具了。

tips

我在编译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);

再进行编译,然后就可以用了。

以上。