【譯】第十一篇 SQL Server安全審核


本篇文章是SQL Server安全系列的第十一篇,詳細內容請參考原文


SQL Server審核
SQL Server審核是指你可以在數據庫或服務器實例監控事件。審核日志包含你選擇捕獲的事件的列表,在服務器上生成數據庫和服務器對象、主體和操作的活動記錄。你幾乎可以捕獲任何發生的事情的數據,包括成功和不成功的登錄,讀、更新、刪除的數據,管理任務,以及更多。審核可以深入到數據庫和服務器。
這似乎有點奇怪存在辦法回頭追溯那些已經發生的事件。但審核日志往往是你用於檢測攻擊的第一和最佳的資源,特別是當攻擊只探測數據庫,但尚未成功訪問數據或損壞數據。當發生這樣的攻擊,監管人員對你施加壓力,審核日志可能會幫助你找出發生了什么,什么數據被訪問,以及攻擊的來源。如果沒有日志,在你可以確定發生了什么之前,你必須先捕捉到攻擊者,然后再回復他們。
SQL Server很久以前就提供支持審核功能,但是直到SQL Server 2008審核才真正成為一個核心功能,有內置對象、T-SQL支持,並在SSMS有用戶接口。微軟從初始版本學到了很多並在SQL Server 2012做了一些好的改進。其中最大的變化是,微軟讓SQL Server的所有版本都可以使用審核,而不只是企業版。這意味着你現在可以在任何版本中創建一個跨數據庫的審核規范。但這一消息是混合的:個別的數據庫審核僅在企業版、開發版和評估版適用。所以,如果你正在測試或評估生產環境最終使用的SQL Server版本,確保你所選擇的有你需要的功能。
SQL Server審核對象
無論你是使用T-SQL還是SSMS用戶接口來管理審核,你會操作下面三個對象:
->服務器審核:服務器審核對象是審核的頂級容器,你將始終使用該對象進行審核。通常,你將創建一個服務器審核匯總一個或多個用於特定目的(比如compliance或特定一組服務器/數據庫對象)的審核規范。在這個對象你可以配置審核的名稱、審核日志保存路徑、審核文件最大限制、審核日志失敗時的操作。你還可以定義過濾來控制事件日志的寫入。
->服務器審核規范:在這個對象你可以定義服務級別的事件以捕獲寫入審核日志。這個規范需要與你之前創建的服務器審核關聯。就是在這里定義你想記錄哪些對象上的哪些事件。
->數據庫審核規范:這個對象和服務器審核規范相似,你用它來捕獲單獨數據庫上的事件。它也要關聯到服務器審核。
通常你會使用一個服務器審核,依據你想要捕獲事件的類型結合一種或兩種其他對象。如果所有的事件都發生在一個數據庫中,使用數據庫審核規范對象。否則,如果事件跨越兩個或多個數據庫,或是服務器級別事件,則使用服務器審核規范對象。
當你創建一個服務器審核時,審核日志有三種存儲位置:文件、安全日志、應用程序日志。你應該很小心的選擇審核目標(審核日志存儲位置),因為它可以很容易的包含敏感信息,如社會保險號碼、信用卡號、工資、企業財務數據等。因此,你應該使用未經授權的用戶不能訪問的位置。這意味着,應用程序日志可能不是一個好選擇,因為默認情況下用戶不需要提高權限就可以查看它。但安全日志可以是一個很好的選擇,因為訪問需要admin權限。文件也可以是一個很好的選擇,因為你可以使用系統內置的安全特性保護文件夾或文件夾中的文件。
創建服務器審核
你可以使用SSMS圖形界面或T-SQL語句創建審核。在SSMS下創建是非常容易的,我們即將這樣操作。打開SSMS連接到本地數據庫實例。對象資源管理器->安全性->審核,右擊審核選擇"新建審核",打開創建審核對話框。
你可以使用對話框設置服務器審核的各種屬性:
->審核名稱根據日期和時間自動初始化成Audit-20150908-143152這種格式,當然你可以自行修改為任何你喜歡的。我設置成Sample Audit更好識別審核。
->下一步,你可以設置隊列延遲(毫秒),默認是設置為1秒,代表最大等待日志寫入的時間。這個值在性能和安全性之間折衷:一個較短的時間限制將使其更可能在災難故障前記錄到關鍵事件,但可能會影響服務器的性能。我讓服務器審核保持默認設置,這意味着,在最壞的情況下,我可能會失去一秒的條目。作為示例審核這是可以接受的!
->下一步,設置在審核日志失敗時的操作,當SQL Server不能寫入一個審核日志條件時,比如沒有可用磁盤空間。默認是繼續,只是在Windows事件日志產生一個錯誤,審核繼續執行。The Shut down server option is available when auditing is crucial and neither the operation nor server execution should continue in the face of an audit failure.這是一個嚴酷的選擇(關閉服務器),審核是至關重要時它是必要的。操作失敗選項是介於前面兩個極端之間的某個地方,讓失敗的事務回滾。我還是將此項保持默認。
->剩余需要你選擇的是審核目標。有三個選擇:文件、安全日志、應用程序日志。如果你選擇后面兩個Windows事件日志,對話框中剩余選項就都會禁用,其他選項只適用於審核目標為文件。
如果你選擇了文件選項,你就得選擇一個路徑。本例子中我選擇的是D:\SQL2012,一個可以隨時清理以騰出空間的文件夾。你可以設置任何你喜歡的路徑,不同的分區或者網絡磁盤。
文件審核目標的其他選項讓你設置文件大小和文件數量。你可以設置最大滾動更新文件數為一個最大值或者無限制。對於最大滾動更新文件數選項,一旦文件夾下的文件數達到最大值,SQL Server會用新文件重寫最舊的文件。對於最大文件數選項,一旦達到最大值,審核日志就會寫入失敗。如果你選擇了關聯的無限制選項,那么滾動更新文件數將不受限制。你同樣可以設置最大文件大小或大小無限制。對話框中最后一個選項——保留磁盤空間,告訴SQL Server預分配等於你指定的最大文件大小的磁盤空間,如果有,只有當最大文件大小的無限制選項沒有選中時才適用。因此,你有足夠的選項來控制你的審核文件在指定的驅動器上的空間量。
圖11.1顯示我創建名叫Sample Audit的審核

