目录

MySQL插件之审计

目录

等保需求

  • 审计功能:记录时间、来源IP、用户、行为、数据库、SQL。

背景

Oracle 的 MySQL 社区版不带审计插件(Audit Plugin),要想使用审计功能,你可以用企业版,不过这需要银子。业界还有一些 GPL 协议的审计插件,这里我们选择 MariaDB 的审计插件。

  • 系统版本: CentOS 7.4
  • MySQL版本: 5.7.23 社区版
  • MariaDB审计插件版本: 1.4.7

备注:

  • MariaDB审计插件一直在更新,不同版本的审计插件功能也不同,每个版本的功能见:https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/#server_audit_events
  • 我们在给MySQL数据库安装审计插件时,需要从MariaDB里面拷贝审计插件。MariaDB版本与审计插件版本关系如下:https://mariadb.com/kb/en/mariadb-audit-plugin-versions/

插件安装

MariaDB 的 10.1 版本对应与 Oracle 的 MySQL 5.7,我们到它的官网上下载 Linux 的通用版本。

找到我们需要的审计插件:

./mariadb-10.1.48-linux-x86_64/lib/plugin/server_audit.so

把这个 so 结尾的文件拷贝到 MySQL 的插件目录,例如:/usr/local/mysql/lib/plugin/

-- 配置文件增加以下配置
[mysqld]
plugin_load_add                = server_audit
server_audit                   = FORCE_PLUS_PERMANENT  # 防止审计插件被卸载
server_audit_logging           = on
server_audit_events            = CONNECT,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML_NO_SELECT
server_audit_file_rotate_size  = 268435456
server_audit_file_rotations    = 64

-- 插件动态安装启用
mysql> install plugin server_audit SONAME 'server_audit.so';

-- 验证是否正常安装
mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION 
FROM INFORMATION_SCHEMA.PLUGINS 
WHERE PLUGIN_LIBRARY = 'server_audit.so';

mysql> SHOW PLUGINS;

插件配置

-- 查看默认相关变量
mysql> show variables like '%server_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_events='CONNECT,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML_NO_SELECT';
mysql> set global server_audit_file_rotations=64;
mysql> set global server_audit_file_rotate_size=268435456;
mysql> set global server_audit_logging=ON;

-- 查看修改后的配置
mysql> show variables like '%server_audit%';
+-------------------------------+-------------------------------------------------------+
| Variable_name                 | Value                                                 |
+-------------------------------+-------------------------------------------------------+
| server_audit_events           | CONNECT,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML_NO_SELECT |
| server_audit_excl_users       |                                                       |
| server_audit_file_path        | server_audit.log                                      |
| server_audit_file_rotate_now  | OFF                                                   |
| server_audit_file_rotate_size | 67108864                                              |
| server_audit_file_rotations   | 128                                                   |
| server_audit_incl_users       |                                                       |
| server_audit_loc_info         |                                                       |
| server_audit_logging          | ON                                                    |
| 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                                              |
+-------------------------------+-------------------------------------------------------+

审计参数说明:

  • server_audit_logging 这参数默认为 OFF,把这个参数设置为 ON 才能启动审计功能。
  • server_audit_events 决定记录的事件,这里我们记录 CONNECT,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML_NO_SELECT,默认为空代表审计所有事件。
  • server_audit_file_rotate_size 日志文件大小,单位为byte。
  • server_audit_file_rotations 日志文件的数量,到这个阀值时会覆盖第一个审计记录文件,默认为 9。
  • server_audit_output_type 设置为 file 时,记录成文件,默认目录是 MySQL 的 datadir 目录,默认文件名是 server_audit.log。当设置为 syslog 时,审计记录会通过标准 <syslog.h> API 发送给本地的 syslogd daemon。

审计日志格式如下:

[timestamp],[serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]

审计日志示例如下:

20210608 09:47:13,localhost,dev,127.0.0.1,429930,0,CONNECT,,,0
20210608 09:47:13,localhost,dev,127.0.0.1,429930,0,DISCONNECT,,,0