背景
Oracle 的 MySQL 社区版不带审计插件(Audit Plugin),要想使用审计功能,可以用企业版的mysql或其它一些 GPL 协议的审计插件,这里选择 MariaDB 的审计插件来实操。
安装环境
mysql版本:mysql5.7.24
注:经验证使用mysql5.7.34安装该插件存在兼容情况,导致数据库服务运行异常
安装审计插件
MariaDB 的 10.1 版本对应与 Oracle 的 MySQL 5.7,下载下来并解压
下载地址
https://mariadb.com/kb/en/mariadb-server-10-1-46/
复制
解压并找到需要的审计插件
[root@yejf]/opt# tar -zxvf mariadb-10.1.46-linux-systemd-x86_64.tar.gz
[root@yejf]/opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin# ll /opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin/server_audit.so
-rw-r--r-- 1 postgres sdbadmin_group 240K 8月 6 2020 /opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin/server_audit.so复制
查看mysql的插件目录
mysql> show variables like '%plugin_dir';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.00 sec)复制
把这个so文件拷贝到mysql的插件目录
[root@yejf]/opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin# cp /opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin/server_audit.so /usr/local/mysql/lib/plugin/
[root@yejf]/opt/mariadb-10.1.46-linux-systemd-x86_64/lib/plugin# chown -R mysql:mysql /usr/local/mysql/lib/plugin/server_audit.so复制
加载插件
mysql> install plugin server_audit SONAME 'server_audit.so';
Query OK, 0 rows affected (0.00 sec)
--或者编辑/etc/my.cnf添加
[mysqld]
plugin-load=server_audit=server_audit.so复制
查看加载的插件
mysql> show plugins;
+----------------------------+----------+--------------------+-----------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+-----------------+---------+
...
| SERVER_AUDIT | ACTIVE | AUDIT | server_audit.so | GPL |
+----------------------------+----------+--------------------+-----------------+---------+
45 rows in set (0.00 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 |
+-------------------------------+-----------------------+复制
开启审计日志
mysql> set GLOBAL server_audit_logging=on;
Query OK, 0 rows affected (0.00 sec)复制
开启后可以在数据目录下查看生成的审计日志文件
[mysql@yejf mysql5.7data]$ tail -100f server_audit.log 20210722 11:17:26,yejf,root,localhost,2,12,QUERY,,'set GLOBAL server_audit_logging=on',0
复制
在数据库中进行sql操作
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+4 rows in set (0.06 sec)mysql> create database test;Query OK, 1 row affected (0.00 sec)mysql> use test;Database changedmysql> create table tmp as select 1,2,3;Query OK, 1 row affected (0.01 sec)Records: 1 Duplicates: 0 Warnings: 0mysql> exitBye
复制
可以看到所有扣分都会在审计日志中记录,记录的信息包括有时间,服务器主机,用户,ip,对应数据库名及query语句,还有连接的情况
[mysql@yejf mysql5.7data]$ tail -100f server_audit.log 20210722 11:17:26,yejf,root,localhost,2,12,QUERY,,'set GLOBAL server_audit_logging=on',020210722 11:18:37,yejf,root,localhost,2,13,QUERY,,'show databases',020210722 11:18:54,yejf,root,localhost,2,14,QUERY,,'create database test',020210722 11:18:56,yejf,root,localhost,2,15,QUERY,,'SELECT DATABASE()',020210722 11:18:56,yejf,root,localhost,2,17,QUERY,test,'show databases',020210722 11:18:56,yejf,root,localhost,2,18,QUERY,test,'show tables',020210722 11:19:13,yejf,root,localhost,2,19,QUERY,test,'create table tmp as select 1,2,3',020210722 11:21:51,yejf,root,localhost,2,0,DISCONNECT,test,,0
复制
记录的格式是
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]
复制
配置重启生效
前面的设置审计,当数据库重启后就会失效了
[mysql@yejf ~]$ service mysql restartShutting down MySQL.. SUCCESS! Starting MySQL. SUCCESS! [mysql@yejf ~]$ mysql -uroot -prootmysql> 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)
复制
为了能够重启生效,需要把配置添加到配置文件/etc/my.cnf
[root@yejf]~mysql# cat /etc/my.cnf[client]user=rootpassword=rootport = 3306[mysqld]##添加项##server_audit_logging = ON #开启日志记录,默认是关闭server_audit = FORCE_PLUS_PERMANENT #防止插件被卸载server_audit_file_path = server_audit.log #定义审计日志文件名server_audit_file_rotate_now = OFF #是否强制切割审计日志server_audit_file_rotate_size = 1073741824 #定义切割审计日志的文件大小1073741824=1GBserver_audit_file_rotations = 0 #定义审计日志的轮询个数,0为不轮询
复制
参数说明
可参考官网
https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/
复制
server_audit_events
省略值全部事件类型都会记录到审计日志中,可选择事件类型才记录。
如 server_audit_events = query,table,query_ddl,query_dml
事件类型
CONNECT:连接、断开连接和失败的连接,包括错误代码
QUERY:以纯文本形式执行的查询及其结果,包括由于语法或权限错误而失败的查询
TABLE:受查询执行影响的表
QUERY_DDL:与QUERY相同,但只筛选DDL类型的查询(create、alter、drop、rename和truncate语句,create/drop[procedure/function/user]和rename user除外(它们不是DDL)
QUERY_DML:与QUERY相同,但只筛选DML类型的查询(do、call、load data/xml、delete、insert、select、update、handler和replace语句)
QUERY_DCL:与QUERY相同,但只筛选DCL类型的查询(create user、drop user、rename user、grant、revoke和set password语句)
QUERY_DML_NO_SELECT:与QUERY_DML相同,但不记录SELECT查询。(从1.4.4版开始)(do、call、load data/xml、delete、insert、update、handler和replace语句)
server_audit_excl_users
该列表的用户[行为]将不记录,connect信息将不受该设置影响
server_audit_file_path
使用该变量设置存储日志的文件,可以指定目录,默认存放在数据目录的server_audit.log文件中
server_audit_file_rotate_now
是否立即切割日志
server_audit_file_rotate_size
限制日志文件的大小
server_audit_file_rotations
指定日志文件的数量,如果为0日志将从不轮转
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,当为syslog时记录到/var/log/messages
server_audit_query_log_limit
1024
server_audit_syslog_facility
LOG_USER
server_audit_syslog_ident
mysql-server_auditing
mysql-server_auditing
server_audit_syslog_info
server_audit_syslog_priority
LOG_INFO
评论
