MySQL Binlog 调查取证

背景

最近,公司有一个客户的MySQL数据库被篡改了数据,因此需要对该客户被攻击的服务器进行调查。其中涉及到对MySQL的Binlog日志分析。在任务完成后,将其中相关的步骤进行总结。

Binlog

定位 Binlog 位置

找到MySQL安装目录中bin目录的位置,同时确认binlog的储存位置。其相应的配置在my.cnf的log_bin=””中。
如果能够使用mySQL命令行连接,也可以使用 showvariables like '%log_bin%'命令查看binlog的相关配置。

Binlog 结构

在binlog所在的数据目录(默认为data目录),可以看到mysql-bin.index 及 mysql-bin.0000xx 文件。其中.index文件为索引文件,记录数据文件列表。每当数据库重启或者当前一个文件写满后会生成新文件,同时使用命令flush logs也可以重新生成新的binlog日志文件。reset master命令可以用于清空binlog日志文件。

Binlog 格式

Binlog的格式有三个选项:
- Row
- Statement
- Mixed
简单介绍这三种格式,分别为:
- Row: 默认格式,记录导致表的行发生变化的事件
- Statement: 记录被执行的原始SQL查询语句
- Mixed: 默认使用Statement格式,再特定情况下使用Row格式
Binlog格式可以在my.cnf的binlog-format=中进行配置。在MySQL命令行中可以通过SHOW VARIABLES LIKE 'binlog_format';查看。

Binlog 内容

由于binlog是以二进制格式储存的,所以无法直接查看。MySQL自带的mysqlbinlog工具可以用来查看binlog。[MySQL directory]\bin\mysqlbinlog mysql-bin.000008即可获取binlog中的内容。当然也可以添加参数(–start-porition, –stop-position, –start-time, –stop-time)来筛选日志。在很多事件调查中,其实都可以将目标时间确定在一个范围之内,因此使用参数进行筛选会给我们带来极大的便利。
对于Row格式的Binlog,还可以使用-v参数将日志记录转译为”伪-SQL语句”。


参考文献

https://cloud.tencent.com/developer/article/1032755
https://maxchadwick.xyz/blog/working-with-mysql-binary-logs