作者 陳松威,18年碩士畢業于華中科技大學,目前在CDB/CynosDB資料庫內核團隊擔任TXSQL云資料庫內核研發,開發過的功能包括企業級列加密函式、資料恢復工具、異步審計等,
引言
一、什么是資料庫審計
對于一個倉庫,如果要防盜,常見做法是出入口全裝上監控,一旦有問題了,調監控查找例外情況,對資料庫來說也類似,資料庫也有出入口,對所有連接出入口監控,可以記錄下所有的動作,一旦有問題了,通過查詢歷史動作并進行分析,可以找到關鍵資訊,故資料庫審計可以理解為是記錄用戶訪問資料庫行為,定位非法動作,事后追根溯源,提高資料庫安全性的功能,
二、常見的審計方式
在應用系統中直接審計,陳述句還沒往資料庫后臺發就先做了審計,不影響資料庫性能,對底層用的是什么資料庫也不關心,但對應用系統壓力比較大,并且應用系統需要決議陳述句,有一定復雜度,
往往抓包決議實作,對上下層都沒什么影響,但同樣要決議陳述句,有一定復雜度,并且如果傳輸層是通過加密通訊,將無法決議,
直接在內核上實作,所有功能都能實作,也能將性能影響降到最低,但是對后臺穩定性會有影響,對開發人員要求高,不管是開源還是非開源資料庫,都會非常慎重考慮直接在內核上支持審計,
對于開源資料庫,通常都有提供插件方式增加功能,審計可以以插件直接嵌在內核上,當然會對資料庫性能有一定影響,但同樣因為直接嵌在內核,很多一手資訊能直接拿到,比方說上面沒辦法回避的語法決議就不用做,而且還能直接拿更多的運行態資訊,能開發功能強大又靈活的審計功能,
其中插件式審計由于對內核侵入小,可以動態安裝、卸載和升級等優點,是較受青睞的審計實作方式,MySQL上也有不少審計插件,例如Macfee插件,官方audit plugin,mariadb audit plugin,Percona audit plugin,
從功能上而言,審計插件大同小異,只是展示的審計內容和格式略有差異,從實作方式而言,審計插件的資料來源近乎相同,而在規則過濾和刷盤策略上有較大的差別,從性能上而言,除了macfee插件外,其它幾個性能相差不多,宣稱都是15%左右影響,macfee則可能達到50%或更多,
總體而言,審計的性能影響不能一概而論,其與使用場景強相關,審計以query為單位記錄審計日志,性能開銷與QPS成正比,在OLAP場景下,一條query運行幾秒,甚至幾十秒,此時審計對性能的影響幾乎可以忽略不計,如果場景被設定為簡單查詢陳述句,QPS高達幾十萬的話,可想而知對性能會造成一定影響,
三、MySQL官方審計插件
MySQL支持了MYSQL_AUDIT_GENERAL_ALL、MYSQL_AUDIT_CONNECTION_ALL等十余種審計插件的型別,用于對客戶端連接、query處理、error log日志落盤、general log落盤等場景進行審計,審計插件的介面實作在sql目錄下的sql_audit.h和sql_audit.cc中,不同的插件型別對應不同的代碼觀察點,審計插件的定義中需要選擇一種或多種注冊型別,審計插件安裝后,相應的代碼觀察點即可被激活,當程式運行到被激活的代碼觀察點處時,將攜帶這些審計資訊跳轉至審計插件定義的對應觀察點處理函式中,進行審計日志的規則判斷,落盤等處理,
Query在運行程序中,程式會記錄諸如用戶名、客戶端ip、操作型別等審計資訊,以MYSQL_AUDIT_GENERAL_ALL為例,其記錄的審計資訊如下所示:

TXSQL審計的實作
TXSQL是騰訊云資料庫團隊維護的 MySQL 內核分支,100%兼容原生 MySQL 版本,TXSQL 提供了類似于 MySQL 企業版的諸多功能,如企業級透明資料加密、審計、執行緒池、加密函式、備份恢復等功能,
一、資料庫審計架構
騰訊云資料庫MySQL提供了基于TXSQL內核插件的資料庫審計服務,其沿用了官方審計插件介面,并支持同步審計、異步審計兩種審計架構,
1.同步審計模式
同步審計模式的架構如下圖所示,左側灰色部分對應資料庫服務器mysqld,它采用執行緒池中相對固定的作業執行緒來處理所有用戶的連接,作業執行緒每執行一個query或處理一個新的連接會生成一個審計event,作業執行緒需要結合審計規則判斷當前event是否需要記錄,如果需要記錄,則將審計event按一定格式轉化為審計日志,并拷貝到公共的Audit buffer中,Flush thread負責異步將Audit buffer中的審計日志落盤到本地,Audit agent負責將本地的audit log推送到CTSDB(騰訊云推出的一款分布式、可擴展、支持近實時資料搜索與分析的時序資料庫)上進行存盤,并提供查詢,

