MySQL審計插件介紹

前言:

數(shù)據(jù)庫審計功能主要將用戶對數(shù)據(jù)庫的各類操作行為記錄審計日志,以便日后進(jìn)行跟蹤、查詢、分析,以實現(xiàn)對用戶操作的監(jiān)控和審計。審計是一項非常重要的工作,也是企業(yè)數(shù)據(jù)安全體系的重要組成部分,等保評測中也要求有審計日志。對于 DBA 而言,數(shù)據(jù)庫審計也極其重要,特別是發(fā)生人為事故后,審計日志便于我們進(jìn)行責(zé)任追溯,問題查找。

1. MySQL 社區(qū)版審計日志現(xiàn)狀

如果你用的是 MySQL 社區(qū)版的話,你會發(fā)現(xiàn) MySQL 官方并沒有提供嚴(yán)格意義上的審計日志。雖然 MySQL 提供有 binlog 及 general log ,這二者雖然具備部分審計功能,但一般不當(dāng)做審計日志來看待。

binlog 即二進(jìn)制日志文件,它記錄了數(shù)據(jù)庫所有執(zhí)行的 DDL 和 DML 語句(除了數(shù)據(jù)查詢語句select、show等),以事件形式記錄并保存在二進(jìn)制文件中。雖然能查到具體 SQL 的執(zhí)行記錄,但其作用主要是主從復(fù)制,并不能當(dāng)做是審計日志。

general log 是全量日志,開啟后將會記錄所有到達(dá) MySQL Server 的SQL語句。一般不會開啟此日志,因為 log 的量會非常龐大,對數(shù)據(jù)庫性能有影響,并且 general log 會記錄大量無用信息,當(dāng)做審計日志的話,后期篩選有難度。

那么 MySQL 社區(qū)版應(yīng)該怎樣進(jìn)行審計呢?查閱資料我們發(fā)現(xiàn)通過安裝審計插件可實現(xiàn) MySQL 的審計功能,常見的審計插件有 MariaDB Audit Plugin、Percona Audit Log Plugin、McAfee MySQL Audit Plugin 三種,MariaDB 自帶的審計插件比較適合用于 MySQL 社區(qū)版,下面我們來學(xué)習(xí)下如何使用審計插件來實現(xiàn)審計功能。

2. 審計插件使用教程

首先我們要做的是從 MariaDB 安裝包中拷貝出來審計插件,需要注意的是操作系統(tǒng)要選擇一致,比如說你的 MySQL 安裝在 CentOS 系統(tǒng)中,那就要下載 CentOS 系統(tǒng)的 MariaDB 安裝包并從中拷貝,Windows 系統(tǒng)則需要下載對應(yīng)系統(tǒng)的審計插件。

MariaDB 審計插件的名稱是 server_audit.so(Windows系統(tǒng)下是 server_audit.dll ),要注意的是,審計插件一直在更新,不同版本的審計插件功能也不同,推薦使用 >= 1.4.4 版本的插件,新版本的插件可以排除掉 select 語句。不同版本的審計插件支持的審計事件如下圖:

image.png

審計插件版本與 MariaDB 版本對應(yīng)圖如下:

image.png

MySQL 5.7 一般可對應(yīng) MariaDB 10.2 版本,我們以 CentOS 系統(tǒng) MySQL 5.7 版本為例來安裝下審計插件。我這里選擇下載的是 MariaDB 10.2.38 版本的安裝包(審計插件版本 1.4.13),下載地址:https://downloads.mariadb.com/MariaDB/mariadb-10.2.38/bintar-linux-x86_64/mariadb-10.2.38-linux-x86_64.tar.gz

下載完成之后,解壓安裝包,然后到 mariadb-10.2.38-linux-x86_64/lib/plugin/ 路徑下復(fù)制出來 server_audit.so 文件,將其拷貝到 MySQL 服務(wù)器上,具體步驟如下:

# 查看 MySQL 插件存放路徑
mysql> show variables like 'plugin_dir';
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+

# 將審計插件 server_audit.so 存放到該路徑下
[root@localhost plugin]# ls -lh server_audit.so 
-rw-r--r--. 1 root root 191K May  4  2021 server_audit.so

# 更改插件屬主及權(quán)限
[root@localhost plugin]# chown mysql:mysql server_audit.so
[root@localhost plugin]# chmod 755 server_audit.so
[root@localhost plugin]# ls -lh server_audit.so 
-rwxr-xr-x. 1 mysql mysql 191K May  4  2021 server_audit.so

以上均為準(zhǔn)備內(nèi)容,為方便各位小伙伴,點(diǎn)擊下面鏈接即可單獨(dú)下載 Linux 64 位系統(tǒng)的 1.4.13 版本的審計插件:
云盤鏈接: https://pan.baidu.com/s/1HO5sjKb5zpj3CiyRulV5bw?pwd=r85k 提取碼: r85k 。下面我們來開始正式安裝。

# 進(jìn)入數(shù)據(jù)庫安裝審計插件
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
Query OK, 0 rows affected (0.07 sec)

