MySQL添加审计日志插件audit_log

一、说明

       如果下载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会被丢弃。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值