一、说明
如果下载MySQL源码或者社区版,里面是没有审计日志插件的,可以考虑从别的数据库产品中引入审计日志插件。本文为MySQL5.7.32源码添加percona-server5.7中的审计日志插件——audit_log的源码。
如果只是想使用审计日志插件,而不需要自己编译源码,那么mariadb5.5.68的server_audit也是可用的。从mariadb的官网上下载linux版本的安装包,解压后直接把lib/plugin/server_audit.so放到MySQL的plugin-dir目录下。
操作系统:Linux;MySQL版本:5.7.32(源码);percona-server版本:5.7(源码)
MySQL下载:https://dev.mysql.com/downloads/mysql/
Percona-server下载:percona-server/plugin at 5.7 · percona/percona-server · GitHub
二、步骤
2.1添加audit_log目录
percona中的/plugin/audit_log目录,拷贝到mysql的对应位置(audit_log下面的tests不要);
接下来参考percona,修改mysql中的源码;
在mysql的include/mysql/plugin.h第661行添加THDVAR_SET定义;
sql/sql_plugin.cc第3148行添加函数plugin_thdvar_safe_update定义,最好连同注释也添加进来;
sql/sql_plugin.h第173行之后添加plugin_thdvar_safe_update声明;
plugin/audit_log/CMakeLists.txt中有关make install的部分删除。
至此,mysql源码已经可以cmake、make、make install了。
2.2添加测试用例
创建mysql-test/suite/audit_log目录,里面再创建include、t、r三个文件夹;
percona的/plugin/audit_log/tests/mtr目录下的文件拷贝到上面那三个目录里,*.inc放入include,*.test和*.opt放入t,*.result放入r;
mysql-test/suite/audit_log下所有执行--source的地方,需要参考mysql其他测试用例替换inc文件的路径;建议使用带有搜索功能的编辑器,比如vscode;
mysql-test/include/plugin.defs中添加audit_log相关的参数,也就是添加一行:
audit_log plugin_audit_log AUDIT_LOG audit_log
至此,mysql源码编译过后可以运行audit_log的测试用例了。需要有测试用例,才能知道还有什么bug,才能去修复。
2.3修复bug
2.3.1解决COMMAND_CLASS为error的问题
sql/sql_audit.cc中,修改mysql_audit_notify函数,与percona保持一致;最前面include "sql_parse.h";
sql/sql_parse.cc中添加get_command_name_len定义;
sql/sql_parse.h中添加get_command_name_len声明。
2.3.2解决存储过程和触发器语句不记录的问题
sql/sp_instr.cc中include "sql_audit.h";866行,execute函数中添加audit_log_notify。
2.3.4解决audit_null测试用例的问题
mysql-test/suite/audit_null/t/audit_plugin_2.test,用percona对应的文件替换;
mysql-test/suite/audit_null/r/audit_plugin_2.result,用percona对应的文件替换。
2.3.5其他bug
其他bug可自行修复或者删除测试用例。
audit_log.audit_log_filter_users和audit_log.percona_bug_ps3867中有master_port大小写的问题;
audit_log.audit_log,mysql中应该没有这种语法;
audit_log.audit_log_default_db,change_user没有失败不重连的参数,因此断开后会尝试重连;
audit_log.audit_log_threadpool,thread_handling支持one-thread-per-connection或no-threads,不支持percona的pool-of-threads,也不支持需要线程池插件的loaded-dynamically。
还有一个关于客户端的bug。创建一个数据库test。用户使用mysql客户端连接时,执行use test,audit_log不会记录数据库。如果给数据库名加上 ` ,也就是执行use `test`,才会记录数据库。使用odbc、jdbc、或者其他直接调用sql_common接口的程序连接数据库则不会有这种问题。
三、关于audit_log_rotate_on_size和audit_log_rotations
关于audit_log的所有参数说明,可以看官网:Audit Log Plugin - Percona Server for MySQL
有关audit_log_rotate_on_size和audit_log_rotations这两个参数,最初并没有完全理解什么意思。自己做了一下实验,写一下自己的理解。
audit_log支持设置文件轮换数量和文件大小上限。如果设置了文件大小上限,则当一个日志文件大小达到上限之后,将该文件重命名,送入轮换队列,然后新建一个文件去记录审计日志。当前正在记录日志的文件,重命名时其后面加上“.1”。轮回队列中的其余文件也会重命名,其后面的数字标号加一。
如果设置了文件轮换数量,则当轮换队列中的文件数超过设置的数量时,丢弃最旧的那个文件,也就是标号最大的文件。
假设审计日志文件名为audit.log,文件大小上限为16KB(16384),轮换数量为2,则使用audit.log记录日志。audit.log达到上限后重命名为audit.log.1,然后新建一个audit.log去记录日志。旧的audit.log.1重命名为audit.log.2,旧的audit.log.2会被丢弃。
文章来源:https://www.toymoban.com/news/detail-778761.html
文章来源地址https://www.toymoban.com/news/detail-778761.html
到了这里,关于MySQL添加审计日志插件audit_log的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!