MySQL之init_connect审计应用

一、演示环境说明:

2台内网dellR620 物理服务器测试。
系统都是 centos7.6 x86_64最小化安裝
关闭selinux 关闭iptables,二进制解压安装mysql5.7.30。而且要开启binglog 且为row格式。
2台机器内网地址已经演示环境角色如下:

192.168.1.217 创建mysql审计表,来审计此机器上的mysql服务用户登录信息
192.168.1.215 在此机器上通过用户xiaolaodi@'%' 远程登录 192.168.1.217 机器上的MySQL,进行模拟写入和删除操作

二、参数说明:

init_connect 是MySQL5.6引入的参数。
具体说明可以参考官网地址
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html

由测试得出init_connect='XXXXXXX' 是用户登录到数据库上之后,在执行第一次查询SQL之前执行'XXXXXXXX' 里面的内容的。
如果init_connect 的内容有语法错误,导致执行失败,会导致用户无法执行查询,从mysql 退出
需要注意的是:init_connect 对具有super 权限的用户是无效的。也就是说超级账户无视init_connect设置(即init_connect的设置对来自超级账户的连接不生效)
于是根据这个参数的功能,我们可以利用这个特性和binlog记录实践ID,审计所有普通用户在什么时间登录库,对库中的表做了什么事情

三、具体演示过程如下:

3.1、首先登陆需要审计的mysql,创建一张自己定义的可以记录登陆MySQL服务的用户和地址表mysql_acc_log

create table mysql_acc_log (id int (11) unsigned not null primary key auto_increment,
`thread_id` bigint COMMENT '线程ID',
`local_user`  varchar (30) not null default '' COMMENT '连接的ID用户+地址', 
`match_user`  varchar (30) not null default '' COMMENT '匹配到的用户ID',
`Logintime` datetime);

select connection_id(),user(),current_user(),now();

MySQL之init_connect审计应用

3.2在线动态设置init_connect参数内容:


mysql> set global init_connect='insert into test001.mysql_acc_log(thread_id,local_user,match_user,Logintime) values(connection_id(),user(),current_user(),now());';
Query OK, 0 rows affected (0.00 sec)
mysql> 

3.3 创建所有需要监控的账号,赋予所用需要监控的普通用户要对这张表拥有 insert 权限

提示注意:
此方法需要给数据库所有用户都对test001.mysql_acc_log授写权限,否则插入用户信息会失败;
不要授权 update 、delete 等权限,否则普通用户登录 MySQL 可以手动删除他连接的信息

为了模拟演示,新建一个普通权限的测试用户,并且可以对mysql_acc_log 这个表insert

grant insert on test001.mysql_acc_log to  xiaolaodi@'%';
grant all on test001.* to xiaolaodi@'%' identified by 'shueid*723she';flush privileges;
grant all on tudoudb.* to xiaolaodi@'%' identified by 'shueid*723she';flush privileges;

3.4##创建另外一张测试表,来随便插入几条数据。追查是谁删除了线上的MySQL库表中的记录数

 CREATE TABLE `test_event` (
`id` int(8) NOT NULL AUTO_INCREMENT, 
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`) #主键ID
) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

insert into test_event(username,password,create_time) values("李四","tomcat",now());

3.5创建测试表插入数据,并delete删除数据演示


[root@local-215 ~]#  mysql -uxiaolaodi -h 192.168.1.217 -p'shueid*723she'
xiaolaodi@mysqldb 22:35:  [(none)]> use tudoudb;
Database changed
xiaolaodi@mysqldb 22:35:  [tudoudb]>  insert into test_event(username,password,create_time) values("李四","tomcat",now());

192.168.1.215 机器查看表test001.mysql_acc_log记录:

mysql> select * from test001.mysql_acc_log;

MySQL之init_connect审计应用

继续写入:

xiaolaodi@mysqldb 22:37:  [tudoudb]>  insert into test_event(username,password,create_time) values("李四","tomcat",now());
Query OK, 1 row affected (0.01 sec)

xiaolaodi@mysqldb 22:42:  [tudoudb]> select * from  test_event;
+----+----------+----------+---------------------+
| id | username | password | create_time         |
+----+----------+----------+---------------------+
|  1 | 李四     | tomcat   | 2020-09-12 18:49:50 |
|  2 | 李四     | tomcat   | 2020-09-12 22:41:30 |
|  3 | 李四     | tomcat   | 2020-09-12 22:48:27 |
+----+----------+----------+---------------------+

xiaolaodi@mysqldb 22:43:  [tudoudb]> delete from  test_event where id=3;

3.6 、分析binglog日志,确定登录mysql服务的thread_id=5 执行的删除动作

[root@mysql02 ~]# mysqlbinlog -v --base64-output=decode-rows /data1/mysql/3306/binlog/mysql-bin.000016|grep -iC10 delete > audit.log

[root@mysql02 ~]# cat audit.log 
SET @@SESSION.GTID_NEXT= '5ec577a4-f401-11ea-bf6d-14187756553d:5446'/*!*/;
# at 1594
#200912 22:49:27 server id 12173306  end_log_pos 1669 CRC32 0x88105258  Query   thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1599922167/*!*/;
BEGIN
/*!*/;
# at 1669
# at 1727
#200912 22:49:27 server id 12173306  end_log_pos 1792 CRC32 0x6fbda508  Table_map: `tudoudb`.`test_event` mapped to number 116
# at 1792
#200912 22:49:27 server id 12173306  end_log_pos 1866 CRC32 0xbcfbe639  Delete_rows: table id 116 flags: STMT_END_F
### DELETE FROM `tudoudb`.`test_event`
### WHERE
###   @1=3
###   @2='李四'
###   @3='tomcat'
###   @4='2020-09-12 22:48:27'
# at 1866
#200912 22:49:27 server id 12173306  end_log_pos 1897 CRC32 0xc8ccf0e4  Xid = 129
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;

查看mysql审计表mysql_acc_log找到对应的线程id号


#200912 22:49:27 server id 12173306  end_log_pos 1669 CRC32 0x88105258  Query   thread_id=5 exec_time=0 error_code=0

thread_id=5 这个线程的登录用户它执行的删除动作

3.7、mysql_acc_log找到对应的线程id号确定当时操作的登录用户

可以看到线程 thread_id=5,并且时间也是200912 22:49:27左右。可以确定就是 xiaolaodi@'%' 用户操作的 delete 语句。

通过 local_user 字段可以看到是192.168.1.215 这个地址使用 xiaolaodi@'%' 用户连接的 MySQL 数据库。

猜你喜欢

转载自blog.51cto.com/wujianwei/2532492