SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文:SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)介绍     Audit是SQL Server 2008之后才有的功能,它能告诉你“谁什么时候做了什么事情”。
原文: SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)

介绍

    Audit是SQL Server 2008之后才有的功能,它能告诉你“谁什么时候做了什么事情”。具体是指审核SQL Server 数据库引擎实例或单独的数据库涉及到跟踪和记录数据库引擎中发生的事件。它的底层是基于扩展事件(Extented Event),所以其性能和灵活性相对较好。审核数据可以输出到审核文件、Windows安全日志和应用程序日志。

    Audit都需要创建一个实例级的“SQL Server审核”,然后可以创建从属于它“服务器审核规范”和“数据库审核规范”。可以理解“SQL Server审核”是审核的顶级容器,这两个“规范”是定义要审核的具体内容。

创建和使用审核的一般过程:

1. 创建审核并定义目标。

2. 创建映射到审核的服务器审核规范或数据库审核规范,并启用审核规范。

3. 启用审核。

4. 通过使用 Windows“事件查看器”、“日志文件查看器”或 fn_get_audit_file 函数来读取审核事件。

 

实现

创建测试数据库和数据:

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. 审核的目标结果,无论是审核文件或者应用程序日志,都需要另外处理和分析才能得想要的内容。
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5月前
|
SQL 开发框架 .NET
突破T-SQL限制:利用CLR集成扩展RDS SQL Server的功能边界
CLR集成为SQL Server提供了强大的扩展能力,突破了T-SQL的限制,极大地拓展了SQL 的应用场景,如:复杂字符串处理、高性能计算、图像处理、机器学习集成、自定义加密解密等,使开发人员能够利用 .NET Framework的丰富功能来处理复杂的数据库任务。
|
6月前
|
SQL 数据库
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
933 0
|
8月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
159 0
|
8月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
993 0
|
7月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
9月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
258 13
|
9月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
160 9
|
9月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
116 6
|
9月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
736 1
|
9月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
739 3

热门文章

最新文章

下一篇
oss创建bucket