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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM