利用MariaDB Auditing Plugin实现社区版MySQL的审计功能

本文介绍了如何使用MariaDB Audit Plugin为MySQL实现审计功能。通过详细步骤和配置示例,展示了如何控制不同类型的审计事件记录,包括连接、查询和表操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于MySQL的审计功能,有三个主流的选项:

1、MySQL Enterprise Audit Plugin:仅供MySQL 企业版使用的插件,收费

2、Percona Audit Log Plugin:仅供Percona Server使用的插件,免费

3、MariaDB Audit Plugin:支持MariaDB、MySQL、Percona Server,建议使用1.2以上版本


下面以MariaDB Audit Plugin为例,实现官方社区版MySQL的审计功能

首先需要下载MariaDB的完整安装包,单独的plugin官网已不再提供

将 mariadb-10.2.8-linux-glibc_214-x86_64/lib/plugin/server_audit.so 复制到MySQL的plugin目录下,并修改权限,与其他plugin权限一致

# chown root:mysql server_audit.so 
# chmod 755 server_audit.so


在登录MySQL安装插件前,先确认系统glibc版本是否匹配编译server_audit.so的glibc版本

[root@237_21 plugin]# 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
而MariaDB多使用2.14版glibc进行编译,以下简单记录下glibc的升级过程
# 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
# LD_PRELOAD=/lib/libc-2.12.so yum -y install glibc-devel
# strings libc.so | 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


安装插件
mysql> install plugin server_audit soname 'server_audit.so';
Query OK, 0 rows affected (0.01 sec)

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.01 sec)

编辑my.cnf,添加审计规则,关键参数如下:

server_audit_logging:审计功能的开关

server_audit_file_path:审计日志路径,默认存于数据目录下

server_audit_events:指定记录到日志的event类型,Type如下:

CONNECT、QUERY、TABLE、(1.2版本起新增QUERY_DDL,QUERY_DML,1.3版本起新增QUERY_DCL)

server_audit_incl_users:该列表中用户的行为将记录日志,但Type:CONNECT的event仍然会记录不受该参数影响。优先级较server_audit_excl_users高(同一个用户在incl和excl中都存在,以incl为准)

server_audit_excl_users:该列表中用户的行为将不记录日志,但Type:CONNECT的event仍然会记录不受该参数影响

以下为日志轮转(循环复用)设置,需设置server_audit_output_type:FILE-mode

server_audit_file_routations:轮转日志总数,当设为0表示审计日志不轮转。默认值为9

server_audit_file_rotate_size:限制单个轮转审计日志大小,超出该限值后自动轮转

server_audit_file_rotate_now:强制轮转一次

注:server_audit_output_type:SYSLOG-mode相关参数使用较少,不作介绍,参数信息可见文末参考文档


对上述参数简单测试一下:user1、user2、user3(不存在的用户)分别登录数据库,执行QUERY(show databases;),退出数据库

1、my.cnf配置:用户user1的行为记录审计日志,用户user2的行为不记录审计日志:

plugin_dir=/usr/local/mysql3306/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;server_audit=server_audit.so"
########audit plugin########
server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_incl_users = 'user1'
server_audit_excl_users = 'user2'

使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:00:53,237_21,user1,127.0.0.1,4,0,CONNECT,,,0
20170915 10:00:53,237_21,user1,127.0.0.1,4,74,QUERY,,'select @@version_comment limit 1',0
20170915 10:01:03,237_21,user1,127.0.0.1,4,75,QUERY,,'show databases',0
20170915 10:01:21,237_21,user1,127.0.0.1,4,0,DISCONNECT,,,0
20170915 10:01:26,237_21,user2,127.0.0.1,5,0,CONNECT,,,0
20170915 10:01:26,237_21,user2,127.0.0.1,5,77,QUERY,,'select @@version_comment limit 1',0
20170915 10:01:31,237_21,user2,127.0.0.1,5,78,QUERY,,'show databases',0
20170915 10:01:33,237_21,user2,127.0.0.1,5,0,DISCONNECT,,,0
20170915 10:01:42,237_21,user3,127.0.0.1,6,0,FAILED_CONNECT,,,1045
20170915 10:01:42,237_21,user3,127.0.0.1,6,0,DISCONNECT,,,0 