圖11.1 在SSMS創建服務器審核
你也可以使用T-SQL語句創建審核。代碼11.1使用CREATE SERVER AUDIT創建相同設置的Sample Audit.我通過創建審核對話框中的腳本按鈕生成相關腳本。

USE master;
GO
CREATE SERVER AUDIT [Sample Audit]
TO FILE 
(    FILEPATH = N'D:\SQL2012'
    ,MAXSIZE = 0 MB
    ,MAX_ROLLOVER_FILES = 2147483647
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(    QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
);
GO

代碼11.1 T-SQL代碼創建Sample Audit
代碼11.2顯示創建一個服務器審核,將日志寫入到應用程序日志而不是文件。因為沒有其他額外選項,所以代碼比前面的要簡潔。

CREATE SERVER AUDIT SQLServerAudit
    TO APPLICATION_LOG
    WITH ( QUEUE_DELAY = 1000,  ON_FAILURE = CONTINUE);
GO

代碼11.2 創建寫入到應用程序日志的審核
現在在對象資源管理器->安全性->審核節點,你會看到有兩個對象,如圖11.2所示。注意,在放大鏡圖標上都疊加有一個紅色的向下箭頭圖標。這表明,審核沒有啟用,這是創建時的默認狀態。你可以通過右鍵單擊審核對象,從彈出的菜單中選擇啟用審核,或者使用代碼11.3中的ALTER SERVER AUDIT語句啟用審核。一旦你啟用了審核,紅色的箭頭就會消失,雖然你可能需要再次刷新對象資源管理器。如果你是跟着SSMS界面操作,繼續向前,啟用Sample Audit審核,接下來我們將會使用。

圖11.2 對象資源管理器下的服務器審核

ALTER SERVER AUDIT SQLServerAudit WITH (STATE = ON);
GO

代碼11.3 T-SQL啟用SQLServerAudit審核
創建服務器審核規范
一旦你創建了一個服務器審核,你可以定義你想寫的審核事件。服務器審核本質上是審核規范的一個容器。記住,有兩種類型的審核規范:服務器和數據庫審核規范。
我將創建服務器審核規范用於記錄SQL Server登錄失敗的信息到日志。這是一個數據庫范圍外的服務器級別的操作,所以我需要在服務器級別上創建一個規范。使用SSMS->安全性->服務器審核規范,右擊服務器審核規范,選擇新建服務器審核規范,打開創建服務器審核規范對話框。
你可以接受自動生成的規范名稱,但我命名為TestSQLServerAuditSpec.然后從審核下拉列表中選擇服務器審核,列表中包含實例上所有已存在的服務器審核。本例中我選擇使用Sample Audit,意味着審核日志條目會保存到文件中。
然后,你可以使用對話框的操作部分來定義你想記錄的事件或事件組。可用的操作類型列表有非常多,如圖11.3所示。本例選擇FAILED_LOGIN_GROUP類型。

圖11.3 選擇審核操作類型
FAILED_LOGIN_GROUP操作類型的其余列是禁用的,因為該類型沒有其他可用選項。但其他類型讓你將操作與各種服務器對象關聯起來。對話框應該看起來像圖11.4,當你單擊“確定”按鈕時,它將創建規范。

圖11.4 定義一個新的服務器審核規范
在對象資源管理器下的服務器審核規范節點會出現新創建的服務器審核規范,默認是禁用的。你可以右擊規范,然后選擇啟用服務器審核規范。
你也可以使用代碼11.4中的T-SQL語句來創建新的服務器審核規范。代碼使用一個WITH子句選項來接收狀態參數——啟用或禁用規范。如果你省略這個子句,狀態會默認設置為OFF.

CREATE SERVER AUDIT SPECIFICATION TestSQLServerAuditSpec
    FOR SERVER AUDIT [Sample Audit] ADD (FAILED_LOGIN_GROUP)
    WITH (STATE = ON);
GO

代碼11.4 T-SQL創建服務器審核規范
為了測試審核,連接到SQL Server實例,然后嘗試用一個錯誤的密碼登錄數據庫。你可以另外打開一個SSMS或者使用對象資源管理器下的連接按鈕來操作。
然后右擊Sample Audit,選擇查看審核日志,打開日志文件查看器對話框。它可能需要點時間來從磁盤文件加載到的日志條目列表,但最終你會看到如圖11.5所示的登錄失敗信息。每一行包含了相當多的有關事件的信息,使其向右滾動查看所有數據變得笨重。但當你選擇一行時,該數據會出現在窗口下方以便於閱讀。但不幸的是,如你在圖中所看到的各列沒有很好的格式。

圖11.5 查看服務器審核日志
注意服務器審核自動捕獲修改審核事件,在我啟用服務器審核時。圖中是捕獲的第二行信息。
提示:你需提前啟用服務器審核和服務器審核規范才能捕獲並寫入事件。通常,你會想創建他們的時候就啟用。
創建數據庫審核規范
創建數據庫審核規范和創建服務器審核規范非常相似。主要不同是能夠捕獲到日志的事件范圍。數據庫審核規范能夠捕獲發生在單一數據庫內的事件,比如通過T-SQL語句訪問數據,修改結構或數據庫對象的權限,或者執行存儲過程。另一重要的區別是,你在數據庫下創建數據庫審核規范,而不是在安全性節點。
如果你想創建一個審核記錄任何用戶或程序執行一個SELECT語句從AdventureWorks2012.Person.Person表中獲取數據。展開 對象資源管理器->數據庫->AdventureWorks2012->安全性,右擊數據庫審核規范節點,選擇新建數據庫審核規范,打開創建數據庫審核規范對話框,同樣它會自動生成名稱,你可以隨意修改。
圖11.6顯示了在Person.Person表上的SELECT審核操作類型,關聯到之前創建的審核Sample Audit.本例中你要選擇OBJECTS對象類(另外的選項是DATABASE和SCHEMA),Person架構,Person表名,以及主體名稱。不幸的是,你不能直接鍵入對象和主體名稱。你必須點擊旁邊的省略按鈕,會打開選擇對象對話框。

圖11.6 創建數據庫審核規范
你可以將主體名稱設置為任何數據庫用戶或角色,包括Public數據庫角色以覆蓋所有訪問數據庫的用戶。類似服務器審核規范,你可以增加任何喜歡的操作到規范。
一旦創建了規范,記得啟用它。
你也可以使用代碼11.5中的T-SQL語句創建這個規范,帶上WITH子句選項啟用規范。

USE AdventureWorks2012;
GO
CREATE DATABASE AUDIT SPECIFICATION [Person Data Access]
    FOR SERVER AUDIT [Sample Audit]
    ADD (SELECT ON OBJECT::Person.Person BY public)
    WITH (STATE = ON);
GO

代碼11.5 T-SQL代碼創建數據庫審核規范
然后你可以通過執行表上的一個SELECT語句測試審核規范。一旦你做了此操作,刷新日志文件查看器,如圖11.7。正如你所看到的,日志中包含一個非常完整的事件信息,包括引起它的SQL語句。

圖11.7 查詢Person.Person后的審核日志
也可以用T-SQL方式查看審核記錄

select * from fn_get_audit_file('D:\SQL2012\Sample%5Audit_8552B2F7-05D4-43F5-BA66-099306867836_0_130861714864290000.sqlaudit', default, default)

注意圖片中的其他信息列沒有任何內容,這是因為產生事件直接是SELECT語句。但是當SELECT語句是在存儲過程或其他代碼模塊下執行,其他信息會包含T-SQL堆棧信息的XML代碼塊。這可以用於區分查詢是以查詢語句還是代碼模塊執行的。
我們創建一個名叫tempPerson的存儲過程,包含圖片中語句列的SELECT語句。在你執行過存儲過程后,你會得到了圖11.8所示的結果,同樣出現因為有人在Person.Person表上執行了SELECT語句。但是這次注意其他信息列。

圖11.8 執行封裝SELECT語句的存儲過程
其他信息列包含XML代碼,包括一些引起審核日志的代碼信息,最重要的是存儲過程的架構和名稱。
編寫自定義審核信息
你不局限於僅捕獲每個事件的默認信息。你還可以創建用戶自定義的審核事件,它允許你將任何你希望的日志寫入到審核日志。代碼11.6中演示了如何實現這個。只有當審核規范(不管是服務器還是數據庫)被禁用時,才能修改它,所以代碼首先禁用規范。然后添加USER_DEFINED_AUDIT_GROUP操作類型到TestSQLServerAuditSpec規范,並立刻啟用它。最后一行代碼使用sp_audit_write系統存儲過程往審核日志中寫入一些有趣東西。

USE master;
GO
ALTER SERVER AUDIT SPECIFICATION TestSQLServerAuditSpec
    WITH (STATE = OFF);
GO
ALTER SERVER AUDIT SPECIFICATION TestSQLServerAuditSpec
    ADD (USER_DEFINED_AUDIT_GROUP)
    WITH (STATE = ON);
GO
-- Write some custom audit information
EXEC sp_audit_write 9999, 1, N'Something in SQL Server succeeded!'

代碼11.6 編寫自定義審核信息
當然,你也可以通過SSMS圖形界面修改服務器審核規范。
如果你執行代碼11.6,然后查看審核日志,你會看到條目出現在圖11.9的頂部。你仍然能得到很多審核事件的背景信息,包括事件的T-SQL語句,但是你會發現在底部的用戶定義的信息項是我們定義內容。

圖11.9 審核日志包含用戶定義的信息
提示:如果USER_DEFINED_AUDIT_GROUP服務器審核規范禁用,數據庫會忽略sp_audit_write.
過濾審核事件
SQL Server還包括過濾事件寫入審核日志的能力,它使用和擴展事件相同的過濾機制。過濾為你提供細粒度的控制什么會被SQL Server寫入審核日志。但重要的是,服務器仍然會為你在規范中定義的事件生成所有的日志條目,然后使用過濾來決定是否將事件寫入日志。所以,即使條目沒有寫入日志,生成事件條目還是需要開銷。這意味着,創建特定對象的審核事件通常比過濾要好。
你想創建一個審核,記錄一個特定類型的所有事件,除了特定登錄名的信息。代碼11.7的第一部分創建carol登錄名並映射到AdventureWorks2012數據庫。然后使用SUSER_ID方法檢索新用戶的主體ID(我這是288)。然后,第二部分創建一個帶WHERE子句過濾掉主體ID為288的服務器審核,並啟用服務器審核。Now carol has free reign in the database, safe from server audit events!

-- Part 1: Create the login and database user
USE AdventureWorks2012;
GO
CREATE LOGIN carol WITH PASSWORD = 'GEP2zYDt+5Cqw';
CREATE USER carol FOR LOGIN carol;
SELECT SUSER_ID('carol');

-- Part 2: Create the server audit
-- Change principal id from 288 based on SUSER_ID from previous statement
USE master;
GO
CREATE SERVER AUDIT FilterAudit
    TO APPLICATION_LOG
WITH
(    QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
)
WHERE server_principal_id <> 288;
ALTER SERVER AUDIT FilterAudit WITH (STATE = ON);
GO

代碼11.7 創建一個登錄,然后創建一個排除此用戶的審核
你也可以使用“審核屬性”對話框來過濾服務器審核事件,右鍵單擊服務器審核選擇屬性。選擇“過濾”頁,如圖11.10所示。注意,文本框只包含用於創建服務器審核語句中的WHERE子句謂詞,括在括號中。沒有必要包含WHERE關鍵字。
 
圖11.10 用審核屬性添加過濾

-- *** Clean up ***
-- ****************
USE AdventureWorks2012;
GO
DROP USER carol;
--清理數據庫審核規范
ALTER DATABASE AUDIT SPECIFICATION [Person Data Access] WITH (STATE = OFF);
DROP DATABASE AUDIT SPECIFICATION [Person Data Access];
DROP PROCEDURE dbo.tempPerson;

USE master;
GO
--清理服務器審核規范
ALTER SERVER AUDIT SPECIFICATION TestSQLServerAuditSpec WITH (STATE = OFF);
DROP SERVER AUDIT SPECIFICATION TestSQLServerAuditSpec;
--清理服務器審核
ALTER SERVER AUDIT [Sample Audit] WITH (STATE = OFF);
DROP SERVER AUDIT [Sample Audit];
ALTER SERVER AUDIT SQLServerAudit WITH (STATE = OFF);
DROP SERVER AUDIT SQLServerAudit;
ALTER SERVER AUDIT FilterAudit WITH (STATE = OFF);
DROP SERVER AUDIT FilterAudit;
--刪除登錄
DROP LOGIN carol;
View Code

總結
SQL Server審核功能讓你在服務器實例和數據庫范圍記錄各種事件的日志條目。你可以使用SSMS圖形界面或T-SQL語句創建審核對象,可以結合大量的選項比如過濾條目、編寫自定義信息、查看T-SQL堆棧信息。審核是SQL Server的一個重要的安全功能,可以幫助你找到數據庫中可疑的活動,這樣你就可以消除你的數據安全漏洞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM