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的權限。
參考文檔: