MySQL 開源碼資料庫 組態設定 資料庫 Open Source

下載Amazon貢獻Audit模組 免費享用付費企業版功能

MySQL社群版開外掛 操作指令完整記錄稽核

2024-07-17
MySQL僅在付費企業版本上提供完整的資料庫審計功能,因此最多人使用的開源社區(Open Source Community)版本無法使用審計功能。為彌補相關不足的功能,本文將介紹一套由Amazon提供的MySQL Audit模組來為MySQL加入審計的功能,並進行詳盡的操作示範。

若說起開源碼資料庫軟體,相信許多人腦海裡第一個浮現的軟體,應該會是MySQL(官方網址為https://www.mysql.com),挾其優異及開源碼的特性,MySQL早已成為開源碼資料庫軟體的首選。

一般而言,使用者除了使用資料庫來管理資料外,通常也需要審計(Audit)功能,讓使用者能夠在事後利用審計功能來追蹤過去曾操作過的資料庫指令,藉以確定問題的所在。

但是,MySQL僅在付費企業(Enterprise)版本上提供完整的資料庫審計功能,但大多數人所使用的開源社區(Open Source Community)版本並未在審計功能上多所著墨,也因此使用開源社區版本並不能有效地運用審計功能。為彌補相關不足的功能,本文將介紹一套由Amazon所提供的MySQL Audit模組來為MySQL加入審計的功能。

MySQL Audit模組的檔案名稱為audit-plugin-for-mysql,官方網址是「https://github.com/aws/audit-plugin-for-mysql?tab=readme-ov-file」,主要功能包括:

1. 提供資料庫帳號所執行的資料庫動作(例如新增、刪除、查詢等)記錄功能。

2. 提供依資料庫指令性質類別來記錄相關執行指令,依其性質可分為下列類別:

‧資料定義語言(Data Definition Language,DDL):此類命令主要是用來定義資料庫、資料表等資料庫物件。通常是用來建立(CREATE)、更新(ALTER)、刪除相關資料庫物件。

‧資料操作語言(Data Manipulation Language,DML):此類命令主要是用來處理資料表裡的資料,例如新增(Append)、查詢(Select)、更改(UPDATE)或刪除(DELETE)資料表中的資料。

‧資料控制語言(Data Control Language,DCL):此類命令主要是用來控制資料表等資料庫物件的存取權限以提供資料庫的安全性。例如使用GRANT來賦予使用者使用權限(例如可使用那些資料庫),或REVOKE來取消使用者的使用權限。

‧資料查詢語言(Data Query Language,DQL):此類命令主要是用來負責進行資料查詢(SELECT),上述的DDL或DML都會造成資料庫資料的變動,而此類查詢指令並不會對資料庫中的資料內容進行任何影響,僅用來查詢資料表裡的資料。

安裝audit-plugin-for-mysql模組

在簡單了解相關功能後,接下來安裝audit-plugin-for-mysql模組。由於該模組必須與MySQL的原始碼同時進行編譯來提供相關的審計功能,因此在安裝前,先到MySQL官方網站(https://www.mysql.com/)下載MySQL相關原始碼(本文使用版本8.1.0),若原先就已經在使用MySQL資料庫,請根據所使用的版本來下載相對應的版本原始碼。

接著,再以git指令取得audit-plugin-for-mysql模組的最新原始碼:

git clone https://github.com/aws/ audit-plugin-for-mysql.git

在取得audit-plugin-for-mysql的原始碼後,將該模組的plugin目錄複製到MySQL原始碼中的plugin目錄,相關指令如下:

cd audit-plugin-for-mysql/plugin #切換至audit-plugin-for-mysql原始 碼中的plugin目錄

接著,複製該目錄下的相關檔案至MySQL原始碼中的plugin目錄:

cp -rf  server_audit  /plugin/

複製完成後,即可至MySQL原始碼目錄,開始進行相關編譯安裝。在此並不是要完整地編譯安裝MySQL資料庫,而是利用編譯來取得audit-plugin-for-mysql的模組檔案(檔名為server_audit.so),而後再嵌入至MySQL來使用。

首先,以cmake進行組態,相關的指令內容如下:

cmake -DCMAKE_INSTALL_PREFIX=/usr/ local/mysql8 -DCMAKE_CXX_COMPILER=/ usr/bin/g++  -DWITH_SSL=system -DDOWNLOAD_BOOST=1  -DFORCE_ INSOURCE_BUILD=1  -DWITH_ BOOST=/tmp

而編譯相關組態,說明如下:

-DCMAKE_INSTALL_PREFIX  #表示安裝 MySQL8相關程式及組態檔的目錄位置, 在此表示安裝目錄為/usr/local/mysql8 -DCMAKE_CXX_COMPILER  #表示要使用 的編譯器(COMPILER) -DDOWNLOAD_BOOST=1  #表示要從線上下 載BOOST函式庫 -DWITH_BOOST=/tmp  #表示從線上下載 BOOST函式庫所放置的位置 -DFORCE_INSOURCE_BUILD=1  #表示要 與MySQL原始碼同時進行編譯

確認組態成功後,再執行make指令進行編譯。在編譯成功後,就會產生名稱為「server_audit.so」的模組檔案,接著必須將此模組複製到MySQL的plugin目錄(MySQL存放第三方擴充模組功能的目錄)。可利用執行「SHOW VARIABLES LIKE 'plugin_dir'」來取得MySQL的plugin目錄,如圖1所示。

圖1  找出MySQL的plugin目錄所在。

然後,將server_audit.so複製至MySQL的plugin目錄,至此就完成安裝了。接著,先行簡單說明audit-plugin-for-mysql模組所提供的組態設定。可利用顯示server_audit模組相關資料庫變數的方式來顯示所提供的組態資訊,指令如下所示:

SHOW GLOBAL VARIABLES LIKE '%server_audit%';

常用設定組態說明

接著,說明相關常用的設定組態。

server_audit_events

設定要記錄的資料庫操作類型。若無設定,便表示記錄所有的操作資訊。相關的設定類型包括:

‧CONNECT:記錄使用者連線資料庫成功與失敗及中斷等連線資訊。

‧QUERY:記錄所有資料庫查詢的指令,其中也包括執行錯誤(例如使用錯誤語法查詢)的資訊。

‧QUERY_DCL:僅記錄執行資料控制語言(DCL)相關資料庫操作指令。

‧QUERY_DDL:僅記錄資料定義語言(DDL)指令相關資料庫操作指令。

‧QUERY_DML:僅記錄資料操作語言(DML)指令相關資料庫操作指令。

‧TABLE:僅記錄因為執行查詢而受影響的資料表相關資訊。

server_audit_incl_users

設定要記錄的資料庫使用者清單,亦即僅記錄相關使用者所執行的資料庫操作指令,如果要記錄多個使用者的操作資訊,則須利用逗號來分隔,但此組態的設定字句長度上限為1024個字元。

sever_audit_excl_users

設定不要記錄的資料庫使用者清單,也就是不記錄相關使用者所執行的的資料庫操作指令。同樣地,若有多個使用者,則須利用逗號來分隔,而其設定長度上限為1024個字元。

如果server_audit_incl_users和server_audit_excl_users都空白,則表示記錄所有的資料庫使用者執行的資料庫操作指令。預設為記錄所有使用者執行的資料庫操作指令。

server_audit_logging

設定是否啟用模組記錄資料庫操作指令功能。一般來說會設定成ON,若不啟用則設定為OFF。

server_audit_output_type

設定記錄輸出檔案型式,提供syslog和file兩個選項,以下分別加以說明:

syslog

設定將記錄資料輸出到系統的syslog機制上,相關組態設定如下:

‧server_audit_syslog_facility:此組態即是在設定syslog機制上的facility(事件種類)。

‧server_audit_syslog_priority:此組態用來設定syslog機制上的priority(事件嚴重程度)。

‧server_audit_syslog_info:此組態即是在設定使用者可自行新增的資訊。

file

設定將記錄資料輸出到檔案上,相關組態設定如下:

‧server_audit_file_path:此組態為設定記錄輸出的檔案位置資訊。

‧server_audit_query_log_limit:此組態為設定每筆記錄的長度限制,單位為bytes。

‧server_audit_file_rotate_size  1000000:此組態為設定儲存記錄檔案須轉置(Rotate)的門檻(單位為bytes)。主要是用來當記錄檔案的大小,超過所設定的門檻時,就會將原有的檔案轉存至另外一個檔案,並將原先的檔案重新清空,再繼續儲存。

‧server_audit_file_rotations:設定可轉置檔案的個數,預設為9,而最多只能設定999。如果設定為0,則表示不使用檔案轉置的功能。

啟用模組功能並進行實作

說明過相關組態用法後,接下來將啟用模組功能並實作一個能夠利用檔案來記錄所有執行查詢(Query)及連線(Connect)資料庫操作指令之機制。

首先,設定MySQL組態檔(/etc/my.cf)並設定如下組態(其中#為註解說明)來啟用audit-plugin-for-mysql模組:

[mysqld] plugin_load_add = server_audit.so #表示要載入server_audit模組 server_audit_logging=ON     #啟用server_audit模組記錄的功能 server_audit_events=connect,query #表示要記錄資料庫操作指令的類型 server_audit_file_path=/tmp/ myserver_audit.log  #表示儲存組記 錄的檔案位置

完成設定後,接著重新MySQL,即可啟用相關模組功能。

可以先利用「SHOW GLOBAL VARIABLES LIKE '%server_audit%';」等指令,來確認相關設定是否正確,如圖2所示。

圖2  確認相關設定是否正確。

在確認無誤後,即可利用執行查詢SQL指令來確認是否正常運作。如果一切正常,查詢myserver_audit.log時應該就可以看到相關的記錄,如圖3所示為connect所記錄的資訊(其中root為資料庫使用者名稱)。

圖3  檢視connect所記錄的資訊。

而圖4所示為查詢(Query)所記錄的資訊,使用者可從其中取得相關執行的SQL查詢指令。

圖4  查詢(Query)所記錄的資訊。

至此,就完成了新增MySQL審計功能的機制。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!