前言:

数据库审计功能主要将用户对数据库的各类操作行为记录审计日志,以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分,等保评测中也要求有审计日志。对于 DBA 而言,数据库审计也极其重要,特别是发生人为事故后,审计日志便于我们进行责任追溯,问题查找。

1. MySQL 社区版审计日志现状

如果你用的是 MySQL 社区版的话,你会发现 MySQL 官方并没有提供严格意义上的审计日志。虽然 MySQL 提供有 binlog 及 general log ,这二者虽然具备部分审计功能,但一般不当做审计日志来看待。

binlog 即二进制日志文件,它记录了数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。虽然能查到具体 SQL 的执行记录,但其作用主要是主从复制,并不能当做是审计日志。

general log 是全量日志,开启后将会记录所有到达 MySQL Server 的SQL语句。一般不会开启此日志,因为 log 的量会非常庞大,对数据库性能有影响,并且 general log 会记录大量无用信息,当做审计日志的话,后期筛选有难度。

那么 MySQL 社区版应该怎样进行审计呢?查阅资料我们发现通过安装审计插件可实现 MySQL 的审计功能,常见的审计插件有 MariaDB Audit Plugin、Percona Audit Log Plugin、McAfee MySQL Audit Plugin 三种,MariaDB 自带的审计插件比较适合用于 MySQL 社区版,下面我们来学习下如何使用审计插件来实现审计功能。

2. 审计插件使用教程

首先我们要做的是从 MariaDB 安装包中拷贝出来审计插件,需要注意的是操作系统要选择一致,比如说你的 MySQL 安装在 CentOS 系统中,那就要下载 CentOS 系统的 MariaDB 安装包并从中拷贝,Windows 系统则需要下载对应系统的审计插件。

MariaDB 审计插件的名称是 server_audit.so(Windows系统下是 server_audit.dll ),要注意的是,审计插件一直在更新,不同版本的审计插件功能也不同,推荐使用 >= 1.4.4 版本的插件,新版本的插件可以排除掉 select 语句。不同版本的审计插件支持的审计事件如下图:

image.png

审计插件版本与 MariaDB 版本对应图如下:

image.png

MySQL 5.7 一般可对应 MariaDB 10.2 版本,我们以 CentOS 系统 MySQL 5.7 版本为例来安装下审计插件。我这里选择下载的是 MariaDB 10.2.38 版本的安装包(审计插件版本 1.4.13),下载地址:https://downloads.mariadb.com/MariaDB/mariadb-10.2.38/bintar-linux-x86_64/mariadb-10.2.38-linux-x86_64.tar.gz

下载完成之后,解压安装包,然后到 mariadb-10.2.38-linux-x86_64/lib/plugin/ 路径下复制出来 server_audit.so 文件,将其拷贝到 MySQL 服务器上,具体步骤如下:

# 查看 MySQL 插件存放路径
mysql> show variables like 'plugin_dir';
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+

# 将审计插件 server_audit.so 存放到该路径下
[root@localhost plugin]# ls -lh server_audit.so 
-rw-r--r--. 1 root root 191K May  4  2021 server_audit.so

# 更改插件属主及权限
[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

以上均为准备内容,为方便各位小伙伴,点击下面链接即可单独下载 Linux 64 位系统的 1.4.13 版本的审计插件:
https://pan.quark.cn/s/aa839cee585f 提取码:4eTX 。下面我们来开始正式安装。

# 进入数据库安装审计插件
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
Query OK, 0 rows affected (0.07 sec)

mysql> show plugins;
+----------------------------+--------+--------------------+-----------------+---------+
| Name                       | Status | Type               | Library         | License |
+----------------------------+--------+--------------------+-----------------+---------+
...
| SERVER_AUDIT               | ACTIVE | AUDIT              | server_audit.so | GPL     |
+----------------------------+--------+--------------------+-----------------+---------+

# 查看 audit 初始参数配置
mysql> show variables like '%audit%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           |                       |
| server_audit_excl_users       |                       |
| server_audit_file_path        | server_audit.log      |
| server_audit_file_rotate_now  | OFF                   |
| server_audit_file_rotate_size | 1000000               |
| server_audit_file_rotations   | 9                     |
| server_audit_incl_users       |                       |
| server_audit_loc_info         |                       |
| server_audit_logging          | OFF                   |
| server_audit_mode             | 1                     |
| server_audit_output_type      | file                  |
| server_audit_query_log_limit  | 1024                  |
| server_audit_syslog_facility  | LOG_USER              |
| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |
+-------------------------------+-----------------------+

# 在线开启审计
mysql> set global server_audit_logging=on;
Query OK, 0 rows affected (0.00 sec)

mysql> set global server_audit_events='connect,table,query_ddl,query_dcl,query_dml_no_select';
Query OK, 0 rows affected (0.00 sec)

mysql> set global server_audit_file_path ='/data/mysql/logs/server_audit.log';
Query OK, 0 rows affected (0.00 sec)

mysql> set global server_audit_file_rotate_size=104857600;
Query OK, 0 rows affected (0.01 sec)

# [mysqld]下添加以下配置 使得永久生效
server_audit=FORCE_PLUS_PERMANENT
server_audit_logging=ON
server_audit_file_path=/data/mysql/logs/server_audit.log         
server_audit_events=connect,table,query_ddl,query_dcl,query_dml_no_select
server_audit_file_rotate_size=104857600

通过以上步骤,我们已经完成审计插件的安装与配置,参照官方文档,我们来了解下主要配置参数的作用:

image.png

以上参数还是很容易理解的,下面我们进行增删改查测试,看下审计日志具体记录的内容:

# 进行操作后 查看审计日志内容
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]

至此,我们基本上完成审计插件的初步使用,从审计日志内容中我们可以看出,记录的格式还是很清晰详细的,每列内容都是需要的,根据日志很容易查到对应的操作。使用下来,笔者觉得 server_audit 审计插件基本能满足审计需求,不过审计插件也是有优缺点的,优劣势整理如下:

server_audit 审计插件优势:

  • 丰富的审计内容:包括用户连接,关闭,DML操作,存储过程,触发器,事件等。
  • 灵活的审计策略:可以自定义审计事件,例如过滤掉select查询,或者排除审计某个用户等。
  • 灵活方便:免费使用且安装方便,可以在线开启和停用审计功能。

server_audit 审计插件劣势:

  • 开启审计会增加数据库的性能开销,并占用磁盘空间。
  • 日志格式不够丰富,不能自定义输出格式。

参考:


MySQL技术
298 声望40 粉丝

MySQL技术学习者