1.数据库审计工具介绍及选择

1.1. 数据库审计工具介绍

  • MySQL 分支的审计功能包含在企业版中,社区版可以使用其他分支提供的工具。
  • 目前已知的审计工具,社区版本有 Percona 的 Percona Server Audit Log 、MariaDB 的 MariaDB Audit Plugin 和 McAfee 的 mysql-audit。
  • 不过 McAfee 的插件兼容性较差,审计不同版本的 MySQL 时需要执行脚本获取并指定偏移量,且发布时间较早、无人维护,不推荐使用。
  • MariaDB 版本的插件 MariaDB Audit Plugin 对 MySQL 分支兼容性较好,而且输出清爽,可以还能用户记录错误的操作命令。
  • Percona 的插件 Percona Server Audit Log,随 Percona Server 各版本分发,日志可以指定4种格式,过滤规则较多。

1.2. 数据库审计工具选择

  • MariaDB 和 Percona 版本的插件都随版本发布,都有 5.7 版本的插件,选择哪个插件需要对比一下功能特性及压测性能。

2. Percona Audit Log

2.1. Percona Audit Log 下载

  • Percona Audit Log 随 Percona Server 一起分发,故需下载 Percona Server MySQL。

2.2. Percona Audit Log 安装

  • 解压 Percona Server,上传插件
cp Percona-Server-5.7.28-31-Linux.x86_64.ssl1:111/lib/mysql/plugin/audit_log.so /usr/local/mysql/lib/plugin/


INSTALL PLUGIN audit_log SONAME 'audit_log.so';
ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/percona_audit_log.so' (errno: 11 /usr/local/mysql/lib/plugin/percona_audit_log.so: undefined symbol: plugin_thdvar_safe_update)


  • 报错:undefined symbol: plugin_thdvar_safe_update
  • Google 一下,有相关主题:Percona Audit on Oracle MySQL EE: "undefined symbol: plugin_thdvar_safe_update",有回复:
  • Plugin .so files from a specific packages are not supposed to work with other packages or third-party software.And in general our plugins are working only with Percona Server, not with Oracle MySQL.
  • Percona 官方技术人员回复不适用于第三方分支。

另一篇文章给出了判断当前数据库是否可用的方法(Trying to install Audit_log Plugin on MySQL)

  • nm /usr/local/mysql/bin/mysqld | grep plugin_thdvar_safe_update
  • 输出为空,则编译时缺少该参数,不可用。如果想用,需要在编译时加入选项编译 plugin_thdvar_safe_update 参数。
  • MySQL输出如下
  • Percona Server 输出如下

2.3. Percona Audit 插件在 Oracle MySQL 分支不可用,所以选择 MariaDB 分支审计插件。

3. MariaDB Audit Plugin

3.1. MariaDB Audit Plugin 的简介

  • 该server_audit插件记录服务器的活动。对于每个客户端会话,它记录谁连接到服务器(即用户名和主机),执行了哪些查询,访问了哪些表以及更改了服务器变量。此信息存储在循环日志文件中,或者可以发送到本地syslogd。

3.2. MariaDB Audit Plugin 的安装

3.2.1. 插件下载

  • 插件 server_audit.so 包含在 MariaDB 分支程序中,下载 5.x 版本的 MariaDB server,解压后即可找到。

3.2.2. 插件安装

  • 执行命令,获取插件目录路径
SHOW GLOBAL VARIABLES LIKE 'plugin_dir';


+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
  • 将插件拷贝到插件目录

cp server_audit.so /usr/lib64/mysql/plugin/

  • 安装插件
INSTALL PLUGIN server_audit SONAME 'server_audit.so';

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

3.2.3. 插件配置

  • 在安装并加载了审计插件之后,MariaDB中将有一些新的全局变量。
  • 这些可用于配置许多与审核服务器有关的组件,限制和方法。您可以设置与日志相关的这些变量,例如它们的位置,大小限制,旋转参数和日志信息的方法。
  • 还可以设置要记录的信息,例如连接,断开连接和失败的连接尝试。
  • 还可以使用审核插件日志查询,对表的读写访问权限。为了不使您的日志超载,可以根据用户列表配置审核插件。
  • 可以在日志中包括或排除特定用户的活动。
SHOW GLOBAL VARIABLES LIKE 'server_audit%';

+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           | CONNECT,QUERY,TABLE   |
| 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_logging          | ON                    |
| server_audit_mode             | 0                     |
| 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              |
+-------------------------------+-----------------------+
  • 开启插件,需要用户具有 SUPER 权限。

SET GLOBAL server_audit_logging=ON;

  • 创建审计日志文件存放路径
# 在 mysql datadir 中创建 auditlog 目录
mkdir -p auditlog
chown -R mysql:mysql auditlog
chmod 750 auditlog
  • 设置审计日志文件存放路径

set global server_audit_file_path='/home/mysql/mysql57_3306/auditlog/server_audit.log';

  • 设置审计日志的相关参数
set global server_audit_events='CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL';
set global server_audit_output_type= file;
set global server_audit_logging = 1;
set global server_audit_file_rotate_size = 500000000;
set global server_audit_file_rotations = 3;
set global server_audit_incl_users = '';
set global server_audit_excl_users = '';
set global server_audit_query_log_limit = 4096;


3.2.4. 卸载

UNINSTALL PLUGIN server_audit;

  • 防止被卸载,如果设置如下选项,需要注释配置文件后重启 MySQL 才可以卸载审计插件。

[mysqld]

server_audit=FORCE_PLUS_PERMANENT

3.2.4. 配置文件参数

loose-server_audit_file_path='/data/mysql/mysql57_3306/auditlog/server_audit.log'
loose-server_audit_events='CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL'
loose-server_audit_output_type= file
loose-server_audit_logging = 1
loose-server_audit_file_rotate_size = 500000000
loose-server_audit_file_rotations = 3
loose-server_audit_incl_users = ''
loose-server_audit_excl_users = ''
loose-server_audit_query_log_limit = 4096


3.3. MariaDB Audit Plugin 的日志格式

  • 审计插件记录用户对MariaDB及其对象的访问。审核跟踪(即审核日志)是一组记录,以纯文本格式写为文件的字段列表。
  • 日志中的字段用逗号分隔。插件自己的日志文件使用的格式与它记录到系统日志时使用的格式略有不同,因为它具有自己的标准格式。日志记录到插件自己文件的一般格式如下:

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

  • 如果将 server_audit_output_type 变量设置为 syslog 而不是默认值 file,则审核日志文件格式将如下所示:

[timestamp][syslog_host][syslog_ident]:[syslog_info][serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]


日志项

描述



timestamp

事件发生的时间。如果使用syslog,则格式由 syslogd 定义



syslog_host

接收系统日志条目的主机



syslog_ident

用于标识系统日志条目,包括MariaDB服务器



syslog_info

用于提供标识系统日志条目的信息



serverhost

MariaDB服务器主机名



username

连接的用户



host

用户连接的主机



connectionid

相关操作的连接标识号



queryid

查询ID号,可用于查找关系表事件和相关查询。对于TABLE事件,将添加多行



operation

记录的动作类型:CONNECT,QUERY,READ,WRITE,CREATE,ALTER,RENAME,DROP



database

活动数据库(由 USE 设置)



object

对QUERY事件或TABLE事件的表名执行查询



retcode

返回已记录操作的代码


  • 各种事件将导致不同的审核记录。某些事件将不会为某些字段返回值(例如,当连接到服务器时未设置活动数据库时)。
  • 以下是连接事件输出的通用示例,其中占位符代表数据。这些是用户连接,断开连接或尝试连接服务器失败的事件。