張 暉 李雅靜 趙 穎
(天津市地震局,天津 300201)
SQL Server數據庫中數據的安全監控1
張 暉 李雅靜 趙 穎
(天津市地震局,天津 300201)
本文主要闡述了作者在工作中遇到的 SQL Server數據庫中一些重要數據泄漏或是異常變動現象,隨后通過各種技術手段追蹤數據異常變更的根源的學習研究過程。從而達到了對日常工作中的重要數據進行安全監控、跟蹤相關操作的目的,同時,也為各類數據的安全性、準確性提供了堅實的保障。
SQL Server 關系數據庫 存儲過程 追蹤
數據庫的安全性是指保護數據庫以防止不合法的使用造成數據泄漏、更改或破壞。數據庫和計算機系統的安全性,以及操作系統和網絡系統的安全性是緊密聯系、相互支持的(王岳斌等,2009)。
當前,對數據庫安全的威脅主要分為物理上的和邏輯上的。物理上的威脅主要是指由計算機軟硬件故障、錯誤導致的數據丟失等,為了消除物理上的威脅,通常采用備份和恢復的策略。邏輯上的威脅主要是指對信息未被授權的存取,可以分為3類:①信息泄漏,包括直接和非直接(通過推理)地對保護數據的存??;②非法數據修改,由操作人員的失誤或非法用戶的故意修改引起;③拒絕服務,通過獨占系統資源導致其他用戶不能訪問數據庫(Li Yanyuan,2005;徐龍琴等,2009)。
本文中所要追蹤的是使用超級管理員的高級權限登錄數據庫對數據進行查詢、更改甚至刪除等操作的現象。
目前,SQL Server數據庫已被廣泛應用于各個領域,而地震行業中的信息網絡、測震臺網、前兆臺網、應急指揮、震害防御等學科也或多或少地應用到該數據庫系統。天津地震應急指揮系統使用了基于SQL Server數據庫的檢索系統,在系統的開發和使用中發現一些重要數據的異常變動,這些數據的變更并非通過相應的程序正常操作而發生的。為了保障數據的安全,開始研究重要數據讀寫的追蹤(王建國等,2006)。
1.1 初步研究
面對上述情況,首先對日志文件進行查詢。日志文件能夠顯示出數據被查詢或是被篡改的SQL語句和執行時間等信息,但日志文件里只記錄了登陸數據庫的用戶名,即超級管理員用戶名,無法定位到執行該指令的計算機,更無法定位到具體人員。日志文件如圖1所示。

圖1 SQL Server日志文件Fig. 1 SQL Server log files
經研究我們發現,可通過DBCC INPUTBUFFER語句來獲取客戶端發送到SQL Server的最后一條SQL語句。這個方法需要提供session_id,而這個session_id可以通過master庫(系統庫)中的系統視圖sys.sysprocesses來獲得,而這個系統視圖中有這樣幾個字段:hostname(客戶端機器名)、program_name(應用程序名稱)、net_address(最初認為net_address是客戶機的MAC地址,但經過多次試驗發現有的機器確實是MAC地址,有的卻不是)。這樣,如果局域網內有通過域來管理所有機器,那么客戶機的機器名是不能隨意變動的,即可通過查詢hostname來鎖定執行相關指令的客戶端。
通過寫一個.net程序(c/s架構),其中設一個定時器(timer),每間隔一秒鐘刷新一次,每次刷新都通過DBCC INPUTBUFFER語句來獲取客戶端發送到SQL Server的最后一條SQL語句,當然這里面的session_id(即spid)要通過sys.sysprocesses來循環獲取,然后將獲取的語句以及相關信息寫入建好的記錄表中。定時器程序執行存儲過程的流程如圖2所示。
圖2是程序中刷新監控記錄的存儲過程,可以實時監控,也可以將這些記錄再寫入一個歷史記錄表中以便存證。如果局域網未通過域來管理,即客戶端可隨意更改本機的機器名,這樣就必須找出執行相關指令的客戶端的 IP地址??蛻舳说?IP地址可以用 exec master..xp_cmdshell ping host_name方法獲得。但是此方法僅限于客戶端機器開啟ping功能的情況下,一旦其關閉該功能則無法取得對方客戶端的IP地址。
經過不斷測試,我們發現該方法仍然存在以下幾個問題:

