一、基本介绍
MySQL 数据库审计(MySQL Database Auditing)主要将用户对数据库的各类操作行为记录审计日志,以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分,等保评测中也要求有审计日志。对于 DBA 而言,数据库审计也极其重要,特别是发生人为事故后,审计日志便于我们进行责任追溯,问题查找。
实现方式
二、实现方式介绍
MySQL 数据库可以通过多种方式进行审计,包括内置插件、第三方插件和旁路部署等实现方式。
内置插件(Enterprise Audit Plugin)
- MySQL 企业版提供了内置的审计插件 Enterprise Audit Plugin,可以记录数据库中的所有 SQL查询和用户活动。该插件允许用户自定义审计规则,比如记录指定用户或特定事件的操作。适用于需要详细审计日志的企业场景。
- 优点: 内置于MySQL,稳定且维护方便。
- 缺点: 需要 MySQL 企业版,开源版无法使用。
第三方插件(MariaDB Audit Plugin)
- MariaDB 提供了一个开源的审计插件 MariaDB Audit Plugin,可以在 MySQL 5.5、5.6 和 5.7
上使用。它记录所有的数据库操作,包括登录、查询、更新等,输出为文本格式的审计日志。 - 优点: 开源,兼容 MySQL 。
- 缺点: 功能相对MySQL 企业版的审计插件略有不足。
旁路部署方式暂不做介绍,本章主要介绍使用第三方插件(MariaDB Audit Plugin)来实现数据库审计功能。这个插件是MariaDB数据库中自带的插件,MariaDB和MySQL数据库的关系这里不做解释,自行查阅。
三、下载插件
我们需要下载MariaDB数据库,从它的插件目录中\lib\plugin找到server_audit.so插件(这里下载的是linux版本的,windows版本插件为server_audit.dll),将server_audit.so插件拷贝到mysql的插件目录下(/usr/local/mysql/lib/plugin/)
MySQL版本为 5.7.30
MariaDB版本为10.2.38,对应的server_audit.so插件版本为1.4.13
下载地址: MariaDB10.2.38
下面为插件版本和MariaDB对应表
四、安装插件
1、修改插件的权限及属主
[root@localhost plugin]# chown mysql:mysql server_audit.so
[root@localhost plugin]# chmod 755 server_audit.so
[root@localhost plugin]# ls -lh server_audit.so
-rwxr-xr-x. 1 mysql mysql 191K May 4 2021 server_audit.so
2、修改MySQL的配置文件my.cnf启动并配置审计插件(永久生效方式)
[mysqld]
# 处理时间戳警告
explicit_defaults_for_timestamp=1
# 启用审计插件
plugin-load=server_audit=server_audit.so
# 启用审计日志记录
server_audit_logging=ON
# 防止插件被卸载
server_audit = FORCE_PLUS_PERMANENT
# 审计日志文件路径
server_audit_file_path=/var/log/mysql/audit.log
# 审计日志格式 写入文件中
server_audit_output_type=FILE
# 日志轮转开关 server_audit_output_type=FILE时设置
server_audit_file_rotate_now=ON
# 日志轮转大小 /B 50MB
server_audit_file_rotate_size=52428800
# 保存的轮转日志数量
server_audit_file_rotations=9
# 审计日志中包含的事件类型(CONNECT, QUERY, TABLE)
server_audit_events=CONNECT,QUERY_DDL,QUERY_DML_NO_SELECT
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
之后重启数据库服务即可生效
以上步骤,已经完成审计插件的安装和配置,下面来了解一下主要配置参数的作用:
日志内容示例:
# 进行操作后 查看审计日志内容
20220512 15:17:17,mysqlhost2,test_user,10.30.21.95,118,0,FAILED_CONNECT,,,1045
20220512 15:17:30,mysqlhost2,test_user,10.30.21.95,119,0,FAILED_CONNECT,,,1045
20220512 15:20:26,mysqlhost2,test_user,10.30.21.95,124,0,CONNECT,,,0
20220512 15:20:49,mysqlhost2,test_user,10.30.21.95,124,395,QUERY,,'create database testdb',0
20220512 15:22:06,mysqlhost2,test_user,10.30.21.95,129,419,QUERY,testdb,'CREATE TABLE if not exists `test_tb0` (\r\n `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'自增主键\',\r\n `test_id` int(11) NOT
NULL ,\r\n `test_name` varchar(20) DEFAULT NULL,\r\n `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',\r\n `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE C
URRENT_TIMESTAMP COMMENT \'修改时间\',\r\n PRIMARY KEY (`increment_id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=\'测试table\'',0
20220512 15:23:09,mysqlhost2,test_user,10.30.21.95,129,426,QUERY,testdb,'insert into test_tb0 (test_id,test_name) values (1001,\'4343df\'),(1002,\'dfd\')',0
20220512 15:23:22,mysqlhost2,test_user,10.30.21.95,129,433,QUERY,testdb,'delete from test_tb0',0
20220512 15:24:14,mysqlhost2,test_user,10.30.21.95,129,448,QUERY,testdb,'create table test_tb0 (id int)',1050
20220512 15:24:25,mysqlhost2,test_user,10.30.21.95,129,452,QUERY,testdb,'drop table test_tb0',0
20220512 15:25:13,mysqlhost2,test_user,10.30.21.95,126,0,DISCONNECT,testdb,,0
# 连接审计主要审计连接数据库、断开连接、连接失败等操作,其日志格式如下:
[timestamp],[serverhost],[username],[host],[connectionid],0,CONNECT,[database],,0
[timestamp],[serverhost],[username],[host],[connectionid],0,DISCONNECT,,,0
[timestamp],[serverhost],[username],[host],[connectionid],0,FAILED_CONNECT,,,[retcode]
# QUERY审计各种数据库变更事件,执行失败也会记录,其日志记录格式如下:
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],QUERY,[database],[object], [retcode]
如需使用插件请到主页资源进行下载