user1、user2除了CONNECT信息之外,还记录QUERY信息,excl_参数设置无效。


2、my.cnf配置:用户user2的行为设置为不记录审计日志,server_audit_incl_users不作设置:

server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
#server_audit_incl_users = 'user1'
server_audit_excl_users = 'user2'

使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:47:59,237_21,user1,127.0.0.1,1,0,CONNECT,,,0
20170915 10:47:59,237_21,user1,127.0.0.1,1,1,QUERY,,'select @@version_comment limit 1',0
20170915 10:48:14,237_21,user1,127.0.0.1,1,2,QUERY,,'show databases',0
20170915 10:48:16,237_21,user1,127.0.0.1,1,0,DISCONNECT,,,0
20170915 10:48:34,237_21,user2,127.0.0.1,2,0,CONNECT,,,0
20170915 10:48:40,237_21,user2,127.0.0.1,2,0,DISCONNECT,,,0
20170915 10:48:46,237_21,user3,127.0.0.1,3,0,FAILED_CONNECT,,,1045
20170915 10:48:46,237_21,user3,127.0.0.1,3,0,DISCONNECT,,,0
user1记录CONNECT、QUERY信息,user2仅记录CONNECT,user3登录失败的信息也被记录


3、user1记录审计日志,excl_参数不作设置

server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_incl_users = 'user1'
#server_audit_excl_users = 'user2'
使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:54:24,237_21,user1,127.0.0.1,1,0,CONNECT,,,0
20170915 10:54:24,237_21,user1,127.0.0.1,1,1,QUERY,,'select @@version_comment limit 1',0
20170915 10:54:29,237_21,user1,127.0.0.1,1,2,QUERY,,'show databases',0
20170915 10:54:31,237_21,user1,127.0.0.1,1,0,DISCONNECT,,,0
20170915 10:54:36,237_21,user2,127.0.0.1,2,0,CONNECT,,,0
20170915 10:54:44,237_21,user2,127.0.0.1,2,0,DISCONNECT,,,0
20170915 10:54:47,237_21,user3,127.0.0.1,3,0,FAILED_CONNECT,,,1045
20170915 10:54:47,237_21,user3,127.0.0.1,3,0,DISCONNECT,,,0

user1记录CONNECT、QUERY信息,user2仅记录CONNECT,user3登录失败的信息也被记录


过滤参数效果总结如下:
1、若同时设置server_audit_incl_users和server_audit_excl_users,所有用户的审计都会被记录
2、若仅设置:server_audit_excl_users时,excl_users将仅记录CONNECT日志,其余用户记录server_audit_events规定的日志类型
3、若仅设置:server_audit_incl_users时,incl_users将记录server_audit_events规定的日志类型,其余用户仅记录CONNECT日志
4、不存在的用户登录数据库时也会记录CONNECT日志


参考文档:

1、MySQL Auditing with MariaDB Auditing Plugin

https://www.percona.com/blog/2016/02/15/mysql-mariadb-with-mariadb-auditing-plugin/

2、MariaDB Audit Plugin - Log Settings

https://mariadb.com/kb/en/library/mariadb-audit-plugin-log-settings/

3、MariaDB Audit Plugin - System Variables

https://mariadb.com/kb/en/library/mariadb-audit-plugin-system-variables/



