SQL Server 审核(Audit)-- 使用T-SQL创建审核,以审核数据库内的查询操作
任务1:创建审核
步骤1:打开SSMS,执行以下脚本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
--01 Create SQL Server Audit USE master GO CREATE SERVER AUDIT [Audit-AdventureWorks2012- SELECT ]
TO FILE
( FILEPATH = N 'D:\MSSQL\DATA\Audit_logs'
,MAXSIZE=10MB ,MAX_ROLLOVER_FILES=100 ,RESERVE_DISK_SPACE= OFF )
WITH ( QUEUE_DELAY=1000,ON_FAILURE= CONTINUE )
GO --02 Enable the Audit ALTER SERVER AUDIT [Audit-AdventureWorks2012- SELECT ]
WITH (STATE= ON )
GO --03 Use sys.server_audits to check current status SELECT name N 'Audit' , is_state_enabled N 'Enabled' ,type_desc N 'Audit Type' ,queue_delay N 'Wait Time' ,create_date N 'Create Time' ,modify_date N 'Modify Time'
FROM sys.server_audits
|
利用CREATE SERVER AUDIT语法,创建审核对象,说明如下。
l 审核名称:Audit-AdventureWorks2012-SELECT。
l 队列延迟:1000(秒)。
l 审核目标:File。
l 文件路径:D:\MSSQL\DATA\Audit_logs。
l 最大滚动更新文件:100。
l 最大文件大小:10MB。
l 此服务器审核对象已经启用。
任务2:创建服务器审核规范对象
步骤1:打开SSMS,执行以下脚本。
1
2
3
4
5
6
7
8
9
10
|
--01 Create Server Audit Specification USE master GO CREATE SERVER AUDIT SPECIFICATION [ServerAuditSpecification-Login-Successful]
FOR SERVER AUDIT [Audit-AdventureWorks2012- SELECT ]
ADD (SUCCESSFUL_LOGIN_GROUP)
GO --02 Enable the Server Audit Specification ALTER SERVER AUDIT SPECIFICATION [ServerAuditSpecification-Login-Successful]
WITH (STATE= ON )
|
利用CREATE SERVER AUDIT SPECIFICATION语法,创建Server Audit Specification,具备以下的特性。
l 服务器审核规范的名称:ServerAuditSpecification-Login-Successful。
l 使用此审核规范的审核名称:Audit-AdventureWorks2012-SELECT。
l 所要审核的操作组:SUCCESSFUL_LOGIN_GROUP。
步骤2:执行以下代码,查看服务器审核规范对象。
1
2
3
4
5
6
7
8
|
--01 Query Server Audit Specification SELECT name N 'Server Audit Specification' ,is_state_enabled N 'Enabled' ,
Create_date N 'Create Time' ,modify_date N 'Modify Time'
FROM sys.server_audit_specifications
--02 Query Server Audit Specification more information SELECT audit_action_id N 'Audit Action ID' ,audit_action_name N 'Audit Action Or Audit Action Group' ,
Class_desc N 'Object Class' ,is_group N 'Action Group'
FROM sys.server_audit_specification_details
|
步骤3:执行以下代码,查看可用的审核操作、审核操作组的项目。
1
2
3
4
5
|
--Audit Action or Audit Action Group SELECT * FROM sys.dm_audit_actions
SELECT * FROM sys.dm_audit_actions WHERE action_id= 'LGSD'
--Audit class type SELECT * FROM sys.dm_audit_class_type_map ORDER BY securable_class_desc
|
任务3:创建数据库审核规范对象
步骤1:打开SSMS,执行以下脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--01 Create Database Audit Specification USE AdventureWorks2012 GO CREATE DATABASE AUDIT SPECIFICATION [AuditDatabaseSpecification-Object- SELECT ]
FOR SERVER AUDIT [Audit-AdventureWorks2012- SELECT ]
ADD ( SELECT ON SCHEMA ::[dbo] BY [ public ])
GO /* { Action [ ,…n] ON [ class :: ] securable BY principal [ ,…n]
} */ --02 Enable Database Audit Specification ALTER DATABASE AUDIT SPECIFICATION [AuditDatabaseSpecification-Object- SELECT ]
WITH (STATE= ON )
|
利用CREATE DATABASE AUDIT SPECIFICATION语法,创建数据库审核规范对象,具备以下的特性。
l 数据库审核对象的名称:[AuditDatabaseSpecification-Object-SELECT]
使用此审核规范的审核名称:[Audit-AdventureWorks2012-SELECT]
l 所要审核的操作:SELECT。
l Class是安全性实体上的类名。在此,特别用SCHEMA关键词,这是指数据库内的架构。目前可选用的审核类型,请查询目录视图sys.dm_audit_class_type_map。
l Securable使用dbo关键词,这表示包含dbo架构下的所有对象。可以依据审核的要求,填入适合的架构名称。
l 在principal部分,使用public关键词,代表固定数据库级别角色public。因为每位数据库用户都属于public数据库角色,借此可以包含数据库的每一位用户账户。
步骤2:执行以下脚本,查看可用于设置数据库审核规范对象的相关信息。
1
2
3
4
5
6
7
8
|
SELECT * FROM sys.database_audit_specifications
SELECT name N 'Database Audit Specification' ,is_state_enabled N 'Enabled' ,
Create_date N 'Create Time' ,modify_date N 'Modify Time'
FROM sys.database_audit_specifications
SELECT * FROM sys.database_audit_specification_details
SELECT audit_action_id N 'Audit Action ID' ,audit_action_name N 'Audit Action Or Audit Action Group' ,
Class_desc N 'Class Desc' ,is_group N 'Action Group'
FROM sys.database_audit_specification_details
|
任务4:测试审核功能 – 登录目标数据库,查询数据表
步骤1:打开SSMS,执行以下脚本,创建账户superpippo,登录到数据库AdventureWorks2012并赋予适当的权限。
1
2
3
4
5
6
7
8
9
10
11
12
|
USE master GO CREATE LOGIN [superpippo]
WITH PASSWORD =N 'Mpdfzh7' ,DEFAULT_DATABASE=AdventureWorks2012,
CHECK_EXPIRATION= OFF ,CHECK_POLICY= OFF
GO USE AdventureWorks2012 GO CREATE USER [superpippo]
FOR LOGIN [superpippo]
GO EXEC sp_addrolemember N 'db_datareader' ,N 'superpippo'
|
步骤2:利用登录账户superpippo登录SQL Server,执行以下代码。
1
2
3
4
5
|
USE AdventureWorks2012 GO SELECT * FROM dbo.DatabaseLog
SELECT * FROM dbo.ErrorLog
SELECT * FROM Person. Password
|
任务5: 使用日志文件查看器阅读审核日志
步骤1:展开“Object Explorer”,“Security”,“Audits”节点。
步骤2:在“Audits”节点“Audit-AdventureWorks2012-SELECT”对象上右击,选择“View Audit Logs”选项。
步骤3:在“Log File Viewer”左上角的“Select logs”区域,确认有勾选“Audit Collection”,“Audit-AdventureWorks2012-SELECT”,利用以下的方式来阅读所记录的审核信息。
需要将“Action ID”为LOGIN SUCCEEDED与SELECT两者的日志信息结合后,才能筛选处所需要的审核信息。
任务6:创建T-SQL函数进一步分析审核的日志
步骤1:执行以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
--Create Function ufn_AuditReport USE master GO IF EXISTS( SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N '[dbo].[ufn_AuditReport]' ) AND type in (N 'FN' ,N 'IF' ,N 'TF' ,N 'FS' ,N 'FT' ))
DROP FUNCTION [dbo].[ufn_AuditReport]
GO CREATE FUNCTION dbo.ufn_AuditReport
(@filepath varchar (1000))
RETURNS @retAuditReport TABLE
( [session_id] int NULL ,
[server_principal_name] sysname NOT NULL ,
[ip] nvarchar(100) NULL ,
[login_time] datetimeoffset(7) NULL ,
[database_name] sysname NOT NULL ,
[action_time] datetimeoffset(7) NULL ,
[tsql] nvarchar(4000) NULL
) AS BEGIN DECLARE @tsl TABLE
(RN int , session_id int , event_time datetime2, server_principal_name sysname,
Server_principal_id int , database_name sysname, statement nvarchar(4000))
DECLARE @tlgls TABLE
(RN int IDENTITY(1,1), event_time datetime2, additional_information nvarchar(4000))
INSERT @tsl
SELECT ROW_NUMBER() OVER( ORDER BY event_time) 'RN' ,
Session_id,event_time,server_principal_name,server_principal_id,database_name,statement FROM sys.fn_get_audit_file(@filepath, default , default )
WHERE action_id IN ( 'SL' )
DECLARE @rid INT =1
DECLARE @tslRN INT =( SELECT MAX (RN) FROM @tsl)
WHILE @tslRN>[email protected] BEGIN INSERT @tlgls(event_time,additional_information)
SELECT TOP (1) event_time,additional_information
FROM sys.fn_get_audit_file(@filepath, default , default )
WHERE action_id= 'LGIS' AND [email protected]_id AND [email protected]_principal_id AND event_time<@event_time
ORDER BY event_time DESC
SET @rid+=1
END INSERT @retAuditReport
SELECT s.session_id, s.server_principal_name, ( CAST (g.additional_information AS XML)).value( 'declare default element namespace "http://schemas.microsoft.com/sqlserver/2008/sqlaudit_data";(action_info/address)[1]' , 'nvarchar(100)' ) N 'ip' ,
SWITCHOFFSET( CAST (g.event_time AS datetimeoffset), '+08:00' ) N 'login_time' ,
s.database_name, SWITCHOFFSET( CAST (s.event_time AS datetimeoffset), '+08:00' ) N 'action_time' ,
s.statement N 'tsql'
FROM @tsl s INNER JOIN @tlgls g
ON s.RN=g.RN
RETURN END ;
GO |
1
2
3
|
--02 Using ufn_AuditReport to analysis audit log file SELECT session_id N 'Session ID' , server_principal_name N 'Login' , ip N 'Client Host Address' , database_name N 'Database' , action_time N 'Audit Time(Timezone Beijing GMT+08:00)' , tsql N 'T-SQL'
FROM dbo.ufn_AuditReport(N ' D:\MSSQL\DATA\Audit_logs\Audit-AdventureWorks2012-SELECT_*' )
|
创建数据表值函数ufn_AuditReport,来分析审核所记录的数据,在数据列additional_information存放客户端主机的IP地址,以XML结构方式显示,所以,需要利用XQuery来取得所需的数据。在调用此数据表值函数时,请输入要分析的审核文件的完整路径,可以搭配使用通配符“*”。
本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1597725,如需转载请自行联系原作者