2台内网dellR620 物理服务器测试。
系统都是 centos7.6 x86_64最小化安裝
关闭selinux 关闭iptables,二进制解压安装mysql5.7.30。并且要开启binglog 且为row格式。
2台机器内网地址已经演示环境角色以下:html
192.168.1.217 建立mysql审计表,来审计此机器上的mysql服务用户登陆信息
192.168.1.215 在此机器上经过用户xiaolaodi@'%' 远程登陆 192.168.1.217 机器上的MySQL,进行模拟写入和删除操做mysql
init_connect 是MySQL5.6引入的参数。
具体说明能够参考官网地址
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.htmllinux
由测试得出init_connect='XXXXXXX' 是用户登陆到数据库上以后,在执行第一次查询SQL以前执行'XXXXXXXX' 里面的内容的。
若是init_connect 的内容有语法错误,致使执行失败,会致使用户没法执行查询,从mysql 退出
须要注意的是:init_connect 对具备super 权限的用户是无效的。也就是说超级帐户无视init_connect设置(即init_connect的设置对来自超级帐户的链接不生效)
因而根据这个参数的功能,咱们能够利用这个特性和binlog记录实践ID,审计全部普通用户在什么时间登陆库,对库中的表作了什么事情sql
3.一、首先登录须要审计的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参数内容:centos
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 能够手动删除他链接的信息tomcat
为了模拟演示,新建一个普通权限的测试用户,而且能够对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库表中的记录数app
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删除数据演示ide
[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.七、mysql_acc_log找到对应的线程id号肯定当时操做的登陆用户
能够看到线程 thread_id=5,而且时间也是200912 22:49:27左右。能够肯定就是 xiaolaodi@'%' 用户操做的 delete 语句。
经过 local_user 字段能够看到是192.168.1.215 这个地址使用 xiaolaodi@'%' 用户链接的 MySQL 数据库。