MySQL的社区版没有审计功能,企业版才有审计功能。企业版中自带 Audit Plugin ,名为audit_log.so。但是其它MySQL分支版本也开发了各自的审计功能插件。最常见的就是Percona Audit Log Plugin、MariaDB Audit Plugin、当然还有通用插件McAfee MySQL Audit Plugin。 如果MySQL社区版想上审计功能的话,能否使用这三个插件呢?答案是社区版MySQL可以使用MariaDB Audit Plugin和McAfee MySQL Audit Plugin,Percona Audit Log Plugin是仅供Percona Server使用的免费插件,下面我们来学习、总结一下,在MySQL社区版中如何使用MariaDB Audit Plugin插件来做数据库的跟踪、审计。
插件介绍
下面是官方网址关于MariaDB Audit Plugin的介绍,更多资料请参考https://mariadb.com/kb/en/mariadb-audit-plugin/
MariaDB and MySQL are used in a broad range of environments, but if you needed to record user access to be in compliance with auditing regulations for your organization, you would previously have had to use other database solutions. To meet this need, though, MariaDB has developed the MariaDB Audit Plugin. Although the MariaDB Audit Plugin has some unique features available only for MariaDB, it can be used also with MySQL.
Basically, the purpose of the MariaDB Audit Plugin is to log the server"s activity. For each client session, it records who connected to the server (i.e., user name and host), what queries were executed, and which tables were accessed and server variables that were changed. This information is stored in a rotating log file or it may be sent to the local syslogd.
The MariaDB Audit Plugin works with MariaDB, MySQL (as of, version 5.5.34 and 10.0.7) and Percona Server. MariaDB started including by default the Audit Plugin from versions 10.0.10 and 5.5.37, and it can be installed in any version from MariaDB 5.5.20.
插件下载
目前而言,官方并没有提供单独MariaDB Audit Plugin下载地址,所以你必须下载MariaDB的安装包,然后从安装包中找到插件的文件。
官方下载地址:
https://downloads.mariadb.org/mariadb/+releases/
这里我们下载mariadb-5.5.64-linux-systemd-x86_64.tar.gz测试验证一下。插件server_audit.so一般位于目录./lib/plugin下面。
插件安装
MySQL的插件必须放在plugin_dir目录下面,所以首先查看当前社区版本MySQL的系统变量plugin_dir(插件路径)
mysql> select version() from dual;
+------------+
| version() |
+------------+
| 5.7.21-log |
+------------+
1 row in set (0.00 sec)
mysql> show variables like "plugin_dir";
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| plugin_dir | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.01 sec)
mysql>
将server_audit.so文件拷贝到系统变量plugin_dir对应的目录下面。
# cd /tmp
# tar -xzvf mariadb-5.5.64-linux-systemd-x86_64.tar.gz
# cd mariadb-5.5.64-linux-systemd-x86_64
# find ./ -name "server_audit.so"
./lib/plugin/server_audit.so
# cp /tmp/mariadb-5.5.64-linux-systemd-x86_64/lib/plugin/server_audit.so /usr/lib64/mysql/plugin/
# chmod +x server_audit.so
在安装MySQL插件MariaDB Audit Plugin前,先确认系统glibc版本是否匹配编译server_audit.so的glibc版本。MariaDB一般多使用2.14版glibc进行编译。如果没有2.14版本的glibc,很有可能出现下面错误,如下所示:
# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
mysql> INSTALL PLUGIN server_audit SONAME "server_audit.so";
ERROR 1126 (HY000): Can"t open shared library "/usr/lib64/mysql/plugin/server_audit.so" (errno: 2 /lib64/libc.so.6: version `GLIBC_2.14" not found (required by /usr/lib64/mysql/plugin/server_audit.so))
mysql>
安装glibc2.14,简单步骤如下,安装glibc2.14可能会遇到一些问题,此篇不做展开讲述。
# wget -c http://ftp.gnu.org/gnu/libc/glibc-2.14.tar.gz
# tar -zxvf glibc-2.14.tar.gz
# cd glibc-2.14
# mkdir build
# cd build
# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
#make && make install
安装完成后,验证是否安装成功。
# ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 May 23 18:28 /lib64/libc.so.6 -> libc-2.14.so
# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_PRIVATE
注意,安装完2.14版本的glibc后,必须重启MySQL,否则在安装补丁过程中,依然报上面错误
mysql> INSTALL PLUGIN server_audit SONAME "server_audit.so";
ERROR 1126 (HY000): Can"t open shared library "/usr/lib64/mysql/plugin/server_audit.so" (errno: 2 /lib64/libc.so.6: version `GLIBC_2.14" not found (required by /usr/lib64/mysql/plugin/server_audit.so))
重启MySQL实例后,安装成功。如下所示:
mysql> INSTALL PLUGIN server_audit SONAME "server_audit.so";
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_LIBRARY = "server_audit.so";
+--------------+-----------------+---------------+-------------+
| PLUGIN_NAME | PLUGIN_LIBRARY | PLUGIN_STATUS | LOAD_OPTION |
+--------------+-----------------+---------------+-------------+
| SERVER_AUDIT | server_audit.so | ACTIVE | ON |
+--------------+-----------------+---------------+-------------+
1 row in set (0.00 sec)
关于插件MariaDB Audit Plugin 目前的版本信息,如下所示
Version |
Introduced |
1.4.7 |
MariaDB 10.1.41, MariaDB 10.2.26, MariaDB 10.3.17, MariaDB 10.4.7 |
1.4.5 |
MariaDB 10.2.24, MariaDB 10.3.15, MariaDB 10.4.5 |
1.4.4 |
MariaDB 5.5.61, MariaDB 10.0.36, MariaDB 10.1.34, MariaDB 10.2.15, MariaDB 10.3.7, MariaDB 10.4.0 |
1.4.0 |
MariaDB 5.5.48, MariaDB 10.0.24, MariaDB 10.1.11 |
1.3.0 |
MariaDB 5.5.43, MariaDB 10.0.18, MariaDB 10.1.5 |
1.2.0 |
MariaDB 5.5.42, MariaDB 10.0.17, MariaDB 10.1.4 |
1.1.7 |
MariaDB 5.5.38, MariaDB 10.0.11, MariaDB 10.1.0 |
1.1.6 |
MariaDB 5.5.37, MariaDB 10.0.10 |
1.1.5 |
MariaDB 10.0.09 |
1.1.4 |
MariaDB 5.5.36 |
1.1.3 |
MariaDB 5.5.34, MariaDB 10.0.7 |
我们这里从mariadb-5.5.64拷贝的插件文件,所以MariaDB Audit Plugin的版本为 1.4.4。 具体参考官方文档https://mariadb.com/kb/en/mariadb-audit-plugin-versions/
参数说明
如下所示可以查看MariaDB Audit Plugin的相关参数。用命令设置或在参数文件my.cnf中配置。
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 |
+-------------------------------+-----------------------+
16 rows in set (0.00 sec)
mysql> SET GLOBAL server_audit_logging=ON;
Query OK, 0 rows affected (0.00 sec)
关于这些参数的具体定义,如下所示:
server_audit_events
指定记录到日志的event类型,Type如下,具体请见下面截图(来自官方文档)。可以用逗号分隔的多个值(connect,query,table),如果开启了查询缓存(query cache),查询直接从查询缓存返回数据,将没有table记录
参数server_audit_events的有效值跟插件版本有关。
· CONNECT, QUERY, TABLE (MariaDB Audit Plugin < 1.2.0)
· CONNECT, QUERY, TABLE, QUERY_DDL, QUERY_DML (MariaDB Audit Plugin >= 1.2.0)
· CONNECT, QUERY, TABLE, QUERY_DDL, QUERY_DML, QUERY_DCL (MariaDB Audit Plugin >=1.3.0)
· CONNECT, QUERY, TABLE, QUERY_DDL, QUERY_DML, QUERY_DCL, QUERY_DML_NO_SELECT (MariaDB Audit Plugin >= 1.4.4)
server_audit_excl_users
该列表的用户行为将不记录,connect将不受该设置影响
server_audit_file_path
审计日志路径,如果server_audit_output_type为FILE,审计日志默认存于数据目录下。即参数datadir对应的数据目录下面。如果修改server_audit_file_path,之前旧的审计日志文件不会被删除。需要手工去清理、删除。
另外MySQL会开始新的审计日志轮转。
server_audit_file_rotate_now
强制轮转一次,执行脚本SET GLOBAL server_audit_file_rotate_now = ON;后,审计日志就会强制轮转一次。
server_audit_file_rotate_size
限制单个轮转审计日志大小,超出该限值后自动轮转。默认值为1000000,单位为byte,建议设置稍微大一点,例如,64M大小,67108864。具体根据实际需求和参数server_audit_file_rotations一起设定。
注意事项:如果你参数server_audit_file_rotations设定为1000000, 你会发现审计日志的实际大小跟这个参数有点出入。这个是正常的。因为没法精准控制,可能写入最后一条记录后,发现日志文件大小应该超过了1000000,进程立刻强制轮转。但是此时文件大小已经超过1000000了。
# ls -lrt server*
-rw-r----- 1 mysql mysql 1000048 May 25 05:25 server_audit.log.9
-rw-r----- 1 mysql mysql 1000451 May 25 09:02 server_audit.log.8
-rw-r----- 1 mysql mysql 1000602 May 25 09:35 server_audit.log.7
-rw-r----- 1 mysql mysql 1000816 May 25 09:42 server_audit.log.6
-rw-r----- 1 mysql mysql 1000616 May 25 09:50 server_audit.log.5
-rw-r----- 1 mysql mysql 1000721 May 25 09:55 server_audit.log.4
-rw-r----- 1 mysql mysql 1001032 May 25 10:02 server_audit.log.3
-rw-r----- 1 mysql mysql 1000867 May 25 10:06 server_audit.log.2
-rw-r----- 1 mysql mysql 1001079 May 25 10:12 server_audit.log.1
-rw-r----- 1 mysql mysql 570568 May 25 10:30 server_audit.log
官方文档关于参数的详细介绍位于https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/,这里简单总结一下这些参数。
server_audit_file_rotations
轮转日志总数,当设为0表示审计日志不轮转。默认值为9。 一般需要根据实际需求进行修改。
server_audit_incl_users
指定哪些用户的活动将记录到审计日志,connect将不受此变量影响,该变量比server_audit_excl_users 优先级高
server_audit_loc_info
这个是插件内部使用的参数,对用户没有什么意义。
· 在早期版本中,用户将其视为只读变量
· 在更高版本中,它对用户不可见。
server_audit_logging
审计功能的开关, ON表示开启审计功能,OFF表示关闭审计功能。
server_audit_mode
标识版本,用于开发测试。对于用户而言,此变量没有任何特殊含义。 它的值主要反映了启动插件所使用的服务器版本,供开发人员用于测试
server_audit_output_type
指定审计日志的类型,有SYSLOG 或FILE两种选择,默认为FILE
server_audit_query_log_limit
记录中查询字符串的长度限制。默认为1024
server_audit_syslog_facility
当审计日志类型为syslog模式时,它定义了将发送到系统日志的记录的“功能”。 以后可以使用此参数过滤日志。
server_audit_syslog_ident
设置ident,作为每个syslog记录的一部分
server_audit_syslog_info
指定的info字符串将添加到syslog记录
server_audit_syslog_priority
定义记录日志的syslogd priority
默认情况下,日志记录设置为OFF。 要启用它,请将server_audit_logging变量设置为ON。请注意,如果启用了查询缓存,并且从查询缓存返回了查询,则由于服务器未打开或访问任何表而是依赖于缓存的结果,因此没有TABLE记录将出现在日志中。 因此,您可能要禁用查询缓存。更多参数的详细信息,参考官方文档https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/
简单测试
# mkdir -p /var/log/mysql_audit
# chown mysql:mysql /var/log/mysql_audit/
在参数文件my.cnf里面修改一些系统变量参数。如下所示
#############################MariaDB Audit Plugin####################################
plugin_load_add = server_audit
server_audit_logging=on
server_audit_events=CONNECT,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML_NO_SELECT
server_audit_file_path="/var/log/mysql_audit/"
server_audit_file_rotate_size=67108864
server_audit_file_rotations=128
#####################################################################################
这些参数只能在MySQL实例重启后才能生效,而生产环境一般也不能随随便便重启,所以策略一般是在修改my.cnf中参数的同时,然后使用命令修改这些插件的变量。
mysql> set global server_audit_file_path="/var/log/mysql_audit/";
Query OK, 0 rows affected (0.05 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_rotations=128;
Query OK, 0 rows affected (0.00 sec)
mysql> set global server_audit_file_rotate_size=67108864;
Query OK, 0 rows affected (0.00 sec)
mysql>set global server_audit_logging=ON;
Query OK, 0 rows affected (0.00 sec)
然后你就能在审计日志中看到相关内容了。简单测试如下所示:
问题小结
1:MariaDB Audit Plugin安装到社区版MySQL,有些版本还有一些问题。因为MySQL版本众多,以及API接口的变化,导致MariaDB Audit Plugin有一些Bug,有一些已经Fix掉了,一些暂时还没有。
https://jira.mariadb.org/browse/MDEV-19396
https://jira.mariadb.org/browse/MDEV-9106
个人在测试时发现,MySQL 8.0.18安装mariadb-5.5.64下的MariaDB Audit Plugin插件是报下面错误:
mysql> INSTALL PLUGIN server_audit SONAME "server_audit.so";
ERROR 1126 (HY000): Can"t open shared library "/usr/lib64/mysql/plugin/server_audit.so" (errno: 2 /usr/lib64/mysql/plugin/server_audit.so: undefined symbol: my_printf_error)
mysql>
2:不少MariaDB一般多使用2.14版glibc进行编译,所以安装插件需要依赖GLIBC_2.14组件
mysql> INSTALL PLUGIN server_audit SONAME "server_audit.so";
ERROR 1126 (HY000): Can"t open shared library "/usr/lib64/mysql/plugin/server_audit.so" (errno: 2 /lib64/libc.so.6: version `GLIBC_2.14" not found (required by /usr/lib64/mysql/plugin/server_audit.so))
mysql>
参考资料:
https://mariadb.com/kb/en/mariadb-audit-plugin-log-settings/
https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/
https://mariadb.com/kb/en/mariadb-audit-plugin-versions/
https://mariadb.com/kb/en/mariadb-audit-plugin/