MySQL审计之init-connect + binlog

init-connect是配置文件的一个参数,作用是在每个客户端连接时执行,我们需要有一个表来保存连接客户端的ID,IP和登录时间,ID是连接的session的ID号,是递增的。那么,当我们在binlog查出操作的SQL,并找到该记录的thread_id,然后将thread_id带入我们新建的表,根据ID来查出修改者的IP和时间。

1、创建用于存放连接信息的表

mysql> create database AuditDB default charset utf8;
mysql> use AuditDB;
mysql> create table accesslog (
  ID int primary key auto_increment,
  ConnectionID int, 
  ConnUser varchar(30), 
  MatchUser varchar(30), 
  LoginTime datetime
);

2、保证所有链接用户对此表有写入权限

mysql> insert into mysql.db (Host,Db,User,Insert_priv) values ('%','AuditDB','','Y');
Query OK, 1 row affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3、设置init-connect

在[mysqld]下添加以下设置:
#设置初始化连接操作
init-connect='Insert into AuditDB.accesslog(ConnectionID, ConnUser, MatchUser, LoginTime) values(connection_id(),user(),current_user(),now());'
#开启binlog
log-bin=xxx

4、重启数据库生效

shell> /etc/init.d/mysql restart

连接测试查询
mysql> select * from AuditDB.accesslog;
+----+--------------+--------------------+-----------------+---------------------+
| ID | ConnectionID | ConnUser           | MatchUser       | LoginTime           |
+----+--------------+--------------------+-----------------+---------------------+
|  1 |            1 | svoid@localhost    | svoid@localhost | 2015-04-24 14:16:18 |
|  2 |            3 | svoid@192.168.56.1 | svoid@%         | 2015-04-24 14:16:53 |
+----+--------------+--------------------+-----------------+---------------------+
2 rows in set (0.00 sec)


查找操作记录

1、 进行模拟操作,下列操作可由多个连接进行

mysql> use test;
Database changed

mysql> create table t (id int ,name varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t values(1,'a');
Query OK, 1 row affected (0.16 sec)

mysql> insert into t values(2,'b');
Query OK, 1 row affected (0.03 sec)

mysql> truncate table t ;
Query OK, 0 rows affected (0.03 sec)

2、根据binlog,确认操作truncate的thread_id

mysqlbinlog --start-datetime='2015-04-24 14:10:00' --stop-datetime='2015-04-24 14:25:00' /db/mysql/data/mysql_info.000007 | grep -B 5 truncate
# at 1223
#150424 14:23:36 server id 1  end_log_pos 1302     Query    thread_id=3    exec_time=0    error_code=0
SET TIMESTAMP=1429856616/*!*/;
/*!\C gbk *//*!*/;
SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=33/*!*/;
truncate table t

根据上面的提示可以看到操作的thread_id=3

3、确认操作的用户

mysql> select * from AuditDB.accesslog where ConnectionID=3;
+----+--------------+--------------------+-----------+---------------------+
| ID | ConnectionID | ConnUser           | MatchUser | LoginTime           |
+----+--------------+--------------------+-----------+---------------------+
|  2 |            3 | svoid@192.168.56.1 | svoid@%   | 2015-04-24 14:16:53 |
+----+--------------+--------------------+-----------+---------------------+
1 row in set (0.00 sec)


注意:

  1. init-connect 是不会在super用户登录时执行, 所以不要使用超级用户,不然你看不到任何信息。
  2. 理论上,用户每次连接时往数据库里插入一条记录,不会对数据库产生很大影响,考虑降低连接频率及accesslog插入效率优化。
  3. 对于所有的普通级别的用户,必须全部都要对日志表具有读写权限, 否则将导致,没有权限的用户无法使用数据库。
  4. 建议把记录表的引擎设置为archive,能极大的缩小空间。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值