SQL Server審計功能入門:SQL Server審覈 (SQL Server Audit)

介紹

    Audit是SQL Server 2008以後纔有的功能,它能告訴你「誰何時作了什麼事情」。具體是指審覈SQL Server 數據庫引擎實例或單獨的數據庫涉及到跟蹤和記錄數據庫引擎中發生的事件。它的底層是基於擴展事件(Extented Event),因此其性能和靈活性相對較好。審覈數據能夠輸出到審覈文件、Windows安全日誌和應用程序日誌。sql

    Audit都須要建立一個實例級的「SQL Server審覈」,而後能夠建立從屬於它「服務器審覈規範」和「數據庫審覈規範」。能夠理解「SQL Server審覈」是審覈的頂級容器,這兩個「規範」是定義要審覈的具體內容。數據庫

建立和使用審覈的通常過程:安全

1. 建立審覈並定義目標。服務器

2. 建立映射到審覈的服務器審覈規範或數據庫審覈規範,並啓用審覈規範。session

3. 啓用審覈。編輯器

4. 經過使用 Windows「事件查看器」、「日誌文件查看器」或 fn_get_audit_file 函數來讀取審覈事件。ide

 

實現

建立測試數據庫和數據:函數

use master

go

create database AuditTest

go

use AuditTest

go

create table tb(ID int primary key ,name varchar(20),weight decimal(10,2));

insert into tb values(1,'John',70.2),(2,'Ted',80.8),(3,'Clark',75.1)

go

1. 建立審覈和定義目標。性能

建立審覈能夠用SSMS或者語句實現。所謂目標,就是審覈輸出存到哪裏,與擴展事件的Target差很少。測試

clip_image001

對應的語句建立:

--create Server Audit

USE [master]

GO

CREATE SERVER AUDIT [Audit-AuditTest]

TO FILE

( FILEPATH = N'D:\share'

 ,MAXSIZE = 50 MB

 ,MAX_FILES = 10

 ,RESERVE_DISK_SPACE = ON

)

WITH

( QUEUE_DELAY = 1000

 ,ON_FAILURE = CONTINUE

 --AUDIT_GUID=uniqueidentifier 

)

--WHERE object_name='tb'

GO

--Enable Server Audit

alter server audit [Audit-AuditTest] with (state=on)

簡單說明一下相關參數:

TO FILE:指定輸出到審覈文件,也能夠指定爲Security Log和Application Log。
FILEPATH:審覈文件的目錄地址。

MaxSize:單個審覈文件的最大容量。
MAXSIZE:相似於Trace,指定Rollover容許最多文件數。
RESERVE_DISK_SPACE:預先分配審覈文件到MaxSize。我的推薦啓用。
QUEUE_DELAY:指定事件發生到被強制審覈的毫秒間隔。指定爲0則爲同步審覈。
ON_FAILURE :當審覈向上檔寫入數據失敗時,接下來會採起的行爲:CONTINUE | SHUTDOWN | FAIL_OPERATION。
AUDIT_GUID:用於數據庫鏡像。相似Login的SID做用,鏡像會話的主庫若是有審覈,則在鏡像庫建立對應的審覈須要指定一樣GUID。

WHERE:至關於擴展事件中Predicate,用於指定過濾條件。

2. 建立數據庫審覈規範並啓用之

指定從屬於哪一個SQL Server審覈和定義出要審覈的內容。能夠經過SSM或者語句建立之。下面針對測試表tb建立審覈規範:任何人對tb表的DML和表結構修改操做都被審覈。

clip_image002

對應的語句:

--Create and enable Database Audit Specification

USE [AuditTest]

GO

CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-AuditTest]

FOR SERVER AUDIT [Audit-AuditTest]

ADD (SCHEMA_OBJECT_CHANGE_GROUP),

ADD (SELECT,DELETE,INSERT,UPDATE ON OBJECT::[dbo].[tb] BY [public])

WITH (STATE=ON)

GO

對照SSMS,參數的意義就很明白了。更詳細內容參考:CREATE DATABASE AUDIT SPECIFICATION

審覈活動類型(Audit Action Type)參考:SQL Server 審覈操做組和操做

3. 啓用審覈

    SQL Server在建立審覈和審覈規範時,默認是不啓用,須要顯式啓用。在前面兩步,我已經顯式啓用了。

4. 測試和查看審覈數據

use AuditTest

go

select * from dbo.tb

where ID=1;

update dbo.tb

set name='Ted_New'

where ID=2;

alter table dbo.tb alter column name varchar(30);

alter table dbo.tb add newCol varchar(20);

go

在前面目標定義的文件中會生成一個審覈文件,文件名:[SQL Server審覈名稱]_[審覈的GUID]_*.sqlaudit。

這個文件也能夠用其它文字編輯器打,可是不便閱讀。一般使用系統函數sys.fn_get_audit_file讀取它。

SELECT event_time

    , action_id

    , succeeded

    , session_id

    , session_server_principal_name

    , object_name

    , statement

    , file_name

    , audit_file_offset

from sys.fn_get_audit_file('d:\share\*',default,default)

clip_image003

從結果能夠獲得:誰在何時作了什麼。Select和Alter語句只有一條記錄。Update有兩條記錄,一條Select和一條Update。將audit_file_offset的值傳遞給fn_get_audit_file做爲第三個參數值,能夠實現從指定的offset讀取審覈文件。注意:event_time輸出爲UTC時間了。

固然也能夠直接查看:

clip_image004

5. 嘗試服務器審覈規範

審覈建立和刪除登陸,並將審覈內容記錄到應用程序日誌。

USE [master]
GO
CREATE SERVER AUDIT [Audit-AuditTest]
TO APPLICATION_LOG
WITH
( QUEUE_DELAY = 1000
,ON_FAILURE = CONTINUE
)
GO
Alter SERVER AUDIT [Audit-AuditTest] With(State=On)
go
Create Server Audit Specification SAS_CreateDropLogin
For Server Audit [Audit-AuditTest]
Add (SERVER_PRINCIPAL_CHANGE_GROUP)
With (State=On)
go
create login xx with password='P@ssW0rd';
drop login xx ;

經過Windows的事件查看器,能夠查看到33205事件。我的以爲在查看數據詳細事件時,使用XML格式更好理解一些。

clip_image005

總結

  1. SQL Server審覈相對而言性能影響較少,審覈粒度也很是靈活。
  2. 審覈是針對「事件「,回答」誰何時幹了什麼「,但對數據自己變化的跟蹤力度較弱。
  3. 審覈的目標結果,不管是審覈文件或者應用程序日誌,都須要另外處理和分析才能得想要的內容。
相關文章
相關標籤/搜索