作為收費應用方面的數據庫管理員(DBA),公司首席信息官(CIO)經常邀請我與Sarbanes-Oxley審查員開會討論公司數據的安全與整合問題。簡單地說,他希望我們通過適當的文件回答許多問題:如誰訪問了我們的數據、如何批準訪問權、以及我們如何對訪問進行監控,以防止某些人入侵、登錄數據或做他們不該做的事情。
我的CIO與我了解了一些證明Sarbanes-Oxley法案遵守的商業解決方案。但是,我們決定應用SQL Server 2005內置工具來建立我們“自產的”審查系統。
Server 2005新功能
在使用SQL Server 2005之前,我們應用數據操作語言(DML)觸發器來了解數據庫中何時會發生數據變化。我們可以指著審查日志說,這里有一個列表,列出了自上次審查以來我們發布的所有插入(INSERT)、更新(UPDATE)與刪除(DETELE)語句,包括執行語句的時間、日期、個人或程序。
DML觸發器是一個數據庫引擎啟動的專用存儲程序,它在為數據變化建立審查索引方面有很大的作用。但是,DML觸發器只有在數據發生變化時才會啟動。在使用SQL Server 2005之前,我們沒有較好的辦法來追蹤數據庫服務器中的結構或安全變化。
SQL Server 2005支持數據定義語言(DDL)觸發器。在發生服務器或數據庫級事件時,這些觸發器才會建立并啟動。DDL觸發器允許我們追蹤數據庫中的重要變化——有意的、無意的或惡意的改變。
追蹤所有注冊
下面是一個DDL觸發器改善數據庫監控能力的典型例子。在以前版本的SQL Server中,我們很難了解何時建立新注冊、何時建立新數據庫、或是何時給不同用戶分配了新許可。
在SQL Server 2005中,追蹤這樣的安全變化要相對容易一些。為說明這一點,無論用戶是誰,讓我們設計了一個追蹤服務器上所有行為的解決方案。我們將用DDL觸發器事件DDL_LOGIN_EVENTS來建立審查索引。這個事件觸發器將尋找服務器上的任何注冊事件,包括所有的建立注冊(CREATE LOGIN)、修改注冊(ALTER LOGIN)與刪除注冊(DELETE LOGIN)事件。
在SQL Server 2005中,通過運行CREATE DATABASE DDLTriggerTest語句建立一個審查索引數據庫,然后定義下列域:
IDCol SMALLINT IDENTITY(1,1) PRIMARY KEY,
XMLEvent XML
DatabaseName VARCHAR(50)
SystemUser VARCHAR(50)
EntryDate DATETIME DEFAULT (GETDATE())
注意表格中利用了XML數據類型,這是SQL Server 2005中新增的功能。顧名思義,它的作用是保存XML數據。
一旦表格做好準備追蹤事件,就可以建立必要的觸發器來監控這些事件。第一步,我們的解決方案尋找服務器上發生的注冊事件,包括任何建立注冊(CREATE LOGIN)、修改注冊(ALTER LOGIN)與刪除注冊(DELETE LOGIN)事件。運行以下腳本來建立觸發器:
CREATE TRIGGER tr_Security
ON ALL SERVER
For DDL_LOGIN_EVENTS
AS
BEGIN
?INSERT INTO DDLTriggerTest..EventtableData(XMLEvent, DatabaseName, SystemUser)
?VALUES (EVENDATA(), DB_NAME(), SYSTEM_USER)
END
這段腳本建立一個觸發器,宣稱我們希望尋找服務器上發生的所有DDL注冊事件。啟動觸發器所得到的信息將進入我們前面建立的DDLTriggerTest表格中。注意,我們使用三個函數將數據插入表格中。在此例中,EVENTDATA函數將收集與注冊有關的信息,因為它是FOR DDL_LOGIN_EVENTS語句指定的事件。SYSTEM_USER函數執行當前語句,返回注冊。而且,如你所猜測的,DB_NAME()函數返回執行當前語句的數據庫的名稱。由于建立一個注冊是一個服務器級事件,我們的審查索引記錄下發生在主數據庫中的語句。
為測試新的觸發器,我們必須在服務器上提出一個LOGIN事件。執行CREATE LOGIN TestLogin WITH PASSWORD = '123456xxYYbaz這樣的命令,是建立一個新注冊的最簡單方法。
運行該語句后,如果我們查看信息窗口,就可看到信息(1行受影響)。由于我們安排好審查,所以此語句才會發生。當我們在服務器上運行CREATE LOGIN語句時,DDL觸發器被啟動,一項記錄插入到DDLTriggerTest數據庫的EventTableData表格中。
XML中有什么?
你可以在DDLTriggerTest表格中運行SELECT查詢來證明我們向表格中寫入了記錄。如果你習慣應用SQL Server 2000,那么XMLEvent一欄中的數據可能對你來說有些陌生。在SQL Server Management Studio (SSMS)中,點擊XMLEvent一欄中的鏈接即可查看它包含的XML數據。
XMLEvent域由EVENTDATA()函數從觸發器中的INSERT語句中移植過來。在這種情況下,EVENTDATA()函數返回與注冊有關的XML數據,包括注冊的時間與日期、服務器名稱、用戶ID與機器系統ID。
還只是開始
DDL_LOGIN_EVENT觸發器只是有助于證明系統安全,你能夠進行監控的60多個DDL事件中的一個。其它Sarbanes-Oxley審查感興趣的事件包括:建立或終止其它數據庫對象,如表格、程序、觸發器、概念、函數等。
在本文中,我們的討論僅限于服務器級事件。在以后的文章中,我將說明一個追蹤數據庫級事件的觸發器。我還將向你展示那些觸發器如何執行追蹤事件以外的功能——實際上,它們可阻止你不想發生的未授權的事件在數據庫中出現。
Tim Chapman是金融服務行業一家大公司的數據庫管理員。