一、概述
1、实现原理
BinLog是MySQL操作时留下的日志,BinLog一方面可以用在数据库的恢复与主从复制上,另外一方面可以用来做数据库的审计。
在MySQL中,每个连接都会先执行init_connect进行连接的初始化,我们可以在这里获取用户的登录名称和thread ID值。
然后配合BinLog,就可以追踪到每个操作语句的操作时间,操作人等信息,再加上BinLog的日志信息实现审计。
2、优势
配置简单
3、弊端
只能记录登录名称和thread ID,还要根据thread ID去查binlog文件,操作复杂
由于BinLog日志里面无法查询是谁在哪个时间段登录的等信息,缺少审计必要的信息。
采用这种方式进行审计,由于init-connect只会在连接时执行,不会对数据库产生大的性能影响,但是init-connect不会记录拥有root权限的用户记录.
二、具体配置
1、配置审计
1.创建审计用的数据库和表
create database audit_db;
use audit_db;
create table access_log(
id int primary key auto_increment,
connection_id int,
connection_user varchar(30),
logintime datetime
);
#因为是记录在具体库的具体表里,如果主从同步没做忽略库表,则会主库这张表的信息同步到从库
2、建用户并授权
grant all privileges on audit_log.* to 'user001'@'localhost' identified by 'password001';
flush privileges;
3、设置init_connect,并重启MySQL数据库在初始化参数文件[mysql]部分添加如下内容
log-bin=mysql-bin #开启Binlog
init_connect='insert into audit_db.access_log(connection_id, connection_user,logintime) values(connection_id(),user(),now());' #设置初始化连接参数
3.使用user001登录进行增删改查的操作
略
4.用mysqlbinlog工具查看BinLog,根据delete操作找到相应的ThreadId,而后在前面创建的审计日志表audit_db.access_log
里面根据ThreadID找到用户登录信息
show master status;
比如:查看当前binlog mysqlbin.000029的内容,并找到delete操作对应的ThreadID
mysqlbinlog …/data/mysql-bin.000029
从Binlog中可以得知删除Test2表对应的threadid是8,根据ThreadID在审计表里查看用户的登录信息,可以得知这个删除操作是user001用户在本机执行的操作
select * from audit_log.access_log;
5、试验记录
业务用户要额外授权audit_db表的权限,不然业务用户执行操作的时候无法写入audit_db表,会直接弹出报错,当前命令都是执行失败状态
拥有超级管理员权限的用户操作不被记录
只记录连接时的id,不记录退出和具体操作命令
数据会从主库同步到从库
2、关闭审计
直接将配置文件中init_connect配置删除并重启mysql即可
标签:audit,BinLog,log,init,Init,connect,审计
From: https://blog.51cto.com/u_13236892/8790780