很多時候我們都需要對數據庫或者數據庫服務器實例進行審核/審計
例如對失敗的登錄次數進行審計,某個數據庫上的DDL語句進行審計,某個數據庫表里面的delete語句進行審計
事實上,我們這些審計的需求基本上都是為了一個目的:防黑客
上面的這些審計需求無非就是看一下有哪些人試圖入侵數據庫服務器,入侵了之后是否有drop表,是否有delete數據
在SQLSERVER2008及以前版本可以選擇的方案有
1、服務器級別DDL觸發器和數據庫級別的DDL觸發器(SQL2005及以上版本) 以及DML觸發器
2、自己手工從事務日志里讀取操作記錄,權威的書都會說事務日志不是審核工具,一般大型數據庫都會設置為簡單模式,事務日志截斷
3、依靠SQLSERVER ERRORLOG來檢查登錄審核,導致SQLSERVER ERRORLOG login相關的日志泛濫 導致SQL排錯造成困難
4、事件通知:http://www.cnblogs.com/gaizai/p/3473553.html5、更改跟蹤:http://www.cnblogs.com/gaizai/p/3482579.html6、變更數據捕獲(CDC):http://www.cnblogs.com/gaizai/p/3479731.html
我們一般都會把C2 審核跟蹤和登錄審核里面只限成功的登錄,以防止SQL ERRORLOG日志泛濫,因為服務器是很久才重啟一次的,如果不做修改很容易造成磁盤爆滿
--禁用C2 審核跟蹤和只限成功的登錄EXEC sys.sp_configure N'c2 audit mode', N'0'GORECONFIGURE WITH OVERRIDEGOUSE [master]GOEXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software/Microsoft/MSSQLServer/MSSQLServer', N'AuditLevel', REG_DWord, 1GO
SQLSERVER2008新增的審核功能
在sqlserver2008新增了審核功能,可以對服務器級別和數據庫級別的操作進行審核/審計,事實上,事件通知、更改跟蹤、變更數據捕獲(CDC)
都不是用來做審計的,只是某些人亂用這些功能,也正因為亂用這些功能導致踩坑
事件通知:性能跟蹤
更改跟蹤:用Sync Services來構建偶爾連接的系統
變更數據捕獲(CDC):數據倉庫的ETL 中的數據抽?。ū澈笫褂胠ogreader)
而審核是SQLSERVER專門針對數據庫安全的進行的審核,記住,他是專門的!
我們看一下審核的使用方法
審核對象
步驟一:創建審核對象,審核對象是跟保存路徑關聯的,所以如果你需要把審核操作日志保存到不同的路徑就需要創建不同的審核對象
我們把審核操作日志保存在文件系統里,在創建之前我們還要在相關路徑先創建好保存的文件夾,我們在D盤先創建sqlaudits文件夾,然后執行下面語句
--創建審核對象之前需要切換到master數據庫USE [master]GOCREATE SERVER AUDIT MyFileAudit TO FILE(FILEPATH='D:/sqlaudits') --這里指定文件夾不能指定文件,生成文件都會保存在這個文件夾GO
實際上,我們在創建審核對象的同時可以指定審核選項,下面是相關腳本
把日志放在磁盤的好處是可以使用新增的TVF:sys.[fn_get_audit_file] 來過濾和排序審核數據,如果把審核數據保存在Windows 事件日志里查詢起來非常麻煩
USE [master]GOCREATE SERVER AUDIT MyFileAudit TO FILE(FILEPATH='D:/sqlaudits',MAXSIZE=4GB,MAX_ROLLOVER_FILES=6) WITH (ON_FAILURE=CONTINUE,QUEUE_DELAY=1000);ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)
MAXSIZE:指明每個審核日志文件的最大大小是4GB
MAX_ROLLOVER_FILES:指明滾動文件數目,類似于SQL ERRORLOG,達到多少個文件之后刪除前面的歷史文件,這里是6個文件
ON_FAILURE:指明當審核數據發生錯誤時的操作,這里是繼續進行審核,如果指定shutdown,那么將會shutdown整個實例
queue_delay:指明審核數據寫入的延遲時間,這里是1秒,最小值也是1秒,如果指定0表示是實時寫入,當然性能也有一些影響
STATE:指明啟動審核功能,STATE這個選項不能跟其他選項共用,所以只能單獨一句
在修改審核選項的時候,需要先禁用審核,再開啟審核
ALTER SERVER AUDIT MyFileAudit WITH(STATE =OFF)ALTER SERVER AUDIT MyFileAudit WITH(QUEUE_DELAY =1000)ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)
審核規范
在SQLSERVER審核里面有審核規范的概念,一個審核對象只能綁定一個審核規范,而一個審核規范可以綁定到多個審核對象
我們來看一下腳本
CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GOCREATE SERVER AUDIT MyAppAudit TO application_LOGGOALTER SERVER AUDIT MyAppAudit WITH(STATE =ON)ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=OFF)GOALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFileFOR SERVER AUDIT MyAppAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GO
我們創建一個服務器級別的審核規范CaptureLoginsToFile,然后再創建多一個審核對象MyAppAudit ,這個審核對象會把審核日志保存到Windows事件日志的應用程序日志里
我們禁用審核規范CaptureLoginsToFile,修改審核規范CaptureLoginsToFile屬于審核對象MyAppAudit ,修改成功
而如果要把多個審核規范綁定到同一個審核對象則會報錯
CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileAFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GOCREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileBFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GO--消息 33230,級別 16,狀態 1,第 86 行--審核 'MyFileAudit' 的審核規范已經存在。
這里要說一下 :審核對象和審核規范的修改 ,無論是審核對象還是審核規范,在修改他們的相關參數之前,他必須要先禁用,后修改,再啟用
--禁用審核對象ALTER SERVER AUDIT MyFileAudit WITH(STATE =OFF)--禁用服務器級審核規范ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=OFF)GO--禁用數據庫級審核規范ALTER DATABASE AUDIT SPECIFICATION CaptureDBLoginsToFile WITH (STATE=OFF)GO--相關修改選項操作--啟用審核對象ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)--啟用服務器級審核規范ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=ON)GO--啟用數據庫級審核規范ALTER DATABASE AUDIT SPECIFICATION CaptureDBLoginsToFile WITH (STATE=ON)GO
審核服務器級別事件
審核服務級別事件,我們一般用得最多的就是審核登錄失敗的事件,下面的腳本就是審核登錄成功事件和登錄失敗事件
CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GO
修改審核規范
--跟審核對象一樣,更改審核規范時必須將其禁用ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE =OFF)ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFileADD (login_change_password_gourp),DROP (successful_login_group)ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE =ON)GO
審核操作組
每個審核操作組對應一種操作,在SQLSERVER2008里一共有35個操作組,包括備份和還原操作,數據庫所有權的更改,從服務器和數據庫角色中添加或刪除登錄用戶
添加審核操作組的只需在審核規范里使用ADD,下面語句添加了登錄用戶修改密碼操作的操作組
ADD (login_change_password_gourp)
這里說一下服務器審核的內部實際上使用的是SQL2008新增的擴展事件里面的其中一個package:SecAudit package,當然他內部也是使用擴展事件來收集服務器信息
審核數據庫級別事件
數據庫審核規范存在于他們的數據庫中,不能審核tempdb中的數據庫操作
CREATE DATABASE AUDIT SPECIFICATION和ALTER DATABASE AUDIT SPECIFICATION
工作方式跟服務器審核規范一樣
在SQLSERVER2008里一共有15個數據庫級別的操作組7個數據庫級別的審核操作是:select ,insert,update,delete,execute,receive,references
相關腳本如下:
--創建審核對象USE [master]GOCREATE SERVER AUDIT MyDBFileAudit TO FILE(FILEPATH='D:/sqldbaudits') GOALTER SERVER AUDIT MyDBFileAudit WITH (STATE=ON)GO--創建數據庫級別審核規范USE [sss]GOCREATE DATABASE AUDIT SPECIFICATION CaptureDBActionToEventLogFOR SERVER AUDIT MyDBFileAuditADD (database_object_change_group),ADD (SELECT ,INSERT,UPDATE,DELETE ON schema::dbo BY PUBLIC)WITH (STATE =ON)
我們先在D盤創建sqldbaudits文件夾
第一個操作組對數據庫中所有對象的DDL語句create,alter,drop等進行記錄第二個語句監視由任何public用戶(也就是所有用戶)對dbo架構的任何對象所做的DML操作
創建完畢之后可以在SSMS里看到相關的審核
數據庫審核規范
服務器審核規范和審核對象
查看審核事件
被記錄到文件系統的審核文件不是存儲在可以利用記事本打開的文本文件中,而是采用二進制文件的方式
這里說一個,當磁盤空間不足的時候是可以直接刪除這些SQLAUDIT文件
如果使用DDL觸發器的方法:http://www.cnblogs.com/gaizai/p/3363220.html?ADUIN=xxx2&ADsession=1387155615&ADTAG=CLIENT.QQ.5275_.0&ADPUBNO=26274
一般都會在數據庫里頭創建一張表來保存審計數據,但是當表數據量達到很多的時候,DBA也需要去維護這張表
工作量又增加了,可能你會說,我需要審計的項目不多,所以審計的數據也不會太多,但對于某些大公司來說
他們要審計的數據是非常多的,有些需要歸檔,而有些不需要歸檔
對于不需要歸檔審計數據的情況,我比較喜歡這種方式,當磁盤容量不夠的時候把最老的那個審計文件刪除掉
當然,你可以把整個sqlaudits文件夾或某個sqlaudit文件進行備份,放到備份磁盤上,然后刪除一些較老的sqlaudit文件
備份了之后以后就有機會對之前的審計數據進行翻查,都比較靈活
我們有兩種方法查看審核日志
方法一:對象資源管理器-》安全性-》審核-》選中某個審核對象-》右鍵-》查看審核日志
審核項目包括有:日期、時間戳記、服務器實例名稱、操作ID、類類型、序列號、成功或失敗、列權限、數據庫主體ID、服務器主體名稱、
服務器主體SID、被執行的(或嘗試)的實際語句等等
方法二:使用新的表值函數sys.[fn_get_audit_file]()
此函數接受一個或多個審核文件的參數(使用通配符模式匹配)
并利用另外兩個附加參數可以指定要處理的起始文件,以及開始讀取審核的已知偏移位置
這兩個參數都是可選的,但依然必須使用關鍵字default指定,此函數隨后從文件中讀取二進制數據,并將格式化這些審核項目
服務器級別審核
根據最近時間的那個sqlaudit文件,查詢這個文件里面的信息
SELECT [event_time] AS '觸發審核的日期和時間' , sequence_number AS '單個審核記錄中的記錄順序' , action_id AS '操作的 ID' , succeeded AS '觸發事件的操作是否成功' , permission_bitmask AS '權限掩碼' , is_column_permission AS '是否為列級別權限' , session_id AS '發生該事件的會話的 ID' , server_PRincipal_id AS '執行操作的登錄上下文 ID' , database_principal_id AS '執行操作的數據庫用戶上下文 ID' , target_server_principal_id AS '執行 GRANT/DENY/REVOKE 操作的服務器主體' , target_database_principal_id AS '執行 GRANT/DENY/REVOKE 操作的數據庫主體' , object_id AS '發生審核的實體的 ID(服務器對象,D
新聞熱點
疑難解答