圖2 存儲過程流程圖Fig. 2 Flowchart of storage procedure
①無法追蹤到客戶端通過存儲過程訪問數據庫的具體SQL語句。
②監控是通過定時器的循環指令執行,如定時器間隔時間設置過長,則會遺漏一些重要信息;如定時器時間間隔設置過短,則會占用服務器較多資源,從而影響服務器的正常運行。
③記錄中存在hostname為空的SQL語句執行記錄,這樣便無法追蹤到執行該指令的客戶端(上文所述獲取客戶端IP地址的方法也是通過hostname來實現的)。
1.2 深入研究
在進一步研究的過程中,還需要將測試中發現的問題一一解決。
首先,通過遍歷 sys.object系統表來發現可疑的存儲過程,即通過sp_helptext來讀出該存儲過程的內容,同時遍歷其語句,看看有無訪問數據表。
其次,通過SQL Server自帶的SQL Server Profiler功能查找遺漏的重要信息,如圖3所示。

圖3 SQL Profiler菜單Fig. 3 Main menu of SQL Profiler
在初步研究的方案中是通過DBCC INPUTBUFFER語句來獲取客戶端發送到SQL Server的最后一條SQL語句。如果一次性提交多條SQL語句,該方法只能夠捕捉到最后一條SQL語句,而忽略前面的若干條。經測試,通過SQL Server Profiler功能來跟蹤語句則不會出現類似的狀況,SQL Server Profiler功能可以跟蹤出所有的SQL語句,避免了重要信息的遺漏。
經過一段時間的研究及測試,發現安裝PowerBuilder開發環境的客戶端可以通過開發環境連接SQL Server數據,并查看或更改數據,這樣通過DBCC INPUTBUFFER方法無法獲取其主要的 SQL語句,只能捕捉到最后一句,通常是提交或回滾數據庫事務的語句,而通過SQL Server Profiler功能來跟蹤語句則能夠跟蹤到所有語句。
當hostname為空時,如何找到該記錄對應的客戶端機器,則需要通過SQL Server Profiler功能跟蹤表中的SPID與當時的關系庫中的系統視圖sys.dm_exec_connections中的session_id關聯,就可以從系統視圖sys.dm_exec_connections中的client_net_adress字段中獲取執行指令的客戶端的IP地址了。為什么是“當時”呢?因為SPID即session_id在數據庫中是又系統分配的,只能保證在一段時間內唯一。因此我們在跟蹤到相關語句時,必須盡快聯表查詢到對應IP,并寫入一個記錄表中,才能達到準確存證的目的。
上文已經將遇到的技術難點一一解決,接下來是記錄實現的過程:
(1)SQL Server Profiler設置
第一步需要設置SQL Server Profiler跟蹤,下面列出幾個關鍵的操作步驟:
①設置跟蹤記錄表
打開SQL Server Profiler后,點擊菜單中“文件”——“新建跟蹤”,然后選擇需要跟蹤的數據庫并通過超級管理員用戶登錄。在彈出的跟蹤屬性對話框中勾選“保存到表”,并將該表保存到我們需要存證的那個數據庫。也可以根據需要設置一個跟蹤停止時間,因為這個跟蹤表不能無限增大,最好定期更換。需要注意的是,跟蹤表不能保存在被跟蹤的數據庫實例中,否則會產生大量的冗余跟蹤數據。
②設置關鍵字
在跟蹤屬性對話框內選擇“事件選擇”標簽頁,這里可以根據實際需求來勾選需要跟蹤的事件以及所顯示列等,如圖4所示。

