一、概述
审计插件是包含在Percona Server for MySQL中的,所以需要先下载,然后将audit_log.so审计插件 copy 出来。
对应mysql版本必须完全一致,如果不一致,可能会导入报错
下载地址
https://www.percona.com/downloads
Percona Server for MySQL选择和自己当前使用的mysql同版本
二、具体配置
1、审计安装
将audit_log.so上传到mysql的basedir下面的lib/plugin目录下
注意权限设置成755,注意用户和mysql服务启动用户一致
#导入插件到配置文件
vi my.cnf
plugin-load=audit_log.so
#或者直接命令导入插件
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
3、配置完就会将操作信息写入datadir目录下的server_audit.log
2、常用参数
SHOW variables LIKE 'audit%';
+-----------------------------+---------------+
| Variable_name | Value |
+-----------------------------+---------------+
| audit_log_buffer_size | 1048576 |
| audit_log_exclude_accounts | |
| audit_log_exclude_commands | |
| audit_log_exclude_databases | |
| audit_log_file | audit.log |
| audit_log_flush | OFF |
| audit_log_format | OLD |
| audit_log_handler | FILE |
| audit_log_include_accounts | |
| audit_log_include_commands | |
| audit_log_include_databases | |
| audit_log_policy | ALL |
| audit_log_rotate_on_size | 0 |
| audit_log_rotations | 0 |
| audit_log_strategy | ASYNCHRONOUS |
| audit_log_syslog_facility | LOG_USER |
| audit_log_syslog_ident | percona-audit |
| audit_log_syslog_priority | LOG_INFO |
+-----------------------------+---------------+
参考地址:
https://docs.percona.com/percona-server/8.0/audit-log-plugin.html
2.1、audit_log_buffer_size
审计日志缓冲区大小,当audit_log_strategy生效(audit_log_handler 为 'FILE')
且设置为ASYNCHRONOUS、PERFORMANCE时生效。audit_log_buffer_size 的大小设置需要是4096的正整数倍。
2.2、audit_log_include_accounts/audit_log_exclude_accounts
指定记录包含/不包含的用户的审计日志,取值逗号分隔
如果设置include或者exclude,则另一个变量不能设置任何值,只能将设置值的变量置NULL后才能设置另一个变量的值,反之亦然。
注意:设置过滤后,在已经存在的服务器连接中不生效,需要重新连接才生效。
2.3、audit_log_include_commands/audit_log_exclude_commands
指定记录包含/不包含的命令类型的审计日志,取值逗号分隔
如果设置include或者exclude,则另一个变量不能设置任何值,只能将设置值的变量置NULL后才能设置另一个变量的值,反之亦然。
SELECT name FROM performance_schema.setup_instruments WHERE name LIKE "statement/sql/%" ORDER BY name;
+---------------------------------------+
| name |
+---------------------------------------+
| statement/sql/alter_db |
| statement/sql/alter_db_upgrade |
| statement/sql/alter_event |
| statement/sql/alter_function |
| statement/sql/alter_instance |
| statement/sql/alter_procedure |
| statement/sql/alter_server |
| statement/sql/alter_table |
| statement/sql/alter_tablespace |
| statement/sql/alter_user |
| statement/sql/analyze |
| statement/sql/assign_to_keycache |
| statement/sql/begin |
| statement/sql/binlog |
| statement/sql/call_procedure |
| statement/sql/change_db |
……
| statement/sql/xa_rollback |
| statement/sql/xa_start |
+---------------------------------------+
2.4、audit_log_include_databases/audit_log_exclude_databases
指定记录包含/不包含的DB的审计日志,取值逗号分隔
如果设置include或者exclude,则另一个变量不能设置任何值,只能将设置值的变量置NULL后才能设置另一个变量的值,反之亦然。
只有当Query访问对应过滤条件audit_log_include_databases和audit_log_exclude_databases内的表时,过滤条件才生效,比如:
设置了audit_log_exclude_databases=test,那么只有query成功访问了test库中的表时,过滤条件才会生效。
访问表的命令类型包括:SQLCOM_REPLACE_SELECT、SQLCOM_INSERT_SELECT、SQLCOM_INSERT、SQLCOM_REPLACE、SQLCOM_LOAD、SQLCOM_DELETE、
SQLCOM_DELETE_MULTI、SQLCOM_TRUNCATE、SQLCOM_UPDATE、SQLCOM_UPDATE_MULTI、SQLCOM_SELECT和SQLCOM_HA_READ。
2.5、audit_log_include_tables/audit_log_exclude_tables(新增)
指定记录包含/不包含的table的审计日志,取值逗号分隔
如果设置include或者exclude,则另一个变量不能设置任何值,只能将设置值的变量置NULL后才能设置另一个变量的值,反之亦然。
只有当Query访问对应过滤条件audit_log_include_tables和audit_log_exclude_tables内的表时,过滤条件才生效,比如:
设置了audit_log_exclude_tables=test,那么只有query成功访问了test表时,过滤条件才会生效。
访问表的命令类型包括:SQLCOM_REPLACE_SELECT、SQLCOM_INSERT_SELECT、SQLCOM_INSERT、SQLCOM_REPLACE、SQLCOM_LOAD、SQLCOM_DELETE、
SQLCOM_DELETE_MULTI、SQLCOM_TRUNCATE、SQLCOM_UPDATE、SQLCOM_UPDATE_MULTI、SQLCOM_SELECT和SQLCOM_HA_READ
另外还需要注意:如果同时设置了audit_log_include_databases/audit_log_exclude_databases和audit_log_include_tables/audit_log_exclude_tables参数,
它们是条件与的关系。比如同时include库test 表t1,则只有操作test.t1表才会记录审计日志。
2.6、audit_log_file
指定审计日志路径及文件名称,路径可为相对路径或绝对路径。
2.7、audit_log_flush
手动日志归档,只有在audit_log_rotate_on_size=0的时候生效,在手工重命名审计日志归档后,可以指定audit_log_flush=ON来打开新的审计日志。
例如:已经记录的审计日志文件mysql-audit.log,当需要手动归档的时候先将mysql-audit.log修改成其他名字mysql-audit-bak.log,
此时日志仍会被记录在修改名字后的文件中mysql-audit-bak.log,通过设置set global audit_log_flush = ON;
会新打开审计日志mysql-audit.log继续记录日志。
2.8、audit_log_format
指定日志格式:OLD, NEW, JSON 和 CSV。
OLD和NEW都是XML格式,NEW要比OLD的标签详细一些。这四种格式记录的内容是相同的。
2.9、audit_log_fsync_size(新增)
审计日志文件缓冲区大小,当审计日志文件缓冲区内的日志大小超过阈值时调用fsync刷盘。
当audit_log_handler 为 'FILE' 并且 audit_log_strategy设置为ASYNCHRONOUS或者PERFORMANCE时生效。
audit_log_fsync_size大小设置需要为4096的整数倍,
如果是0则不主动fsync,用操作系统的默认刷盘机制pdflush线程定期/proc/sys/vm/dirty_expire_centisecs(单位是1/100秒,默认3000)刷新变脏时间超过dirty_expire_centisecs的页面到磁盘。
该参数可以调整日志刷盘的频率,调整性能波动。
2.10、audit_log_handler
指定审核日志保存形式:FILE或者SYSLOG。
参数audit_log_strategy, audit_log_buffer_size, audit_log_fsync_size , audit_log_rotate_on_size, 和audit_log_rotations 只有在审计日志是FILE的情况下才生效。
参数 audit_log_syslog_ident, audit_log_syslog_facility,和audit_log_syslog_priority只在审计日志是SYSLOG的情况才生效。
2.11、audit_log_policy
指定审计日志记录的事件,设置为NONE关闭记录审计日志,性能与未开启审计一致。
ALL - 记录所有事件
LOGINS - 只记录登录连接事件
QUERIES - 只记录SQL事件
NONE - 不记录任何事件
2.12、audit_log_rotate_on_size
指定最大审计日志大小,超过日志文件将会循环。
变量生效条件,audit_log_handler 为 'FILE'并且audit_log_rotations大于0。audit_log_rotate_on_size 的大小设置需要是4096的正整数倍。
2.13、audit_log_rotations
指定保存审计日志个数,变量生效条件,audit_log_handler 为 'FILE'并且audit_log_rotate_on_size大于0。
2.14、audit_log_strategy
指定审计日志的刷新策略,只有在 audit_log_handler 为 'FILE' 时该变量才生效。
ASYNCHRONOUS - 异步刷新,使用内存缓冲区,缓冲区满时不删除消息
PERFORMANCE - 使用内存缓冲区,缓冲区满时删除消息
SEMISYNCHRONOUS - 直接写入到文件中,通过操作系统刷新同步事件
SYNCHRONOUS - 直接写入到文件中,实时同步刷新事件
2.15、audit_log_syslog_facility
指定syslog的facility值。参数取值说明与参考文档2中的描述一致。
2.16、audit_log_syslog_ident
2.17、audit_log_syslog_priority
指定syslog的priority值。参数取值说明与参考文档2中的描述一致。
2.18、audit_log_timestamps(新增)
3、审计卸载
uninstall plugin audit_log;
插件状态从Active变为Delete,重启mysql后插件消失
如果是配置文件,删掉对应配置重启就行
4、试验
1、配置参数
plugin-load=audit_log.so
audit_log_format=json
audit_log_handler=file
audit_log_policy=logins #只记录登入登出
audit_log_file=/data/mysql/audit.log
2、试验记录
没有开关,加载插件就开始自动记录审计日志
从库连接主库信息会记录到主库审计
从库同步主库事务,不会写入从库审计文件
日志删除不会自动生成,重启后解决,依旧可以cat /dev/null > /data/mysql/audit.log清理
如果命令没有进入某个库,则退出时审计日志db为空,如果命令进入某个库,退出时审计日志db为那个库名
日志时间差了8个小时,新的参数audit_log_timestamps可以解决,但是8.0.25不支持,使用高版本的加载插件直接报错
日志格式有四种,算是一个不错的选择