接下來,詳細聊一下同步審計的實作,下圖左側是一條query的執行程序,包括連接,陳述句決議、分析、陳述句重寫、陳述句優化、陳述句執行、陳述句回傳和資源釋放等幾個步驟,為了能獲取query執行的影響行數、執行時間、錯誤碼等內容,TXSQL審計選擇了在陳述句回傳之后,資源釋放之前的觀察點處理審計邏輯,下圖右側是同步審計的具體流程,作業執行緒在陳述句回傳之后、進入審計觀察點,如果實體沒有開啟審計,則直接進入資源釋放步驟,如果用戶開啟了審計,進一步判斷當前審計event是否需要記錄,如果需要則獲取審計內容并計算審計內容的長度,計算完審計日志長度后,加鎖在公共Audit buffer中進行記憶體占位,接下來立刻釋放鎖,在無鎖的情況下將審計event轉化為json格式的審計日志并拷貝到公共Audit buffer中已占領的位置處,Flush執行緒異步將Audit buffer中的審計日志落盤到本地,等待Audit agent進行消費,

- 異步審計模式
同步審計模式在絕大多數場景下性能優異,但是在配置了多個正則審計匹配規則并且QPS非常高的場景下將出現大幅的性能下降,性能下降的根因是正則匹配的程序中需要malloc記憶體,在高并發高壓力下malloc系統呼叫在內核態出現鎖瓶頸,影響了整體性能,為了解決同步審計在個別場景下的性能問題,TXSQL還支持了異步審計模式,

上圖是異步審計的架構圖,由圖可見,作業執行緒只需要將audit event交付給審計event佇列后即可回傳,新增write thread負責消費審計event佇列,并完成剩余的審計規則判斷、記憶體拷貝等作業,由于每個時間點并發malloc的執行緒數大幅下降,因此malloc系統呼叫的鎖瓶頸不復存在,下圖是異步審計的具體實作,write thread負責觀察審計event佇列,如果有需要處理的audit event,則將其摘下進行審計規則判斷,如果需要記錄該審計event則進一步進行審計內容長度計算、加鎖進行記憶體占位、無鎖內容轉換和記憶體拷貝等作業,

二、資料庫審計規則
目前TXSQL的資料庫審計支持以下型別設定:客戶端IP,資料庫帳戶,資料庫名,支持的匹配方式為:包含,不包含,等于,不等于,正則 方式匹配,每條規則為一個結構物件,多條規則為一個鏈表,規則保存在記憶體中,全域共享,審計啟動時從規則組態檔加載,修改、增加、洗掉時重新加載,
Rule list: 規則鏈表,每個規則對應前臺配置的一個或多個,不能合并的多個規則之間是或(||)關系,
Content list: 單個審計規則,規則內容包含username,host, database3項,在Content規則內部,不同內容項之間是與(&&)的關系,
結構簡圖如下:

三、資料庫審計性能
TXSQL提供的資料庫審計開啟后,對用戶的資料庫實體會有少許性能損耗,但遠低于業內的其他解決方案,(業務使用場景、QPS、規則設定等均會影響資料庫審計的性能開銷)
同步審計模式的最大的特點在于作業執行緒在生產審計日志的程序中,計算審計內容長度、內容json轉換和Audit buffer拷貝都是在無鎖的情況下進行的,整個程序只有記憶體占位需要持有鎖,臨界區足夠小,使得Audit buffer的寫鎖沒有成為系統瓶頸,從而在絕大多數場景下保持了極高的性能,平均的性能影響只有6%,
異步審計模式對資料庫審計性能有了進一步的提升,對實體的性能損耗更低,不論在正則規則下,還是在普通規則下,性能損耗最高只有3%左右,其能力領先于業界其它的資料庫審計插件,
四、資料庫審計最佳實踐
理論上可以不對規則條數和語法進行做限制,但必須說明資料庫審計的規則對整體性能消耗會產生一定的影響,為了能夠在相同的規則下降低對資料庫資料庫實體的性能影響,提升資料庫審計能力,在這里提出以下幾點審計規則的最佳實踐:
-
規則合并:多個規則之間如果指定的型別相同,應該嘗試合并規則,如A規則審計資料庫db1的select操作,B規則審計資料庫db1的update操作,應當合并成審計db1的select和update操作,
-
優先原則:對同個實體上不能合并的多個審計規則,優先使用命中率高的特征,只要有一個規則匹配上就會對該SQL進行審計,其它規則不需要再進行判斷,因此需要把命中率最高的規則放前面優先用,
-
正則運算式最后匹配:在規則內部,容易否定的規則項優先匹配,精確范圍值優先匹配,然后精確值,然后不包含和包含值,最后正則運算式值,
總結
TXSQL提供了同步和異步兩種審計模式,內置豐富的審計規則,滿足不同用戶的個性化需求,同時在性能損耗方面把控得十分優秀,一般情況下的記憶體損耗只有3%,遠低于業界其他插件,
有了TXSQL的審計功能,DBA就能夠實時查看資料庫活動,對于資料庫的所有操作都會有跡可循,當資料庫遇到疑似風險行為時,及時進行處理,對攻擊行為進行阻斷,同時,借助TXSQL審計不同的審計模式,豐富的規則和超低的性能損耗,可以讓DBA專注于運維本身,通過對用戶訪問資料庫行為的記錄、分析和匯報,進行事后生成合規報告、事故追根溯源,最終加強內外部資料庫網路行為記錄,提高資料資產安全,
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/187376.html
標籤:其它
