本文属于SQL Server安全专题系列
接上文:SQL Server 安全篇——SQL Server 审核(2)——审核实操,很多时候,原生的审核功能并不能完全满足需求,这个时候,就可以使用服务器审核规范或者数据库审核规范来捕获USER_DEFINED_AUDIT_GROUP审核操作组,然后手动在应用程序中触发。
自定义服务器审核和数据库审核规范:
下面脚本获取USER_DEFINED_AUDIT_GROUP操作组,针对的是AdventureWorks2017中的Person.Person表。如果对脚本不熟悉,可以先回看前面两节。
USE Master
GO
CREATE SERVER AUDIT [Audit-Custom]
TO FILE
(
FILEPATH = 'E:\Audit'
,MAXSIZE = 256 MB
,MAX_ROLLOVER_FILES = 2147483647
,RESERVE_DISK_SPACE = OFF
)
WITH
( QUEUE_DELAY = 1000
,ON_FAILURE = CONTINUE
) ;
GO
CREATE SERVER AUDIT SPECIFICATION [ServerAuditSpecification-Custom]
FOR SERVER AUDIT [Audit-Custom]
ADD (USER_DEFINED_AUDIT_GROUP)
WITH (STATE = ON) ;
GO
ALTER SERVER AUDIT [Audit-Custom]
WITH (STATE = ON) ;
USE AdventureWorks2017
GO
CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Custom]
FOR SERVER AUDIT [Audit-Custom]
ADD (DELETE ON OBJECT::Person.Person BY public) ;
ALTER DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Custom]
WITH (STATE = ON) ;
成功后的样子:
触发事件:
使用sp_audit_write系统存储过程来调起自定义事件。其参数说明如下:
参数 | 说明 |
@user_defined_event_id | 指定用户自定义事件的ID |
@succeeded | 定义事件是否成功:0为失败,1为成功 |
@user_defined_information | 定义事件的描述 |
这个sp可以在存储过程或这触发中调用,比如在触发器中触发事件:
CREATE TRIGGER FireCustomEvent
ON Person.Person
AFTER INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM Inserted) > 5
BEGIN
EXEC sys.sp_audit_write 1, 1, 'More than 5 items order' ;
END
END ;
但是注意触发器会降低性能。
总结:
SQL Server审核可以提供复杂、轻量级的审核机制。用于记录特权用户对数据库的非授权操作。对审核的合理使用可以减轻很多不必要的工作量。通过对USER_DEFINED_AUDIT_GROUP审核操作组的使用,可以进行用户自定义的事件审核。从而更丰富整个审核体系。