MySQL數(shù)據(jù)庫Audit插件的使用技巧總結(jié)
在MySQL數(shù)據(jù)庫中(5.5版本),增加了一個新的插件:Audit plugin,用于對數(shù)據(jù)庫連接和數(shù)據(jù)庫操作進行審計。接下來我們詳細介紹Audit插件的使用。
相關代碼如下:
- sql/sql_audit.cc
該文件定義了audit插件的接口函數(shù)。
- sql/sql_audit.h
申明函數(shù),并定義了函數(shù)mysql_audit_general_log,在觸發(fā)audit時,首先調(diào)用的就是該函數(shù)。
- plugin/audit_null/audit_null.c
這是一個模板程序,給出了一個最基本的audit插件所需要定義的接口。
為了實現(xiàn)一個完整的audit程序,需要包括插件初始化、主要函數(shù)、卸載插件后的調(diào)用函數(shù)。這里我們以audit_null.c為例:
- static int audit_null_plugin_init(void *arg __attribute__((unused)))
在安裝插件時,會調(diào)用該函數(shù),主要用于做一些初始化的工作,比如初始化全局變量等。
- static void audit_null_notify(MYSQL_THD thd, unsigned int event_class, constvoid *event)
這是audit插件的主要函數(shù),在相應的事件被觸發(fā)時,將會調(diào)用到該函數(shù),參數(shù)包括:
thd:觸發(fā)該函數(shù)的線程,在結(jié)構體THD中包含了相當豐富的信息,可以借此實現(xiàn)很多有趣的功能
event_class/event:前者表示事件的類型,用于決定第三個參數(shù)event結(jié)構體的類型,使用宏定義,值為MYSQL_AUDIT_GENERAL_CLASS時表示由操作數(shù)據(jù)庫的行為所觸發(fā),值為MYSQL_AUDIT_CONNECTION_CLASS時表示由發(fā)起數(shù)據(jù)庫連接所觸發(fā),而針對不同的類型,也會調(diào)用不同的接口函數(shù)來觸發(fā)audit。
- staticaudit_handler_t audit_handlers[] =
- {
- general_class_handler,connection_class_handler
- };
對上述兩種情況下,又會細分到多個事件類型,在文件plugin_audit.h中進行了定義
1. 發(fā)起連接時
- #defineMYSQL_AUDIT_CONNECTION_CONNECT 0
完成認證后觸發(fā)
- #define MYSQL_AUDIT_CONNECTION_DISCONNECT 1
連接被中斷時觸發(fā)
- #define MYSQL_AUDIT_CONNECTION_CHANGE_USER 2
在執(zhí)行COM_CHANGE_USER命令后觸發(fā)。
event參數(shù)的結(jié)構為:mysql_event_connection。
2.操作數(shù)據(jù)庫時
- #defineMYSQL_AUDIT_GENERAL_LOG 0
在提交給general query log之前被觸發(fā)
- #define MYSQL_AUDIT_GENERAL_ERROR 1
在發(fā)送給用戶錯誤之前觸發(fā)
- #define MYSQL_AUDIT_GENERAL_RESULT 2
當將結(jié)果集合發(fā)送給用戶后觸發(fā)
- #defineMYSQL_AUDIT_GENERAL_STATUS 3
當發(fā)送一個結(jié)果集或發(fā)生錯誤時被觸發(fā)。event參數(shù)的結(jié)構體為:mysql_event_general。
不管event的結(jié)構體是哪一個,都在其中記錄了上述七種事件類型,我們就可以根據(jù)不同的事件類型,有針對性的進行插件代碼的編寫。
3. static int audit_null_plugin_deinit(void*arg __attribute__((unused)))
當卸載插件時,會調(diào)用該函數(shù),可以用來執(zhí)行一些釋放資源、關閉文件等操作
4. 定義插件的描述符結(jié)構體:
- struct st_mysql_audit
- {
- int interface_version;
- void (*release_thd)(MYSQL_THD);
- void (*event_notify)(MYSQL_THD, unsigned int, const void *);
- unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
- };
Version,值一般為MYSQL_AUDIT_INTERFACE_VERSION。
release_thd,一般設置為NULL。
event_notify,主要的處理函數(shù),當發(fā)生某些事件時被調(diào)用(audit_null_notify)。
class_mask,掩碼。
release_thd和event_notify可以結(jié)合起來用,當事件觸發(fā)event_notify時,這時候插件是不可以uninstall的,當完成調(diào)用后,服務器會通知release_thd函數(shù)。這樣,我們可以在event_notify中分配資源,并在release_thd中統(tǒng)一的進行釋放。
5.定義statues變量,用于指定在調(diào)用SHOWSTATIS時,顯示哪些值
- static struct st_mysql_show_var audit_null_status[]
6. 插件的庫描述符
- mysql_declare_plugin(audit_null)
- {
- MYSQL_AUDIT_PLUGIN, /* type */
- &audit_null_descriptor, /* descriptor */
- "NULL_AUDIT", /* name */
- "Oracle Corp", /* author */
- "Simple NULL Audit", /* description */
- PLUGIN_LICENSE_GPL,
- audit_null_plugin_init, /* init function (when loaded) */
- audit_null_plugin_deinit, /* deinit function (when unloaded) */
其中 第三個字段 “NULL_AUDIT”就是在執(zhí)行INSTALLPLUGIN時的插件名,如果不一致,不報無法找到在庫文件中找到符號的錯誤。
總結(jié):
Audit插件可以被多種事件所觸發(fā),因此,當服務器繁忙時,需要小心謹慎的編寫代碼,防止產(chǎn)生太多的額外開銷,以影響服務器的整體性能。
【編輯推薦】