圖4 SQL Profiler跟蹤屬性——事件選擇Fig. 4 SQL Profiler track attribute — events selection
必須要在TextData字段上設置關鍵字,例如數據表名、字段名等。在關鍵字前后加上“%”,便于在跟蹤到的SQL語句中模糊查詢。
參數設置完成,即可運行,開始跟蹤數據庫。還需要注意兩點:一是可以將該跟蹤存為一個模板,便于重復使用;二是該跟蹤程可以運行在任何一臺可以連接被跟蹤數據庫的計算機上。
(2)實時獲取IP
SQL Server Profiler跟蹤運行好后,我們就需要實時(或近似實時)將跟蹤數據聯表得到對應的IP地址,然后將這個記錄寫入我們的存證表中。
為此需要設計一個服務,每秒或每間隔幾秒讀取一下跟蹤數據表數據,并將關聯系統視圖sys.dm_exec_connections中得到的IP地址一起寫入歷史存證表中即可。這里需要注意的是,可以根據跟蹤表中的 RowNumber字段來區分將每次多出的數據聯表插入到歷史存證表中。如跟蹤重啟后,跟蹤表會重新計數,這時程序內需要將兩個表中的RowNumber做對比判斷,將新增的數據插入歷史存證表中。當然也可以根據歷史記錄表中的最后一條記錄時間來進行判斷。
(3)跟蹤數據查詢分析
經過前面兩個步驟,已經將需要的數據實時寫入歷史存證表中,然后我們只需要設計一個查詢歷史記錄的頁面即可,這個頁面上方為查詢條件,例如:時間、應用名稱等;下方列表中為記錄的一些關鍵字段,如圖5所示。

圖5 重要數據訪問查詢Fig. 5 Important data access and query
點擊每條記錄后的“查看”可以看到具體的SQL語句,如圖6所示。

圖6 數據訪問查詢明細Fig. 6 The detailed record of important data access and query
數據庫系統作為信息的聚集體,其安全性至關重要。文中敘述了作者追蹤SQL Server數據庫數據被篡改的研究過程。作者經過多次的嘗試和研究,最終實現了對讀寫數據庫指令的追蹤。當然,所有追蹤的作用也只是亡羊補牢,只能作為監控數據安全的輔助手段,而有效的防竊取、防篡改才是建設數據庫至關重要的任務,才能保證數據的保密性、完整性和有效性。
王建國,崔曉峰,陳化然等,2006. Microsoft SQL Server 2000在天津市地震前兆臺網中心的應用. 華北地震科學,24(3):56—60.
王岳斌,陽國貴,鄺祝芳等,2009. 基于HMM的數據庫異常檢測系統設計與實現. 計算機應用與軟件,26(1):15—16.
徐龍琴,劉雙印,沈玉利等,2009. 數據庫安全性控制的研究. 計算機應用與軟件,26(5):31—35.
Li Yanyuan, 2005. The Documentation of Logic SQL. Alberta Univemity,Canada.
Data Security Monitoring of SQL Server Database
Zhang Hui, Li Yajing and Zhao Ying
(Earthquake Administration of Tianjin Municipality, Tianjin 300201, China)
Since database system is information aggregation, the security of database is very important. In this paper we discuss some problems in daily data management such as data leakage and abnormal variation, and track back the sources that cause such problems. By doing so we may monitor the important data in daily work to ensure the safety and accuracy of database.
SQL Server; Relation database; Storage process; Track
張暉,李雅靜,趙穎,2012.SQL Server數據庫中數據的安全監控.震災防御技術,7(2):208—213.
本文由“天津地震災害損失初評估快速查詢應急資料箱建設”資助
2011-12-27
張暉,女,生于1979年。碩士,工程師。主要從事地震應急工作。E-mail: 15375539@qq.com
更正:本刊2012年1期83頁頁下注“西藏地震現場工作隊,2011.9. 2011年9月18日印度錫金邦6.8級地震中國西藏災區災害直接損失評估報告.”更正為“孫柏濤,姚新強,周強等,2010. 西藏自治區農牧民安居工程抗震加固試驗與分析技術報告,121—122.”