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
3.2在线动态设置init_connect参数内容:
**3.3 创建所有需要监控的账号,赋予所用需要监控的普通用户要对这张表拥有 insert 权限
**
提示注意:
此方法需要给数据库所有用户都对test001.mysql_acc_log授写权限,否则插入用户信息会失败;
不要授权 update 、delete 等权限,否则普通用户登录 MySQL 可以手动删除他连接的信息
为了模拟演示,新建一个普通权限的测试用户,并且可以对mysql_acc_log 这个表insert
3.4##创建另外一张测试表,来随便插入几条数据。追查是谁删除了线上的MySQL库表中的记录数
3.5创建测试表插入数据,并delete删除数据演示
192.168.1.215 机器查看表test001.mysql_acc_log记录:
继续写入:
3.6 、分析binglog日志,确定登录mysql服务的thread_id=5 执行的删除动作
查看mysql审计表mysql_acc_log找到对应的线程id号
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 数据库。