Step 1.建立访问表, 用于存储登录信息
-- 建库
mysql> CREATE DATABASE `auditdb` DEFAULT CHARSET utf8mb4;
-- 建表
mysql> CREATE TABLE `accesslog` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ServerID` int(11) DEFAULT NULL,
`ConnectionID` int(11) DEFAULT NULL,
`ConnUser` varchar(30) DEFAULT NULL,
`MatchUser` varchar(30) DEFAULT NULL,
`LoginTime` datetime DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
Step2. 为普通用户赋予写入权限(高级用户可以不赋予,因为高级用户已具备写入权限)
mysql> grant insert on `auditdb`.`accesslog` to 普通用户@具体主机;
mysql> flush privileges;
Step3. 在目标数据库的[mysqld]中增加以下:
init-connect='insert into auditdb.accesslog(ServerID, ConnectionID ,ConnUser ,MatchUser ,LoginTime) values(@@server_id, connection_id(),user(),current_user(),now());'
*** 配置init-connect完成后,需要重启mysql(生产环境请慎重) ***
Step 4. 下载并安装MySQL Binlog Digger 4.17
https://download.****.net/download/bournetai/13078374
注意:MySQL binlog Digger的挖掘用户(数据库账号)在mysql 8.0需要super或binlog_admin或replication slave权限, 而在mysql 5.7中则需要super或replication slave权限
Step 5.使用MySQL Binlog Digger 4.17进行dml操作审计(如果进行ddl审计, 则操作类型选择ddl)
注意:若访问表不存在或访问表中的信息与Binlog中的信息匹配不上,则不会显示审计信息
Redo:表示已经发生的重做信息
Seq:表示在挖掘重做结果中的序号
Server id:表示mysql> select @@server_id;
Thread id:表示Connection ID
ConnUser:表示UserName+IP(客户端IP)
MatchUser:表示在mysql.user存在的用户,且客户端以此用户登录
LoginTime:表示用户登录时间
GTID_NEXT:表示全局事务ID,一次事务或一次非事务操作都会产生一个新的gtid,它对应着一个Query
Query Time:表示一次操作的开始时间,这个操作可能是一个事务,也可能是非事务的一次操作
Query Log Pos:表示Query的position范围,它仅包括Query, 这个范围在GTID_NEXT之后,在具体STMT(SQL)之前
Query Exec_time:表示这次操作的耗时(单位:秒),这个操作可能是一个事务,也可能是非事务的一次操作
Query Error_code: 0表示执行成功,而-1表示有异常
Stmt Time:具体某条Stmt(SQL)的开始执行时间,例如在同一事务中,各Stmt(SQL)都有各自的开始执行时间,但具体相同的GTID_NEXT与Query
Stmt Log Pos:具体某条Stmt(SQL)的position范围,例如在同一事务中,各Stmt(SQL)都有各自的开始position与结束position,但具体相同的GTID_NEXT与Query
总之:GTID_NEXT与Query一一对应,而它们却包括一条或多条STMT(具体SQL)
此外,MySQL Binlog Digger 4.17还具备mysqlbinlog挖掘分析功能,可以为误删、误增、误改提供回滚SQL功能,此外还支持DDL重做操作挖掘.
### 声明 ###
十分感谢您使用本工具, 本工具为免费产品, 对于因本工具而造成的损失, 本工作室概不承担! 因本人水平有限, 如发现不足, 请多多请正.
广州逆舟数据工作室 Bourne QQ:649869986 微信:wxid_glzhz1qg2xre22
2020-10-30 广州