乐趣区

关于mysql:MySQL审计插件介绍

前言:

数据库审计性能次要将用户对数据库的各类操作行为记录审计日志,以便日后进行跟踪、查问、剖析,以实现对用户操作的监控和审计。审计是一项十分重要的工作,也是企业数据安全体系的重要组成部分,等保评测中也要求有审计日志。对于 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 语句。不同版本的审计插件反对的审计事件如下图:

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

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.baidu.com/s/1HO5sjKb5zpj3CiyRulV5bw?pwd=r85k 提取码: r85k。上面咱们来开始正式装置。

# 进入数据库装置审计插件
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

通过以上步骤,咱们曾经实现审计插件的装置与配置,参照官网文档,咱们来理解下次要配置参数的作用:

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

# 进行操作后 查看审计日志内容
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 审计插件劣势:

  • 开启审计会减少数据库的性能开销,并占用磁盘空间。
  • 日志格局不够丰盛,不能自定义输入格局。

参考:

  • https://www.cnblogs.com/lijiaman/p/14257861.html
  • https://www.jianshu.com/p/45b37a73e286
  • https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/
退出移动版