SQL Server 審計(Audit)

悅光陰發表於2021-04-25

審計(Audit)用於追蹤和記錄SQL Server例項,或者單個資料庫中發生的事件(Event),審計運作的機制是通過捕獲事件(Event),把事件包含的資訊寫入到事件日誌(Event Log)或審計檔案(Audit File)中,為review提供最真實詳細的資料。

審計主要包含伺服器審計物件(Server Audit,簡稱審計物件)、伺服器級別的審計規範(Server Audit Specification)、資料庫級別的審計規範(Database Audit Specification)和目標(Target)。

  • 審計物件是在伺服器級別上建立的物件,必須啟用,用於指定審計資料的儲存方式和儲存路徑,並提供工具檢視審計資料。
  • 伺服器級別的審計規範用於記錄伺服器級別的事件(Event),
  • 資料庫級別的審計規範用於記錄資料庫級別的事件,
  • Target是指用於儲存Audit資料的媒介,可以是File、Windows Security Event Log 或 Windows Application Event Log,常用的Target是File。

SQL Server使用 Extended Events來幫助建立審計,也就是說,審計是在擴充套件事件的基礎上設計的功能,專門用於稽核資料庫的安全。為了啟用審計,首先需要建立一個SQL Server 例項級的審計物件,然後建立從屬於它的“伺服器審計規範”或“資料庫審計規範”,審計輸出的結果資料可以儲存到審計檔案(File)、安全日誌(Security Log)和應用程式日誌(Application Log)中。

一,審計物件的構成

構成審計的成分主要有4大類:審計物件、伺服器級別的審計規範、資料庫級別的審計規範和目標(Target)。

  • 審計物件可以包含一個或多個審計規範,用於指定輸出結果儲存的路徑。審計物件建立時預設的狀態是disable。
  • 伺服器級別的審計規範,從屬於審計物件,它包含伺服器級別的審計動作組(Audit Action Group)或單個Audit Action,這些動作組或動作由Extended Events觸發。
  • 資料庫級別的審計規範,也從屬於審計物件,它包含資料庫級別的審計動作組(Audit Action Group)或單個Audit Action,這些動作組或動作由Extended Events觸發。
  • Target(也稱作Audit Destination)用於儲存審計的結果,Target可以是一個file,Windows Security Event log 或者Windows application event log.

Action Group 是預定義的一組Action,每一個Action(也稱作Action Event)都是一個原子事件,因此,Action Group也是由Action Event構成的組合。當Event(也稱作Action)發生時,Event被髮送到審計物件(audit)中,SQL Server把資料記錄到Target中。關於審計的動作組和動作的詳細資訊,請閱讀官方文件:SQL Server Audit Action Groups and Actions

二,審計物件

審計監控SQL Server例項,從伺服器級別或資料庫級別的Action或Action Group中收集這些Action發生時產生的資料。

當定義一個審計物件時,需要指定儲存審計輸出結果的路徑,即audit的Target(審計的目的,audit destination)。新建的Audit預設處於disable狀態,不能自動追蹤和記錄(審計)任何audit action。當Audit啟用後,audit destination會接收從審計輸出的資料。

建立審計物件的語法:

CREATE SERVER AUDIT audit_name  
{  
    TO { [ FILE (<file_options> [ , ...n ] ) ] | APPLICATION_LOG | SECURITY_LOG | URL | EXTERNAL_MONITOR }  
    [ WITH ( <audit_options> [ , ...n ] ) ]   
    [ WHERE <predicate_expression> ]  
}  [ ; ]  
  
<file_options>::=  
{  
        FILEPATH = 'os_file_path'  
    [ , MAXSIZE = { max_size { MB | GB | TB } | UNLIMITED } ]  
    [ , { MAX_ROLLOVER_FILES = { integer | UNLIMITED } } | { MAX_FILES = integer } ]  
    [ , RESERVE_DISK_SPACE = { ON | OFF } ]   
}  
  
<audit_options>::=  
{  
    [   QUEUE_DELAY = integer ]  
    [ , ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION } ]  
    [ , AUDIT_GUID = uniqueidentifier ]  
}  

主要引數註釋:

  • FILEPATH ='os_file_path':指定審計日誌儲存的目錄,目錄中包含的檔案是基於審計名稱和審計GUID產生的。
  • MAXSIZE = { max_size }:指定一個審計檔案的最大容量,
  • MAX_ROLLOVER_FILES ={ integer | UNLIMITED }:指定審計包含的審計檔案的最大數量,當檔案數量達到限制的數量時,SQL Server會自動刪除建立時間最早的審計檔案。
  • MAX_FILES =integer:是指審計只能最多包含的審計檔案的數量,當檔案數量達到限制的數量時,不會刪除最老的審計檔案,當產生更多的審計資料時,SQL Server會丟擲錯誤,並失敗。
  • RESERVE_DISK_SPACE = { ON | OFF }:在Disk上為審計預先分配MAXSIZE的空間
  • QUEUE_DELAY =integer:單位是毫秒(千分之一秒),用於指定一個Audit Action從發生到被強制處理可以經過的時間間隔,預設值是1000,即1秒,這也是可以甚至的最小查詢延遲。值為0表示同步傳送,
  • ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION }:當Target不能繼續寫入審計日誌時,審計物件的動作:
    •   CONTINUE,是指不保留審計記錄,審計繼續嘗試記錄事件,如果解決了故障情況,則繼續進行審計。
    •   SHUTDOWN:如果SQL Server由於任何原因不能寫入審計記錄,那麼強制關閉SQL Server例項
    •   FAIL_OPERATION:如果資料庫操作導致審計事件的發生,那麼執行的資料庫操作將失敗;不會導致審計事件發生的操作,將繼續執行。

