一、演示环境说明:
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:///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();
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;
继续写入:
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 数据库。