SQL Server 2008中的審核
任何安全解決方案的一個重要組成部分就是出于可說明性和法規遵從性的考慮而進行審核的能力。SQL Server 2008包含很多特性,使審核活動成為可能。
所有動作審核
SQL Server 2008通過Audit對象提供審核支持,這使管理員能夠捕獲數據庫服務器中的活動并將其存儲在日志中。使用SQL Server 2008,您可以將審核信息存儲在以下目標中:
文件
Windows應用程序日志
Windows安全日志
要寫入Windows安全日志,必須將SQL Server服務配置為作為Local System、Local Service、Network Service或擁有SeAuditPrivilege權限且不是交互用戶的域帳戶運行。
要創建Audit對象,必須使用CREATE SERVER AUDIT語句。該語句定義Audit對象并將其與目標關聯。用于配置Audit對象的特定選項取決于審核目標。例如,以下Transact-SQL代碼創建了兩個Audit對象;一個將活動記錄到文件,另一個將活動記錄到 Windows應用程序日志。
CREATE SERVER AUDIT HIPAA_File_Audit |
注意當記錄到文件目標時,文件名沒有在 CREATE SERVER AUDIT 語句中指定。審核文件名采用 AuditName_AuditGUID_nn_TS.sqlaudit 的形式,其中 AuditName是 Audit 對象的名稱,AuditGUID是與該 Audit 對象相關的惟一標識符,nn是用于分區文件集的分區號,而 TS是時間戳的值。例如,通過前面的代碼樣例創建的 HIPAA_FILE_Audit Audit 對象可以生成一個與以下名稱類似的日志文件:
HIPAA_File_Audit_{9***481F8-DEF3-40ad-B3C6-126B68257223}_00_29384.sqlaudit
可以使用 QUEUE_DELAY 審核選項實現出于性能原因的異步審核,可以使用 ON_FAILURE 選項確定無法向目標寫入審核信息時采取的操作。在前面展示的 HIPAA_AppLog_Audit 示例中,ON_FAILURE選項被配置為在無法寫入日志時關閉 SQL Serve r實例;在這種情況下,執行CREATE SERVER AUDIT 語句的用戶必須擁有 SHUTDOWN 權限。
在創建 Audit 對象之后,可以通過使用 CREATE SERVER AUDIT SPECIFICATION 和 CREATE DATABASE AUDIT SPECIFICATION 語句對其添加事件。CREATE SERVER AUDIT SPECIFICATION 向 Audit 添加服務器級的操作組(即可以在服務器級發生的預定義的相關操作集合)。例如,以下代碼將 FAILED_LOGIN_GROUP 操作組(它記錄了失敗的登錄嘗試)添加到HIPAA_File_Audit Audit。
CREATE SERVER AUDIT SPECIFICATION Failed_Login_Spec |
CREATE DATABASE AUDIT SPECIFICATION 語句向 Audit 添加數據庫級的操作組和單個數據庫事件。添加單個操作使您能根據對象篩選記錄的操作以及操作涉及的用戶。例如,以下代碼樣例向HIPAA_AppLog_Audit Audit 添加了 DATABASE_OBJECT_CHANGE_GROUP 操作組(它記錄數據庫中的任何 CREATE、ALTER 或 DROP 操作)以及在 Sales 架構中由 SalesUser 或 SalesAdmin 用戶對對象執行的 INSERT、UPDATE 或 DELETE 語句。
CREATE DATABASE AUDIT SPECIFICATION Sales_Audit_Spec |
Audit 對象提供了一個可管理的審核框架,該框架使定義應記錄的事件和事件應存儲的位置變得很容易。SQL Server 添加的這個功能幫助您實現綜合的審核解決方案以確保數據庫的安全并滿足法規遵從性的要求。
DDL觸發器
DDL 觸發器是在 SQL Server 2005 中引入的。與表中數據發生變化時執行 Transact-SQL 代碼的DML 觸發器不同,DDL 觸發器在表結構發生變化時激活。這是跟蹤和審核數據庫架構的結構性變化的***方式。
這些觸發器的語法與 DML 觸發器的類似。DDL 觸發器是 AFTER 觸發器,為了響應 DDL 語言事件而激活;它們不會為了響應執行類似 DDL 操作的系統存儲過程而激活。它們是完全事務性的,因此您可以 ROLLBACK 一個 DDL 變更。您可以在 DDL 觸發器中運行 Transact-SQL 或者 CLR代碼。 DDL 觸發器還支持類似其他模塊的 EXECUTE AS 子句。
SQL Server 將關于觸發器事件的信息作為非類型化的 XML 提供。可以通過稱為 EVENTDATA()的能夠發出 XML 數據的新內置功能獲得這些信息。可以使用 XQuery 表達式解析 EVENTDATA() XML 以發現事件屬性,如架構名稱、目標對象名稱、用戶名,以及導致觸發器***激活的整個Transact-SQL DDL語句。例如,請參見 SQL Server Books Online 中的 EVENTDATA (Transact-SQL)。數據庫級 DDL 觸發器由數據庫或更低級別的 DDL 語言事件激活。例如,CREATE_TABLE、 ALTER_USER等等。服務器級 DDL 觸發器由服務器級的 DDL 語言事件激活,例如 CREATE_DATABASE、ALTER_LOGIN 等等。為了管理方便,您可以使用事件組,比如 DDL_TABLE_EVENTS,來簡稱所有 CREATE_TABLE、ALTER_TABLE 和 DROP_TABLE 事件。各種 DDL 事件組和事件類型及其相關 XML EVENTDATA()在SQL Server Books Online 上均有記述。
與 DML 觸發器名稱不同(它是架構范圍的),DDL 觸發器是數據庫范圍或服務器范圍的。
使用此目錄視圖發現 DML 觸發器和數據庫級 DDL 觸發器的觸發器元數據:
SELECT * FROM sys.triggers ; |
如果 parent_class_desc 列中存在 'DATABASE' 的值,那么它就是 DDL 觸發器,并通過數據庫本身確定名稱范圍。Transact-SQL 觸發器的代碼體可以在 sys.sql_modules 目錄視圖中找到,并且可以將它連接到 sys.triggers 的object_id 列中。 關于 CLR 觸發器的元數據可以在 sys.assembly_modules 目錄視圖中找到,同樣可以連接到 sys.triggers 的 object_id 列中。
使用此目錄視圖發現服務器范圍的 DDL 觸發器的元數據:
SELECT * FROM sys.server_triggers ; |
Transact-SQL 服務器級別的觸發器的代碼體可以在 sys.server_sql_modules 目錄視圖中找到,可以將它連接到 sys.server_triggers 的 object_id 列上。關于一個 CLR 服務器級別的觸發器的元數據可以在 sys.server_assembly_modules 目錄視圖中找到,同樣可以將它連接到 sys.server_triggers 的 object_id 列上。
可以使用 DDL 觸發器來捕捉和審核數據庫中的 DDL 活動。創建一個帶有非類型化的 XML 列的審核表。為 DDL 事件或您感興趣的事件組創建一個 EXECUTE AS SELF DDL 觸發器。這個DDL 觸發器的代碼體可以簡單地將 EVENTDATA() XML 插入到審核表中。
DDL 觸發器的另一個有趣的使用是由 CREATE_USER 事件激活然后添加代碼到自動權限管理。例如,假設您想讓所有的數據庫用戶獲得一個對存儲過程 P1、P2 和 P3 的 GRANT EXECUTE 權限。DDL 觸發器可以從 EVENTDATA() XML 中提取用戶名稱,動態地生成一個語句,像 ‘GRANT EXECUTE ON P1 TO someuser’,然后對它執行EXEC()。
【編輯推薦】