您的位置:首页 > 数据库 > MySQL

使用MySQL init_connect功能做SQL审计

2017-08-19 16:47 519 查看
MySQL的audit插件是一个比较实用的第三方MySQL插件,它可以实现MySQL的SQL审计通过json的格式记录在文件中,需要可以参看:http://jim123.blog.51cto.com/4763600/1955487,当然比较遗憾的是目前macfee公司只用做Unix/Linux系统下的插件,如果是在DOS系统(Windows)中使用MySQL就没有audit插件了,所以如果不使用audit插件来实现MySQL的SQL审计时就需要使用init_connect和MySQL的binlog来实现MySQL的SQL审计。init_connect的功能是表示非super用户下在客户端连接上MySQL时隐式执行的一条自定义的SQL语句,所以在使用init_connect功能时常常用于记录一些关键信息在数据库中,然后根据这些相应的关键信息去查找MySQL的binlog日志,所以在使用init_connect的功能时也要确保MySQL的binlog日志记录功能开启。默认缺省下init_connect参数的值是空,即什么都不做:
mysql> show variables like 'init_connect';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| init_connect  |       |
+---------------+-------+
1 row in set (0.01 sec)
在这里需要注意的有两点:1、配置init_connect参数时必须使用super用户来配置,普通用户是没有相应的权限的;2、init_connect参数中的隐式执行的SQL只针对普通用户对super用户来说无效,所以在平时在使用MySQL的过程中就应该区分管理好MySQL的账户权限。
配置MySQL的init_connect参数也很简单,操作方法如下:
mysql> create database db_monitor default CHARACTER SET utf8;#根据实际情况使用相应的字符集
Query OK, 1 row affected (0.00 sec)

mysql> use db_monitor;
Database changed
mysql> CREATE TABLE accesslog (
-> thread_id INT (11) DEFAULT NULL,
-> #线程id
-> log_time datetime DEFAULT NULL,
-> #登录时间
-> localname VARCHAR (50) DEFAULT NULL,
-> #登录名称,带详细ip
-> matchname VARCHAR (50) DEFAULT NULL,
-> #登录用户
-> KEY idx_log_time (log_time)
-> );
Query OK, 0 rows affected (0.04 sec)
在这里先建立好相应的数据库的库表用于记录init_connect参数配置下的SQL语句的信息。最后,在设置下init_connect中需要执行的SQL语句,这里需要注意这里的SQL语句一定不能写错,一旦写错会造成无法正常的登录MySQL:
mysql> set global init_connect='insert into db_monitor.accesslog(thread_id,log_time,localname,matchname) values(connection_id(),now(),user(),current_user())';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
在设置好后把相应的参数写入my.cnf或my.ini中,使下一次重启后MySQL时init_connect参数生效:
init_connect='insert into db_monitor.accesslog(thread_id,log_time,localname,matchname) values(connection_id(),now(),user(),current_user())'
最后在把需要审计SQL的用户授权对db_monitor.accesslog表的INSERT权限,这一点很重要,如果没有配置也会导致无法正常的连接MySQL服务器,就新建一个用户演示下:
mysql> GRANT INSERT on `db_monitor`.accesslog to 'username'@'%' identified by "youpassword";
在授权好后,需要检查下MySQL是否有开启binlog日志,这个在以前说MySQL的Replication时有说过,在这里就不做过多的赘述,需要可以参看:http://jim123.blog.51cto.com/4763600/1862808

mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

#如果没有开就开启后,再在my.cnf或my.ini配置文件中填如相应的配置参数,使下一次重启MySQL的后binlog设置不变,如:
log_bin=mysql-bin
log_bin_index=mysql-bin.index
expire_logs_days = 30
这样MySQL使用init_connect功能的SQL审计就做好了,在平时只需要查询db_monitor.accesslog表中的相应记录根据登录用户的线程ID再关联MySQL的binlog就可以实现对MySQL的SQL审计,当然使用这种方式实现的SQL审计效果当然不如使用audit插件来实现MySQL的SQL审计效果好,但是它的优点是对MySQL的性能影响小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL init binlog