SQL Server 審計 第一篇:介紹(Audit)


SQL Server 審計系列:

 

審計(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產看。

舉個例子,對數據庫中的所有對象,記錄select  和 

CREATE DATABASE AUDIT SPECIFICATION Audit_Pay_Tables  
FOR SERVER AUDIT HIPAA_Audit  
ADD (SELECT , INSERT, UPDATE, DELETE, EXEUCTE ON database :: db_name 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,從而防止未經授權的訪問。

六,審計動作

審計需要記錄服務器級別的Action Group,或者數據庫級別的Action Group或者單個Action Event。

審計Action主要分為三類:

  • 服務器級別:這類Action主要包含服務器操作,包含登錄和登出操作
  • 數據庫級別:這類Action主要包括數據操作語言(DML)和數據定義語言(DDL)。
  • 審計級別:在審計過程中的動作,Action Group只有一個:AUDIT_CHANGE_GROUP

詳細描述,請閱讀官方手冊:SQL Server Audit Action Groups and Actions

我列出比較重要的審計動作或審計動作組。

1,服務器級別的審計動作組

  • AUDIT_CHANGE_GROUP:當Audit被創建、修改和刪除時,觸發該事件
  • BATCH_COMPLETED_GROUP:當任何batch、sp或事務完成執行時,觸發該事件,並記錄下執行的命令的文本。
  • BATCH_STARTED_GROUP:當任何batch、sp或事務開始執行時,觸發該事件,並記錄下執行的命令的文本。
  • DATABASE_OBJECT_CHANGE_GROUP:當任何數據庫中的對象執行create、alter或drop命令時,觸發該事件,可能會產生巨大的審計日志
  • FAILED_LOGIN_GROUP:當一個principal嘗試登錄SQL Server,並失敗時,觸發該事件
  • FAILED_DATABASE_AUTHENTICATION_GROUP:當一個Principal嘗試登錄數據庫,並失敗時,觸發該事件
  • SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP:當一個principal成功登錄SQL Server中的數據庫時,觸發該事件
  • SUCCESSFUL_LOGIN_GROUP:當一個principal成功登錄SQL Server時,觸發該事件

2,數據庫級別的審計動作組

  • BATCH_COMPLETED_GROUP
  • BATCH_STARTED_GROUP
  • DATABASE_OBJECT_CHANGE_GROUP:當對數據庫對象執行CREATE、ALTER、 或 DROP命令時,觸發該事件
  • DATABASE_OBJECT_PERMISSION_CHANGE_GROUP:當數據庫對象的權限(執行GRANT, REVOKE, or DENY)發生變化時,觸發該事件
  • DATABASE_PRINCIPAL_CHANGE_GROUP:當數據庫中的user,role等發生變化時,觸發該事件
  • SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP:當一個Schema中的對象的權限(執行GRANT, REVOKE, or DENY)發生變化時,觸發該事件
  • SCHEMA_OBJECT_CHANGE_GROUP:當對Schema中的對象執行CREATE、ALTER、 或 DROP命令時,觸發該事件
  • SCHEMA_OBJECT_ACCESS_GROUP:當schema中的對象的權限發生變化時,觸發該事件

3,數據庫級別的單個審計動作

數據庫級別的審計動作(Audit Action),分別在執行查詢、修改、插入、刪除、執行、等命令時觸發

  • SELECT:This event is raised whenever a SELECT is issued.
  • UPDATE:
  • INSERT:
  • DELETE:
  • EXECUTE:
  • RECEIVE:This event is raised whenever a RECEIVE is issued.
  • REFERENCES:This event is raised whenever a REFERENCES permission is checked.

RECEIVE 是指 Service Broker queues。

七,跟審計相關的權限控制 

創建、修改或刪除 Server Audit 或者 服務器級別的審計規范,需要服務器級別的權限,ALTER ANY SERVER AUDIT 或者CONTROL SERVER的權限。

創建、修改或刪除數據庫級別的審計規范,不僅需要數據庫的權限:ALTER ANY DATABASE AUDIT、ALTER,或者 CONTROL權限,而且還需要服務器級別的權限:ALTER ANY SERVER AUDIT 或者CONTROL SERVER的權限。

注意,sysadmin角色可以修改任何審計組件,db_owner角色可以修改數據庫級別的審計規范。

查看Audit Log需要CONTROL SERVER的權限,用戶既可以通過SSMS的View Audit Logs來查看審計日志,也可以通過函數sys.fn_get_audit_file (Transact-SQL) 來查看審計日志,這兩種方式都需要具有CONTROL SERVER的權限。

 

 

參考文檔:

SQL Server Audit (Database Engine)


免責聲明!

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



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