mysql> show plugins;
+----------------------------+--------+--------------------+-----------------+---------+
| Name                       | Status | Type               | Library         | License |
+----------------------------+--------+--------------------+-----------------+---------+
...
| SERVER_AUDIT               | ACTIVE | AUDIT              | server_audit.so | GPL     |
+----------------------------+--------+--------------------+-----------------+---------+

# 查看 audit 初始參數(shù)配置
mysql> show variables like '%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> set global server_audit_events='connect,table,query_ddl,query_dcl,query_dml_no_select';
Query OK, 0 rows affected (0.00 sec)

mysql> set global server_audit_file_path ='/data/mysql/logs/server_audit.log';
Query OK, 0 rows affected (0.00 sec)

mysql> set global server_audit_file_rotate_size=104857600;
Query OK, 0 rows affected (0.01 sec)

# [mysqld]下添加以下配置 使得永久生效
server_audit=FORCE_PLUS_PERMANENT
server_audit_logging=ON
server_audit_file_path=/data/mysql/logs/server_audit.log         
server_audit_events=connect,table,query_ddl,query_dcl,query_dml_no_select
server_audit_file_rotate_size=104857600

通過以上步驟,我們已經(jīng)完成審計插件的安裝與配置,參照官方文檔,我們來了解下主要配置參數(shù)的作用:

image.png

以上參數(shù)還是很容易理解的,下面我們進(jìn)行增刪改查測試,看下審計日志具體記錄的內(nèi)容:

# 進(jìn)行操作后 查看審計日志內(nèi)容
20220512 15:17:17,mysqlhost2,test_user,10.30.21.95,118,0,FAILED_CONNECT,,,1045
20220512 15:17:30,mysqlhost2,test_user,10.30.21.95,119,0,FAILED_CONNECT,,,1045
20220512 15:20:26,mysqlhost2,test_user,10.30.21.95,124,0,CONNECT,,,0
20220512 15:20:49,mysqlhost2,test_user,10.30.21.95,124,395,QUERY,,'create database testdb',0
20220512 15:22:06,mysqlhost2,test_user,10.30.21.95,129,419,QUERY,testdb,'CREATE TABLE if not exists `test_tb0` (\r\n  `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'自增主鍵\',\r\n  `test_id` int(11) NOT 
NULL ,\r\n  `test_name` varchar(20) DEFAULT NULL,\r\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'創(chuàng)建時間\',\r\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE C
URRENT_TIMESTAMP COMMENT \'修改時間\',\r\n  PRIMARY KEY (`increment_id`)\r\n) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=\'測試table\'',0
20220512 15:23:09,mysqlhost2,test_user,10.30.21.95,129,426,QUERY,testdb,'insert into test_tb0 (test_id,test_name) values (1001,\'4343df\'),(1002,\'dfd\')',0
20220512 15:23:22,mysqlhost2,test_user,10.30.21.95,129,433,QUERY,testdb,'delete from test_tb0',0
20220512 15:24:14,mysqlhost2,test_user,10.30.21.95,129,448,QUERY,testdb,'create table test_tb0 (id int)',1050
20220512 15:24:25,mysqlhost2,test_user,10.30.21.95,129,452,QUERY,testdb,'drop table test_tb0',0
20220512 15:25:13,mysqlhost2,test_user,10.30.21.95,126,0,DISCONNECT,testdb,,0

# 連接審計主要審計連接數(shù)據(jù)庫、斷開連接、連接失敗等操作,其日志格式如下:
[timestamp],[serverhost],[username],[host],[connectionid],0,CONNECT,[database],,0
[timestamp],[serverhost],[username],[host],[connectionid],0,DISCONNECT,,,0
[timestamp],[serverhost],[username],[host],[connectionid],0,FAILED_CONNECT,,,[retcode]

# QUERY審計各種數(shù)據(jù)庫變更事件,執(zhí)行失敗也會記錄,其日志記錄格式如下:
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],QUERY,[database],[object], [retcode]

至此,我們基本上完成審計插件的初步使用,從審計日志內(nèi)容中我們可以看出,記錄的格式還是很清晰詳細(xì)的,每列內(nèi)容都是需要的,根據(jù)日志很容易查到對應(yīng)的操作。使用下來,筆者覺得 server_audit 審計插件基本能滿足審計需求,不過審計插件也是有優(yōu)缺點(diǎn)的,優(yōu)劣勢整理如下:

server_audit 審計插件優(yōu)勢:

  • 豐富的審計內(nèi)容:包括用戶連接,關(guān)閉,DML操作,存儲過程,觸發(fā)器,事件等。
  • 靈活的審計策略:可以自定義審計事件,例如過濾掉select查詢,或者排除審計某個用戶等。
  • 靈活方便:免費(fèi)使用且安裝方便,可以在線開啟和停用審計功能。

server_audit 審計插件劣勢:

  • 開啟審計會增加數(shù)據(jù)庫的性能開銷,并占用磁盤空間。
  • 日志格式不夠豐富,不能自定義輸出格式。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容