首页 > 技术文章 > MySQL数据库审计(server_audit)

NanZhiHan 2022-02-18 14:50 原文

需求:客户要求mysql数据库需要记录数据库‘增删改’操作日志,作为数据库审计使用。

方案:使用MariaDB的server_audit插件来实审计功能。预估日志每日量大概在200M左右,每日切割日志,上传至OBS。

环境:1、MariaDB,版本:10.3.32,主要是用来获取server_audit.so插件。

          2、MySQL,版本:5.7.19,使用pxc搭建在k8s集群中。

 

实现过程:

1、安装MariaDB。

 yum install MariaDB-server

 

2、查找插件

find / -name server_audit.so

 

3、复制插件到k8s集群服务器中,并复制到pxc的主节点pod中(传统部署的mysql跳过这一步)。

kubectl cp server_audit.so pxc-cluster-0:/ 

 

4、进入pod,将server_audit.so插件移动至mysql的plugin目录中并添加权限。

     4.1、进入pxc-cluster-0的pod中(传统部署mysql跳过这一步)。

kubectl exec -it pxc-cluster-0 bash

     4.2、登录mysql,查询plugin目录地址。

mysql -uroot -p******
mysql> show global variables like 'plugin_dir';

     4.3、在pod中,将server_audit.so移动到plugin目录下并修改权限

mv server_audit.so /usr/lib/mysql/plugin/
chmod 777 /usr/lib/mysql/plugin/server_audit.so

 

5、在数据库中执行命令安装插件。

mysql> install plugin server_audit soname 'server_audit.so';

 

6、查看插件当前信息

mysql> show variables like "server_audit%";

     部分配置参数说明:

server_audit_events :设置定记录事件的类型,可以用逗号分隔的多个值如: set global server_audit_events='CONNCET,QUERY';  更多参数值见管网。
server_audit_excl_users :设置不记录用户,但connect信息不受该配置影响。
server_audit_file_path : 记录日志文件名称,可以指定目录,默认存储在数据目录中。
server_audit_file_rotate_now OFF : 手动切割日志,将该值设置为"on"时,日志将被切割,切割完成后,该值自动设置回"OFF"。
server_audit_file_rotate_size : 设置日志文件大小,单位为B,1073741824为1G。 
server_audit_file_rotations : 设置日志文件数量,如果为0,将不会切割文件。
server_audit_incl_users : 设置记录用户,但connect信息不受该配置影响,优先级高于server_audit_excl_users。
server_audit_logging : 插件开关。

     参数详细信息见管网:https://mariadb.com/kb/en/mariadb-audit-plugin-options-and-system-variables/

 

7、命令开启日志记录(重启失效)。

mysql> set global  server_audit_logging=on;

 

8、添加配置文件配置(永久生效,根据个人需求进行配置)。

server_audit_logging = ON        #启动开启日志记录
server_audit = FORCE_PLUS_PERMANENT    #防止插件被卸载
server_audit_file_path = server_audit.log     #设置记录日志文件名称为server_audit.log
server_audit_file_rotate_size = 1073741824 #设置单个日志文件大小最大为1G
server_audit_file_rotations = 15     #设置日志文件保留个数最多为15个
server_audit_events = 'QUERY_DML_NO_SELECT'    #设置记录时间为QUERY_DML_NO_SELECT

 

9、日志记录部署完成

     传统部署的mysql的日志审计,将其他2个节点数据库从4-8步骤全部配置好,有日志记录后就完成了。

     k8s部署的集群则在配置完成一个pod后,找到该pod的容器,将容器commit为新的镜像,最后更换k8s集群中mysql使用的镜像,重启即可。

 

10、编写日志切割和上传obs脚本,这里是针对k8s集群编写的脚本,每个节点都需要配置,不同节点需要进行相应修改。

vim  /opt/obsutil/server_audit.sh

#!/bin/bash
addr="/var/lib/mysql/"
shijian=`date '+%Y%m%d'`
#如果日志文件为空,则不进行切割和上传
filesize=`cd ${addr}; ls -l | grep server_audit.log | awk -F ' ' '{print$5}'`
if [[ "$filesize" == "0" ]]; then
    exit
fi
kubectl -nyg-cmp exec -it pxc-cluster-0  -- mysql -e 'set global server_audit_file_rotate_now=on;' > /dev/null 2>&1
files=`ls $addr | grep 'server_audit.log.'`
for f in $files
do
     /opt/obsutil/obsutil cp ${addr}/$f obs://uat-obs/${shijian}/${f}_1 > /dev/null 2>&1
done
#上传完后,删除所有切割的文件,保证每天上传的日志是不重复的
if [[ "$?" == "0" ]]; then
rm -rf ${addr}/server_audit.log.*
fi

 

11、 设置定时任务,每天晚上11点59分切割日志并上传

crontab -e

59 23 * * *  /bin/sh /opt/obsutil/server_audit.sh

 

12、卸载server_audit(如果设置了防卸载,需要先去掉该配置).

mysql> UNINSTALL PLUGIN server_audit;

 

推荐阅读