【审计篇】 | MySQL日志审计思路

职场   2025-01-08 08:00   北京  
概述
随着企业信息化进程的加速,其信息系统产生的数据量呈指数级增长。这些数据所反映的规律和趋势对企业的销售决策、战略规划等具有重要影响。因此,作为数据承载载体的数据库及其数据安全显得尤为关键。
为保障数据库及数据的安全性,大多数企业采取了不相容岗位分离、权限最小化分配、冷温热数据恢复等策略。然而,利益驱动下的风险依然存在,审计工作应当深入日常业务中,即通过监控数据库日志记录,分析其中的异常或可疑信息,发现潜在漏洞,从而提升企业风险防控能力。
此次以知名MySQL数据库作为分析对象,分享其主要包含日志类型、日志作用,并结合日志例子分析其内容。
不同日志,有不同用途
MySQL服务器主要包含以下几种日志类型:
(1)错误日志(Error_Log)
主要记录MySQL服务器启动、运行或停止时发生的错误和警告信息。通过分析此日志,来监控异常事件,如未经授权的访问尝试因配置错误导致的系统运行风险等问题;以及资源不足等问题(此问题就像windowns电脑中,已经显示为红色的c盘,冗余的数据以及无用的文件意味着c盘管理效果差强人意)
(2)通用查询日志(General_Query_Log)
主要记录所有连接和执行的SQL语句。通过分析此日志,来进行用户活动追踪,如确保只有授权用户访问敏感数据检查是否存在暴力查询行为、检查是否存在越权查询或批量导出数据行为、非正常时间访问等问题。
(3)慢查询日志(Slow_Query_Log)
主要记录执行时间慢(超过指定阈值)的SQL语句;通常执行时间越长的语句,就会耗费大量的系统资源,而大量的慢查询,会导致服务器资源不足和崩溃,进而会使服务器容易被攻击。也可利用此日志对数据库使用的查询语句耗时进行分析,来分析工程师的胜任能力
(4)二进制日志(Binary_Log)
主要记录对数据库的更改操作(如Insert、Update、Delete)及可能引发更改的语句。通过分析此日志,进行数据修改追踪,确认数据变更是授权行为、识别潜在的恶意操作等;进行操作溯源,恢复被误删的数据,反之验证用户行为和系统恢复的有效性
补充:此日志文件是以二进制格式存储,无法直接用文本编辑器打开并查看,通常可以用mysqlbinlog工具(随MySQL安装自带)、MYSQL客户端及第三方工具进行查看。
(5)事务日志(InnoDBRedo/Undo_Logs)
主要记录每个事物的提交和回滚情况。可利用此日志中记录的提交信息,用于崩溃恢复,也可用于审查并发事务中是否存在数据一致性问题;同一用户可能会利用大量回滚操作,来避免留下操作痕迹。
(6)审计日志(Audit_Log)
主要记录用户的访问行为、SQL执行和数据更改情况;用于满足安全和合规需求。该日志并非数据库自带日志文件,通常需要额外插件。
以上六种日志并不是默认开启的,我们可以通过MySQL文件目录下的“my.ini”文件(记录服务器的各种参数和选项)查询开启状态,以及文件保存路径。
图1.my文件部分日志开启和路径内容
可以从图1中看到我电脑中的MySQL服务器,其通用查询日志为关闭状态、慢查询日志为开启状态、错误日志以及二进制日志为默认开启状态。
日志分析举例
例一:慢查询日志(使用chatgpt生成)

图2.慢查询日志演示

从上述日志中“Query_time”、“Rows_examined”、“Rows_sent”、“Bytes_sent”等数值,可以确定语句的查询耗时长、扫描行数与返回值并不匹配,以及数据传输量高。导致出现此现象的原因为语句中对“order”表进行了全表查询、返回的字段数据量大、高并发环境下锁时间造成的延迟堆积等。

通过上述现象,结合慢查询带来的风险问题,就可以分析该用户日度或月度慢查询次数、查询的目标表是否存在敏感数据、以及该用户是否存在主观故意行为。

例二:二进制日志(使用chatgpt生成)

前文提到无法直接利用文本编辑器打开日志,那么如何利用mysqlbinlog打开二进制日志文件?

# 查看# 首先利用win+r,打开cmd# 随后进入安装目录下的“mysql server 8.0\bin”文件# 再用“mysqlbinlog/var/lib/文件名”进行查看
# 批量查看# 在bin文件查看mysqlbinlog/var/lib/文件名/var/lib/mysql/文件名
# 批量导出(请确保有足够的权限)# 在bin文件下导出mysqlbinlog --start-datetime="时间" --stop-datetime="时间" binlog.000001> exported_logs.sqlmysqlbinlog --start-position=120 --stop-position=500 binlog.000001 >exportrd_logs.sql

图2.使用mysqlbinlog工具打开的后的二进制日志

编号为901和1113的记录显示,重复插入了相同的数据,此行为会造成数据冗余,浪费储存空间,且重复的数据也可能会导致业务统计出现错误;

编号1729的操作更新了全表的所有记录,但没有添加限制条件,可能会影响无需更新的数据,且若数据量大,会引发锁表或服务器崩溃;

编号2355直接无条件删除清空了整个employees表,极易造成数据丢失。

例三:通用查询日志(使用chatgpt生成)

图3.通用查询日志部分内容

从图3中可以看出IP为192.168.1.10以及192.168.1.12的用户访问了“users”表和“sensitive”表,表中包含敏感信息,从而需要确定使用该IP的用户是否具有权限、以及通过访问时间来判断是否为正常工作时间进行的访问;

IP为192.168.1.10的用户,在01-06 12:00:03时进行了删除表的操作,需要确定此表原先的存储的内容,避免数据丢失;

IP为192.168.1.13的用户,查询了不存在的表products,这可能是代码编写错误,但也可以分析出现此类情况的次数,避免频繁错误查询,浪费数据库资源。


以上就是笔者关于MySQL数据库审查的关注点以及思路,欢迎讨论和补充~

自我学习的同时,希望也能够帮到你~



审计实践
实践是检验真理的唯一标准。在实践中总结经验,在经验中提炼技术,在技术中探索方法,在方法中归纳思想。欢迎大家投稿、留言或转发,一起分享审计实践中的经验、技术、方法和思想。交流与合作能够创造和提升审计价值。审计世界,有你更精彩!
 最新文章