注意:審計物件(Server Audit)的create、alter、或 drop,需要ALTER ANY SERVER AUDIT或CONTROL SERVER的許可權。當儲存Audit Log時,為了保證審計資料的安全,需要限制無關人員的許可權,禁止無關人員訪問審計檔案的儲存目錄。

舉個例子,建立審計物件:

CREATE SERVER AUDIT [AuditMonitorQuery]
TO FILE 
(    FILEPATH = N'G:\AuditFiles\MonitorQuery\'
    ,MAXSIZE = 1 GB
    ,MAX_ROLLOVER_FILES = 128
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(    QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
    ,AUDIT_GUID = 'xxx'
)
ALTER SERVER AUDIT [AuditMonitorQuery] WITH (STATE = ON)
GO

三,伺服器級別的審計規範

伺服器級別的審計規範屬於Server Audit,伺服器界別的審計規範從伺服器級別的action group中收集資料。

CREATE SERVER AUDIT SPECIFICATION audit_specification_name  
FOR SERVER AUDIT audit_name  
{  
    { ADD ( { audit_action_group_name } )   
    } [, ...n]  
    [ WITH ( STATE = { ON | OFF } ) ]  
}  

注意:擁有ALTER ANY SERVER AUDIT許可權的使用者可以建立伺服器級別的審計規範,擁有CONTROL SERVER許可權或sysadmin可以檢視審計資料。

舉個例子:建立伺服器級別的審計規範

CREATE SERVER AUDIT SPECIFICATION HIPAA_Audit_Specification  
FOR SERVER AUDIT HIPAA_Audit  
    ADD (FAILED_LOGIN_GROUP)  
    WITH (STATE=ON); 

四,資料庫級別的審計規範

資料庫級別的審計規範屬於一個Server Audit, 資料庫級別的審計規範從資料庫級別的action group,或者audit event中收集資料。action group是預先定義的一組audit event,這些action產生的資訊都會被髮送到Audit,被儲存到Target中。

CREATE DATABASE AUDIT SPECIFICATION audit_specification_name  
{  
    FOR SERVER AUDIT audit_name   
        [ { ADD ( { <audit_action_specification> | audit_action_group_name } ) } [, ...n] ]  
    [ WITH ( STATE = { ON | OFF } ) ]  
} [ ; ]  
<audit_action_specification>::= action [ ,...n ] ON [ class :: ] securable BY principal [ ,...n ]

重要引數註釋:

  • action:資料庫級別的action的名,
  • class:securable的class name
  • securable:資料庫中審計作用(應用audit action 或audit action group)的table、view 等安全物件(Securable Object)。
  • principal:資料庫中審計作用(應用audit action 或audit action group)的principal,如果審計所有的principal,請使用public。

注意:擁有 ALTER ANY DATABASE AUDIT 許可權的使用者可以建立資料庫級別的審計規範,當資料庫級別的審計規範被建立之後,可以被CONTROL SERVER和sysadmin產看。

舉個例子:

CREATE DATABASE AUDIT SPECIFICATION Audit_Pay_Tables  
FOR SERVER AUDIT HIPAA_Audit  
ADD (SELECT , INSERT ON HumanResources.EmployeePayHistory BY public )  
WITH (STATE = ON) ;

五,Target

審計輸出的結果會被髮送到Target,實際上,Target的作用是儲存審計資料,可以是一個檔案,Windows Security event log或Windows Application event log。

任何授權的使用者都可以讀寫Windows Application event log,它的安全級別比Windows Security event log要低。通常情況下,審計資料都會儲存到單獨的檔案中。

當把審計資訊儲存到一個file,為了保證審計資料的安全,可以通過以下方式限制對檔案位置的訪問:

  • SQL Server Service Account必須同時具有讀寫許可權
  • Audit 管理員需要有審計檔案的讀寫許可權
  • Audit Reader:具有讀取審計檔案的許可權

因為資料庫引擎可以訪問審計檔案,擁有CONTROL SERVER許可權的SQL Server Login都可以使用資料庫引擎來訪問審計檔案。為了記錄正在讀取審計檔案的使用者,需要定義一個審計,追蹤和記錄使用者對函式master.sys.fn_get_audit_file的呼叫記錄,這個審計記錄了擁有CONTROL SERVER許可權的Login通過SQL Server訪問審計檔案的記錄。

如果審計管理員(Audit Admin)把檔案複製到其他位置(處於存檔等目的),那麼需要將新位置上的許可權降級為:

  • Audit Administrator - Read / Write
  • Audit Reader - Read

注意:為了保護審計檔案,應該對審計檔案進行加密,對儲存審計檔案的目錄使用Windows BitLocker Drive Encryption或Windows Encrypting File System,從而防止未經授權的訪問。

 

 

參考文件:

SQL Server Audit (Database Engine)

相關文章