MySQL数据库审计(server_audit)
需求:客户要求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;