<think>我们面对的问题是:在MySQL 8中安装MariaDB的server_audit插件时出现错误,提示“undefined symbol PSI_server”。这是因为MySQL 8和MariaDB的插件在内部符号上存在不兼容。 根据引用[2]和引用[3]的信息,我们知道MariaDB审计插件可以用于MySQL,但需要特别注意版本兼容性。在MySQL 5.7中,使用MariaDB 10.6版本的插件会出现问题,而我们现在是MySQL 8,问题可能更复杂。 错误信息“undefined symbol PSI_server”表明插件在尝试调用MySQL服务器内部的一个符号(PSI_server)时找不到。这通常是因为插件的编译环境(MariaDB)与运行环境(MySQL 8)的符号表不一致。 ### 解决方案 #### 方法1:使用与MySQL 8兼容的MariaDB审计插件版本 1. **获取正确的插件版本**:需要下载与MySQL 8兼容的MariaDB审计插件。根据引用[3]的提示,我们可以尝试使用MariaDB 10.5版本的插件(因为10.5相对稳定且可能兼容性较好)。但注意,MySQL 8的内部API变化较大,可能没有直接兼容的版本。 2. **下载步骤**(以MariaDB 10.5为例): ```bash # 下载MariaDB 10.5的二进制包(注意选择与MySQL 8相同的操作系统架构,如x86_64) wget https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.5.3/bintar-linux-x86_64/mariadb-10.5.3-linux-x86_64.tar.gz tar -zxvf mariadb-10.5.3-linux-x86_64.tar.gz ``` 3. **提取插件**: ```bash # 在解压后的目录中查找server_audit.so find mariadb-10.5.3-linux-x86_64 -name "server_audit.so" # 假设找到的路径是:mariadb-10.5.3-linux-x86_64/lib/plugin/server_audit.so cp mariadb-10.5.3-linux-x86_64/lib/plugin/server_audit.so /usr/local/mysql/lib/plugin/ chown mysql:mysql /usr/local/mysql/lib/plugin/server_audit.so ``` 4. **加载插件**: ```sql INSTALL PLUGIN server_audit SONAME 'server_audit.so'; ``` 如果仍然出现相同的错误,则说明这个版本也不兼容。 #### 方法2:使用Percona的审计插件(推荐) 由于MariaDB插件在MySQL 8上兼容性问题较多,建议使用Percona的审计插件(如果使用的是Percona Server)或者使用MySQL企业版的审计插件(需要企业版许可)。但如果是社区版,可以考虑使用Percona的插件。 1. **下载Percona Audit Plugin**: 访问Percona的下载页面,找到与MySQL 8.0兼容的版本。例如,从Percona Server for MySQL 8.0中提取插件。 2. **提取插件**: 安装Percona Server(或仅下载二进制包),然后从`/usr/lib/percona-server/plugin/`(具体路径根据安装)中获取`audit_log.so`。 3. **复制到MySQL插件目录**: ```bash cp audit_log.so /usr/local/mysql/lib/plugin/ chown mysql:mysql /usr/local/mysql/lib/plugin/audit_log.so ``` 4. **加载插件**: ```sql INSTALL PLUGIN audit_log SONAME 'audit_log.so'; ``` #### 方法3:使用MySQL社区版替代方案 如果以上方法都不可行,可以考虑使用以下替代方案记录登录信息: 1. **通用日志(General Log)**:记录所有查询,包括连接。 ```sql SET GLOBAL general_log = 'ON'; SET GLOBAL log_output = 'TABLE'; ``` 然后从`mysql.general_log`表中查询连接事件。 2. **使用init_connect配置**(仅记录普通用户的连接): ```ini [mysqld] init_connect='INSERT INTO audit.access_log (user, host, login_time) VALUES (CURRENT_USER(), SUBSTRING_INDEX(USER(),"@",-1), NOW())' ``` 注意:需要先创建审计表,并且超级用户不会执行`init_connect`。 ### 错误排查 如果尝试加载插件时出现错误,可以通过以下命令查看详细的错误信息: ```bash # 使用ldd检查依赖 ldd /path/to/server_audit.so # 使用nm检查符号 nm -D /path/to/server_audit.so | grep PSI_server ``` 如果确实缺少符号,可能需要重新编译插件或寻找其他兼容版本。 ### 总结 由于MySQL 8的内部API与MariaDB存在差异,直接使用MariaDB审计插件可能不可行。建议: 1. 优先尝试Percona的审计插件(如果使用Percona Server)。 2. 使用MySQL企业版审计插件(如果有许可)。 3. 采用通用日志或init_connect作为替代方案。 > ⚠️ **注意**:修改插件目录文件前,请备份数据并确保MySQL服务已停止。 --- ### 参考引用 - [^1] MySQL升级后插件安装报错问题 - [^2] MySQL 5.7安装MariaDB审计插件的注意事项 - [^3] MariaDB审计插件与MySQL的兼容性说明 - [^4] MySQL 5.6审计功能实现方法 §§相关问题§§ 1. 如何检查MySQL插件的依赖项? 2. Percona审计插件在MySQL社区版中的安装步骤是什么? 3. 使用通用日志记录登录信息对性能的影响如何? 4. 如何配置MySQL的init_connect来记录用户登录?</think>### 解决MySQL 8安装MariaDB审计插件报错:`undefined symbol PSI_server` #### 问题分析 在MySQL 8中安装MariaDB的`server_audit.so`插件时出现`undefined symbol PSI_server`错误,这是因为: 1. **API不兼容**:MySQL 8重构了性能模式接口(Performance Schema Interface),移除了`PSI_server`等旧符号[^2][^3] 2. **版本差异**:MariaDB插件针对MariaDB环境编译,与MySQL 8的ABI(应用二进制接口)不匹配 3. **符号缺失**:`PSI_server`是MariaDB内部使用的性能监控符号,在MySQL 8中已被替代或移除 --- ### 解决方案(分步操作) #### 方法1:使用兼容的Percona审计插件(推荐) ```bash # 下载Percona审计插件(兼容MySQL 8) wget https://downloads.percona.com/downloads/percona-server/Percona-Server-8.0.31-23/binary/tarball/Percona-Server-8.0.31-23-Linux.x86_64.glibc2.28-minimal.tar.gz # 解压并提取插件 tar -xzf Percona-Server-*.tar.gz find ./ -name audit_log.so # 查找插件路径 cp percona-server/lib/plugin/audit_log.so /usr/lib/mysql/plugin/ # 加载插件 mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so'; ``` #### 方法2:从源码编译兼容插件 ```bash # 1. 下载MariaDB 10.5源码(最后兼容MySQL的版本) wget https://downloads.mariadb.org/interstitial/mariadb-10.5.23/source/mariadb-10.5.23.tar.gz # 2. 编译审计插件 tar -xzf mariadb-10.5.23.tar.gz cd mariadb-10.5.23/plugin/server_audit cmake . -DMYSQL_INCLUDE_DIR=/usr/include/mysql -DMYSQL_LIB_DIR=/usr/lib/mysql make # 3. 替换符号(关键步骤) perl -i -pe 's/PSI_server/PSI_v1/g' server_audit.c make # 重新编译 # 4. 部署插件 cp server_audit.so /usr/lib/mysql/plugin/ chown mysql:mysql /usr/lib/mysql/plugin/server_audit.so ``` #### 方法3:使用MySQL原生审计功能(无需插件) ```sql -- 启用原生审计MySQL 8.0.16+) SET GLOBAL audit_log_policy = 'ALL'; SET GLOBAL audit_log_format = 'JSON'; SET GLOBAL audit_log_file = '/var/log/mysql_audit.log'; -- 查看日志 SELECT * FROM mysql.audit_log_filter; SELECT * FROM mysql.audit_log_user; ``` --- ### 关键配置说明 1. **符号替换原理** MySQL 8使用`PSI_v1`替代了`PSI_server`接口[^3],需修改源码: ```c // 修改前 extern PSI_server_service_t PSI_server; // 修改后 extern PSI_server_service_t PSI_v1; ``` 2. **权限要求** ```sql GRANT AUDIT_ADMIN ON *.* TO 'audit_user'@'localhost'; ``` 3. **验证安装** ```sql SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%audit%'; ``` 4. **审计日志示例** ```json { "timestamp": "2023-08-21T09:30:45Z", "user": "admin", "host": "192.168.1.10", "action": "connect", "status": 0 } ``` --- ### 替代方案对比 | 方案 | 兼容性 | 维护难度 | 功能完整性 | |---------------------|--------|----------|------------| | Percona插件 | ★★★★☆ | ★★☆☆☆ | ★★★★★ | | 修改后的MariaDB插件 | ★★★☆☆ | ★★★★★ | ★★★★☆ | | MySQL原生审计 | ★★★★★ | ★☆☆☆☆ | ★★★★☆ | > 📌 **建议**:生产环境优先使用Percona插件或MySQL原生审计,开发环境可尝试源码编译方案[^2][^3]。 --- ### 常见问题排查 1. **加载失败** ```bash # 检查依赖 ldd /usr/lib/mysql/plugin/server_audit.so | grep "not found" ``` 2. **日志不记录** ```sql -- 检查审计状态 SHOW GLOBAL VARIABLES LIKE 'audit%'; ``` 3. **性能影响** 在my.cnf添加限制: ```ini [mysqld] audit_log_rotate_on_size=100M # 限制日志大小 audit_log_exclude_accounts=backup@localhost # 排除特定账号 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值