mysql binlog跟踪_在MySQL中使用init-connect与binlog来实现用户操作追踪记录

本文介绍了如何利用MySQL的init-connect配置和binlog功能,追踪并记录用户操作。当测试环境中出现数据误删问题时,通过这种方法可以获取登录信息、操作时间和用户详情。首先创建一个记录访问信息的access_log库和表,然后在配置文件中设置init-connect参数,记录登录信息。接着创建普通用户,并授予相应权限。在遇到权限问题时,及时调整权限设置,确保用户可以成功登录并记录操作。最后,通过binlog跟踪用户行为,结合thread_id,可以追溯到具体操作。
摘要由CSDN通过智能技术生成

在MySQL中使用init-connect与binlog来实现用户操作追踪记录

分类: MySQL

前言:

测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化,我们可以在这里获取用户的登录名称和thread的ID值。然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人以及客户端的连接进程信息等。实现审计。1,在mysql服务器db中建立单独的记录访问信息的库setnames utf8;

create database access_log;

CREATE TABLE `access_log`

(

`id`int(11) NOT NULL AUTO_INCREMENT,

`thread_id`int(11) DEFAULT NULL, --线程ID,这个值很重要

`log_time` timestamp NOT NULL DEF AULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,--登录时间

`localname` varchar(30) DEFAULT NULL, --登录名称

`matchname` varchar(30) DEFAULT NULL, --登录用户

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 comment '录入用户登录信息';2,在配置文件中配置init-connect参数。登录时插入日志表。如果这个参数是个错误的SQL语句,登录就会失败。

vim/usr/local/mysql/my.cnf

init-connect='INSERT INTO access_log.access_log VALUES(NULL,CONNECTION_ID(),NOW(),USER(),CURRENT_USER());'然后重启数据库3,创建普通用户,不能有super权限,而且用户必须有对access_log库的access_log表的insert权限,否则会登录失败。

给登录用户赋予insert权限,但是不赋予access_log的insert、select权限,

GRANT INSERT,DELETE,UPDATE,SELECT ON test.* TO audit_user@'%' IDENTIFIED BY 'cacti_user1603';

mysql> GRANT CREATE,DROP,ALTER,INSERT,DELETE,UPDATE,SELECT ON test.* TO audit_user@'%' IDENTIFIED BY 'cacti_user1603';

Query OK,0 rows affected (0.00sec)

mysql>exit

然后去用新的audit_user登录操作

[root@db_server~]# /usr/local/mysql/bin/mysql -uaudit_user -p -S /usr/local/mysql/mysql.sock

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection idis 25Server version:5.6.12-log

Copyright (c)2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracleis a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type'help;' or '\h' for help. Type '\c'to clear the current input statement.

mysql> lect * fromaccess_log.access_log;

ERROR2006(HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:26Current database:*** NONE ***ERROR1184 (08S01): Aborted connection 26 to db: 'unconnected' user: 'audit_user' host: 'localhost'(init_connect command failed)

mysql>看到报错信息 (init_connect command failed),再去错误日志error log验证一下:

tail-fn 5 /usr/local/mysql/mysqld.log2014-07-28 16:03:31 23743 [Warning] Aborted connection 25 to db: 'unconnected' user: 'audit_user' host: 'localhost'(init_connect command failed)2014-07-28 16:03:31 23743 [Warning] INSERT command denied to user ''@'localhost' for table 'access_log'

2014-07-28 16:04:04 23743 [Warning] Aborted connection 26 to db: 'unconnected' user: 'audit_user' host: 'localhost'(init_connect command failed)2014-07-28 16:04:04 23743 [Warning] INSERT command denied to user ''@'localhost' for table 'access_log'看到必须要有对access_log库的access_log表的insert权限才行。4,赋予用户access_log的insert、select权限,然后重新赋予权限:

GRANT SELECT,INSERT ON access_log.* TO audit_user@'%';

mysql>mysql> GRANT SELECT,INSERT ON access_log.* TO audit_user@'%';

Query OK,0 rows affected (0.00sec)

mysql>exit

Bye

再登录,报错如下:

[root@db_server~]# /usr/local/mysql/bin/mysql -uaudit_user -p -S /usr/local/mysql/mysql.sock

Enter password:

ERROR1045 (28000): Access denied for user 'audit_user'@'localhost' (usingpassword: YES)

[root@db_server~]#

去查看error日志:2014-07-28 16:15:29 23743 [Warning] INSERT command denied to user ''@'localhost' for table 'access_log'

2014-07-28 16:15:41 23743 [Warning] Aborted connection 37 to db: 'unconnected' user: 'audit_user' host: 'localhost'(init_connect command failed)2014-07-28 16:15:41 23743 [Warning] INSERT command denied to user ''@'localhost' for table 'access_log'

2014-07-28 16:15:50 23743 [Warning] Aborted connection 38 to db: 'unconnected' user: 'audit_user' host: 'localhost'(init_connect command failed)2014-07-28 16:15:50 23743 [Warning] INSERT command denied to user ''@'localhost' for table 'access_log'需要用root用户登录进去,清空掉用户为''的用户记录。

mysql> select user,host,password frommysql.user;+----------------+-----------+-------------------------------------------+

| user | host | password |

+----------------+-----------+-------------------------------------------+

| root | localhost | |

| root | db_server | |

| root | 127.0.0.1 | |

| root | ::1 | |

| | localhost | |

| | db_server | |

| cacti_user | % | *EB9E3195E443D577879101A35EF64A701B35F949 |

| cacti_user | 1 | *D5FF9B53A78232DA13D3643965A5961449B387DB |

| cacti_user | 2 | *D5FF9B53A78232DA13D3643965A5961449B387DB |

| test_user | 192.% | *8A447777509932F0ED07ADB033562027D95A0F17 |

| test_user | 1 | *8A447777509932F0ED07ADB033562027D95A0F17 |

| weakpwd_user_1 | 10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

| weakpwd_user_2 | 10.% | *B1461C9C68AFA1129A5F968C343636192A084ADB |

| weakpwd_user_3 | 10.% | *DCB7DF5FFC82C441503300FFF165257BC551A598 |

| audit_user | % | *AEAB1915B137FAFDE9B949D67A9A42DDB68DD8A2 |

+----------------+-----------+-------------------------------------------+

15 rows in set (0.00sec)

mysql> drop user ''@'localhost';

Query OK,0 rows affected (0.00sec)

mysql> drop user ''@'db_server';

Query OK,0 rows affected (0.00sec)

mysql>再用已经分配了access_log表的Insert权限的audit_user登录

mysql> select * fromaccess_log.access_log;+----+-----------+---------------------+---------------------------+--------------+

| id | thread_id | log_time | localname | matchname |

+----+-----------+---------------------+---------------------------+--------------+

| 4 | 41 | 2014-07-28 16:19:37 | audit_user@localhost | audit_user@% |

| 5 | 42 | 2014-07-28 16:20:32 | audit_user@localhost | audit_user@% |

| 6 | 45 | 2014-07-28 16:21:11 | audit_user@localhost | audit_user@% |

+----+-----------+---------------------+---------------------------+--------------+

6 rows in set (0.00sec)

mysql>show full processlist;+----+------------+-----------+------+---------+------+-------+-----------------------+

| Id | User | Host | db | Command | Time | State | Info |

+----+------------+-----------+------+---------+------+-------+-----------------------+

| 45 | audit_user | localhost | NULL | Query | 0 | init | show full processlist |

+----+------------+-----------+------+---------+------+-------+-----------------------+

1 row in set (0.00sec)

mysql>

5,再用另外一个用户登录建表,录入测试数据。

建表录入数据记录

mysql>use test;

Database changed

mysql> create table t1 select 1 as a, 'wa' asb;

Query OK,1 row affected (0.01sec)

Records:1 Duplicates: 0 Warnings: 0查看跟踪用户行为记录。

mysql> select * fromaccess_log.access_log;+----+-----------+---------------------+---------------------------+--------------+

| id | thread_id | log_time | localname | matchname |

+----+-----------+---------------------+---------------------------+--------------+

| 4 | 41 | 2014-07-28 16:19:37 | audit_user@localhost | audit_user@% |

| 5 | 42 | 2014-07-28 16:20:32 | audit_user@localhost | audit_user@% |

| 6 | 45 | 2014-07-28 16:21:11 | audit_user@localhost | audit_user@% |

| 7 | 48 | 2014-07-28 16:30:42 | audit_user@192.168.3.62 | audit_user@% |

| 8 | 50 | 2014-07-28 16:46:11 | audit_user@192.168.3.62 | audit_user@% |

+----+-----------+---------------------+---------------------------+--------------+

8 rows in set (0.00sec)

去mysql db服务器上查看binlog 内容,解析完后,没有insert语句,怎么回事,去看my.cnf

#binlog-ignore-db=mysql # No sync databases

#binlog-ignore-db=test # No sync databases

#binlog-ignore-db=information_schema # No sync databases

#binlog-ignore-db=performance_schema

原来是对test库有binlog过滤设置,全部注释掉。重启mysql库,重新来一遍,可以在看到binlog

在MySQL客户端上重新执行。

mysql>use test;

Database changed

mysql> insert into test.t1 select 5,'t5';

Query OK,1 row affected (0.00sec)

Records:1 Duplicates: 0 Warnings: 0mysql> select * fromaccess_log.access_log;+----+-----------+---------------------+---------------------------+--------------+

| id | thread_id | log_time | localname | matchname |

+----+-----------+---------------------+---------------------------+--------------+

| 1 | 17 | 2014-07-28 15:41:04 | cacti_user@192.168.171.71 | cacti_user@% |

| 2 | 18 | 2014-07-28 15:41:05 | cacti_user@192.168.171.71 | cacti_user@% |

| 3 | 19 | 2014-07-28 15:41:05 | cacti_user@192.168.171.71 | cacti_user@% |

| 4 | 41 | 2014-07-28 16:19:37 | audit_user@localhost | audit_user@% |

| 5 | 42 | 2014-07-28 16:20:32 | audit_user@localhost | audit_user@% |

| 6 | 45 | 2014-07-28 16:21:11 | audit_user@localhost | audit_user@% |

| 7 | 48 | 2014-07-28 16:30:42 | audit_user@192.168.3.62 | audit_user@% |

| 8 | 50 | 2014-07-28 16:46:11 | audit_user@192.168.3.62 | audit_user@% |

| 9 | 56 | 2014-07-28 19:32:12 | audit_user@192.168.1.12 | audit_user@% |

| 10 | 1 | 2014-07-28 20:02:56 | audit_user@192.168.3.62 | audit_user@% |

+----+-----------+---------------------+---------------------------+--------------+

10 rows in set (0.00sec)

看到thread_id为16,如何查看何跟踪用户行为记录。

去mysql数据库服务器上查看binlog,应该thread_id=1的binlog记录。

[root@db_server binlog]#/usr/local/mysql/bin/mysqlbinlog --base64-output=DECODE-ROWS mysql-bin.000018 -v>3.log

[root@db_server binlog]# vim3.log

# at1103#140728 20:12:48 server id 72 end_log_pos 1175 CRC32 0xa323c00e Query thread_id=1 exec_time=0 error_code=0SET TIMESTAMP=1406549568/*!*/;

BEGIN/*!*/;

# at1175#140728 20:12:48 server id 72 end_log_pos 1229 CRC32 0xbb8ca914 Table_map: `access_log`.`t1` mapped to number 72# at1229#140728 20:12:48 server id 72 end_log_pos 1272 CRC32 0x8eed1450 Write_rows: table id 72flags: STMT_END_F

### INSERT INTO `access_log`.`t1`

### SET

### @1=10### @2='w0'# at1272#140728 20:12:48 server id 72 end_log_pos 1303 CRC32 0x72b26336 Xid = 14COMMIT/*!*/;

看到thread_id=1,然后,就可以根据thread_id=1来判断执行这条insert命令的来源,还可以在mysql服务器上执行show full processlist;来得到MySQL客户端的请求端口,

mysql>show full processlist;+----+------------+-------------------+------+---------+------+-------+-----------------------+

| Id | User | Host | db | Command | Time | State | Info |

+----+------------+-------------------+------+---------+------+-------+-----------------------+

| 1 | audit_user | 192.168.3.62:44657 | test | Sleep | 162 | | NULL |

| 3 | root | localhost | NULL | Query | 0 | init | show full processlist |

+----+------------+-------------------+------+---------+------+-------+-----------------------+

2 rows in set (0.00sec)

mysql>看到Id为1的线程,端口是44657。

我们切换回mysql客户端,去查看端口是44657的是什么进程,如下所示:

[tim@db_client~]$ netstat -antlp |grep 44657(Not all processes could be identified, non-owned process info

will not be shown, you would have to be root to see it all.)

tcp0 0 192.168.3.62:44657 192.168.1.12:3307 ESTABLISHED 6335/mysql

[tim@db_client~]$

获取到该进程的PID6335,再通过ps -eaf得到该进程所执行的命令,如下所示:

[tim@db_client~]$ ps -eaf|grep 6335tim6335 25497 0 19:59 pts/1 00:00:00 mysql -uaudit_user -p -h 192.168.1.12 -P3307

tim6993 6906 0 20:16 pts/2 00:00:00 grep 6335[tim@db_client~]$

最后查到是通过mysql客户端登陆连接的。加入这个6335是某个web工程的,那么,也可以根据ps-eaf命令查询得到web工程的进程信息。

参考文章地址:http://blog.chinaunix.net/uid-24086995-id-168445.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值