SQLSERVER2008新增的审核/审计功能

很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计

例如对失败的登录次数进行审计,某个数据库上的DDL语句进行审计,某个数据库表里面的delete语句进行审计

事实上,我们这些审计的需求基本上都是为了一个目的:防黑客

上面的这些审计需求无非就是看一下有哪些人试图入侵数据库服务器,入侵了之后是否有drop表,是否有delete数据

在SQLSERVER2008及以前版本可以选择的方案有

1、服务器级别DDL触发器和数据库级别的DDL触发器(SQL2005及以上版本) 以及DML触发器

2、从事务日志里读取操作记录,权威的书都会说事务日志不是审核工具,一般大型数据库都会设置为简单模式,事务日志截断

3、依靠SQLSERVER ERRORLOG来检查登录审核,导致SQLSERVER ERRORLOG login相关的日志泛滥 导致SQL排错造成困难

4、事件通知:http://www.cnblogs.com/gaizai/p/3473553.html
5、更改跟踪:http://www.cnblogs.com/gaizai/p/3482579.html
6、变更数据捕获(CDC):http://www.cnblogs.com/gaizai/p/3479731.html

我们一般都会把C2 审核跟踪和登录审核里面只限成功的登录,以防止SQL ERRORLOG日志泛滥,因为服务器是很久才重启一次的,如果不做修改很容易造成磁盘爆满

--禁用C2 审核跟踪和只限成功的登录
EXEC sys.sp_configure N‘c2 audit mode‘, N‘0‘
GO
RECONFIGURE WITH OVERRIDE
GO

USE [master]
GO
EXEC xp_instance_regwrite N‘HKEY_LOCAL_MACHINE‘, N‘Software\Microsoft\MSSQLServer\MSSQLServer‘, N‘AuditLevel‘, REG_DWORD, 1
GO


SQLSERVER2008新增的审核功能

在sqlserver2008新增了审核功能,可以对服务器级别和数据库级别的操作进行审核/审计,本人觉得审核功能是对上面众多解决方案的统一

我们看一下审核的使用方法

审核对象

步骤一:创建审核对象,审核对象是跟保存路径关联的,所以如果你需要把审核操作日志保存到不同的路径就需要创建不同的审核对象

我们把审核操作日志保存在文件系统里,在创建之前我们还要在相关路径先创建好保存的文件夹,我们在D盘先创建sqlaudits文件夹,然后执行下面语句

--创建审核对象之前需要切换到master数据库
USE [master]
GO
CREATE SERVER AUDIT MyFileAudit TO FILE(FILEPATH=‘D:\sqlaudits‘) --这里指定文件夹不能指定文件,生成文件都会保存在这个文件夹
GO

实际上,我们在创建审核对象的同时可以指定审核选项,下面是相关脚本

把日志放在磁盘的好处是可以使用新增的TVF:sys.[fn_get_audit_file] 来过滤和排序审核数据,如果把审核数据保存在Windows 事件日志里查询起来非常麻烦

USE [master]
GO
CREATE SERVER AUDIT MyFileAudit TO FILE(
FILEPATH=‘D:\sqlaudits‘,
MAXSIZE=4GB,
MAX_ROLLOVER_FILES=6)
WITH (
ON_FAILURE=CONTINUE,
QUEUE_DELAY=1000);

ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)

MAXSIZE:指明每个审核日志文件的最大大小是4GB

MAX_ROLLOVER_FILES:指明滚动文件数目,类似于SQL ERRORLOG,达到多少个文件之后删除前面的历史文件,这里是6个文件

ON_FAILURE:指明当审核数据发生错误时的操作,这里是继续进行审核,如果指定shutdown,那么将会shutdown整个实例

queue_delay:指明审核数据写入的延迟时间,这里是1秒,最小值也是1秒,如果指定0表示是实时写入,当然性能也有一些影响

STATE:指明启动审核功能,STATE这个选项不能跟其他选项共用,所以只能单独一句

在修改审核选项的时候,需要先禁用审核,再开启审核

ALTER SERVER AUDIT MyFileAudit WITH(STATE =OFF)
ALTER SERVER AUDIT MyFileAudit WITH(QUEUE_DELAY =1000)
ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)


审核规范

在SQLSERVER审核里面有审核规范的概念,一个审核对象只能绑定一个审核规范,而一个审核规范可以绑定到多个审核对象

我们来看一下脚本

CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFile
FOR SERVER AUDIT MyFileAudit
ADD (failed_login_group),
ADD (successful_login_group)
WITH (STATE=ON)
GO

CREATE SERVER AUDIT MyAppAudit TO APPLICATION_LOG
GO
ALTER SERVER AUDIT MyAppAudit WITH(STATE =ON)
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=OFF)
GO
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile
FOR SERVER AUDIT MyAppAudit
ADD (failed_login_group),
ADD (successful_login_group)
WITH (STATE=ON)
GO

我们创建一个服务器级别的审核规范CaptureLoginsToFile,然后再创建多一个审核对象MyAppAudit ,这个审核对象会把审核日志保存到Windows事件日志的应用程序日志里

我们禁用审核规范CaptureLoginsToFile,修改审核规范CaptureLoginsToFile属于审核对象MyAppAudit ,修改成功

而如果要把多个审核规范绑定到同一个审核对象则会报错

CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileA
FOR SERVER AUDIT MyFileAudit
ADD (failed_login_group),
ADD (successful_login_group)
WITH (STATE=ON)
GO

CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileB
FOR SERVER AUDIT MyFileAudit
ADD (failed_login_group),
ADD (successful_login_group)
WITH (STATE=ON)
GO

--消息 33230,级别 16,状态 1,第 86 行
--审核 ‘MyFileAudit‘ 的审核规范已经存在。

这里要说一下 :审核对象和审核规范的修改 ,无论是审核对象还是审核规范,在修改他们的相关参数之前,他必须要先禁用,后修改,再启用

--禁用审核对象
ALTER SERVER AUDIT MyFileAudit WITH(STATE =OFF)
--禁用服务器级审核规范
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=OFF)
GO
--禁用数据库级审核规范
ALTER DATABASE AUDIT SPECIFICATION CaptureDBLoginsToFile WITH (STATE=OFF)
GO

--相关修改选项操作

--启用审核对象
ALTER SERVER AUDIT MyFileAudit WITH(STATE =ON)
--启用服务器级审核规范
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=ON)
GO
--启用数据库级审核规范
ALTER DATABASE AUDIT SPECIFICATION CaptureDBLoginsToFile WITH (STATE=ON)
GO

审核服务器级别事件

审核服务级别事件,我们一般用得最多的就是审核登录失败的事件,下面的脚本就是审核登录成功事件和登录失败事件

CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFile
FOR SERVER AUDIT MyFileAudit
ADD (failed_login_group),
ADD (successful_login_group)
WITH (STATE=ON)
GO

修改审核规范

--跟审核对象一样,更改审核规范时必须将其禁用
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE =OFF)
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile
ADD (login_change_password_gourp),
DROP (successful_login_group)
ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE =ON)
GO

审核操作组

每个审核操作组对应一种操作,在SQLSERVER2008里一共有35个操作组,包括备份和还原操作,数据库所有权的更改,从服务器和数据库角色中添加或删除登录用户

添加审核操作组的只需在审核规范里使用ADD,下面语句添加了登录用户修改密码操作的操作组

ADD (login_change_password_gourp)

审核数据库级别事件

数据库审核规范存在于他们的数据库中,不能审核tempdb中的数据库操作

CREATE DATABASE AUDIT SPECIFICATION和ALTER DATABASE AUDIT SPECIFICATION

工作方式跟服务器审核规范一样

在SQLSERVER2008里一共有15个数据库级别的操作组
7个数据库级别的审核操作是:select ,insert,update,delete,execute,receive,references

相关脚本如下:

--创建审核对象
USE [master]
GO
CREATE SERVER AUDIT MyDBFileAudit TO FILE(FILEPATH=‘D:\sqldbaudits‘)
GO
ALTER  SERVER AUDIT  MyDBFileAudit WITH (STATE=ON)
GO
--创建数据库级别审核规范
USE [sss]
GO
CREATE DATABASE AUDIT SPECIFICATION CaptureDBActionToEventLog
FOR SERVER AUDIT MyDBFileAudit
ADD (database_object_change_group),
ADD (SELECT ,INSERT,UPDATE,DELETE ON schema::dbo   BY PUBLIC)
WITH (STATE =ON)

我们先在D盘创建sqldbaudits文件夹

第一个操作组对数据库中所有对象的DDL语句create,alter,drop等进行记录
第二个语句监视由任何public用户(也就是所有用户)对dbo架构的任何对象所做的DML操作

创建完毕之后可以在SSMS里看到相关的审核

数据库审核规范

服务器审核规范和审核对象



查看审核事件

被记录到文件系统的审核文件不是存储在可以利用记事本打开的文本文件中,而是采用二进制文件的方式

这里说一个,当磁盘空间不足的时候是可以直接删除这些SQLAUDIT文件

如果使用DDL触发器的方法:http://www.cnblogs.com/gaizai/p/3363220.html?ADUIN=1815357042&ADSESSION=1387155615&ADTAG=CLIENT.QQ.5275_.0&ADPUBNO=26274

一般都会在数据库里头创建一张表来保存审计数据,但是当表数据量达到很多的时候,DBA也需要去维护这张表

工作量又增加了,可能你会说,我需要审计的项目不多,所以审计的数据也不会太多,但对于某些大公司来说

他们要审计的数据是非常多的,有些需要归档,而有些不需要归档

对于不需要归档审计数据的情况,我比较喜欢这种方式,当磁盘容量不够的时候把最老的那个审计文件删除掉

我们有两种方法查看审核日志

方法一:对象资源管理器-》安全性-》审核-》选中某个审核对象-》右键-》查看审核日志

审核项目包括有:日期、时间戳记、服务器实例名称、操作ID、类类型、序列号、成功或失败、列权限、数据库主体ID、服务器主体名称、

服务器主体SID、被执行的(或尝试)的实际语句等等

方法二:使用新的表值函数sys.[fn_get_audit_file]()

此函数接受一个或多个审核文件的参数(使用通配符模式匹配)

并利用另外两个附加参数可以指定要处理的起始文件,以及开始读取审核的已知偏移位置

这两个参数都是可选的,但依然必须使用关键字default指定,此函数随后从文件中读取二进制数据,并将格式化这些审核项目

服务器级别审核

根据最近时间的那个sqlaudit文件,查询这个文件里面的信息

SELECT  [event_time] AS ‘触发审核的日期和时间‘ ,
        sequence_number AS ‘单个审核记录中的记录顺序‘ ,
        action_id AS ‘操作的 ID‘ ,
        succeeded AS ‘触发事件的操作是否成功‘ ,
        permission_bitmask AS ‘权限掩码‘ ,
        is_column_permission AS ‘是否为列级别权限‘ ,
        session_id AS ‘发生该事件的会话的 ID‘ ,
        server_principal_id AS ‘执行操作的登录上下文 ID‘ ,
        database_principal_id AS ‘执行操作的数据库用户上下文 ID‘ ,
        target_server_principal_id AS ‘执行 GRANT/DENY/REVOKE 操作的服务器主体‘ ,
        target_database_principal_id AS ‘执行 GRANT/DENY/REVOKE 操作的数据库主体‘ ,
        object_id AS ‘发生审核的实体的 ID(服务器对象,DB,数据库对象,架构对象)‘ ,
        class_type AS ‘可审核实体的类型‘ ,
        session_server_principal_name AS ‘会话的服务器主体‘ ,
        server_principal_name AS ‘当前登录名‘ ,
        server_principal_sid AS ‘当前登录名 SID‘ ,
        database_principal_name AS ‘当前用户‘ ,
        target_server_principal_name AS ‘操作的目标登录名‘ ,
        target_server_principal_sid AS ‘目标登录名的 SID‘ ,
        target_database_principal_name AS ‘操作的目标用户‘ ,
        server_instance_name AS ‘审核的服务器实例的名称‘ ,
        database_name AS ‘发生此操作的数据库上下文‘ ,
        schema_name AS ‘此操作的架构上下文‘ ,
        object_name AS ‘审核的实体的名称‘ ,
        statement AS ‘TSQL 语句(如果存在)‘ ,
        additional_information AS ‘单个事件的唯一信息,以 XML 的形式返回‘ ,
        file_name AS ‘记录来源的审核日志文件的路径和名称‘ ,
        audit_file_offset AS ‘包含审核记录的文件中的缓冲区偏移量‘ ,
        user_defined_event_id AS ‘作为 sp_audit_write 参数传递的用户定义事件 ID‘ ,
        user_defined_information AS ‘于记录用户想要通过使用 sp_audit_write 存储过程记录在审核日志中的任何附加信息‘
FROM    sys.[fn_get_audit_file](‘D:\sqlaudits\MyFileAudit_F0BCDC6F-0A89-459D-B345-9DDEB036CC39_0_130595725124220000.sqlaudit‘,
                                DEFAULT, DEFAULT)
WHERE   [event_time] BETWEEN ‘2014-11-04 11:02:00‘
                     AND     ‘2014-11-04 11:18:00‘ 

数据库级别审核

先执行下面脚本查询一些数据

USE [sss]
GO
SELECT * FROM [dbo].[nums]
SELECT  [event_time] AS ‘触发审核的日期和时间‘ ,
        sequence_number AS ‘单个审核记录中的记录顺序‘ ,
        action_id AS ‘操作的 ID‘ ,
        succeeded AS ‘触发事件的操作是否成功‘ ,
        permission_bitmask AS ‘权限掩码‘ ,
        is_column_permission AS ‘是否为列级别权限‘ ,
        session_id AS ‘发生该事件的会话的 ID‘ ,
        server_principal_id AS ‘执行操作的登录上下文 ID‘ ,
        database_principal_id AS ‘执行操作的数据库用户上下文 ID‘ ,
        target_server_principal_id AS ‘执行 GRANT/DENY/REVOKE 操作的服务器主体‘ ,
        target_database_principal_id AS ‘执行 GRANT/DENY/REVOKE 操作的数据库主体‘ ,
        object_id AS ‘发生审核的实体的 ID(服务器对象,DB,数据库对象,架构对象)‘ ,
        class_type AS ‘可审核实体的类型‘ ,
        session_server_principal_name AS ‘会话的服务器主体‘ ,
        server_principal_name AS ‘当前登录名‘ ,
        server_principal_sid AS ‘当前登录名 SID‘ ,
        database_principal_name AS ‘当前用户‘ ,
        target_server_principal_name AS ‘操作的目标登录名‘ ,
        target_server_principal_sid AS ‘目标登录名的 SID‘ ,
        target_database_principal_name AS ‘操作的目标用户‘ ,
        server_instance_name AS ‘审核的服务器实例的名称‘ ,
        database_name AS ‘发生此操作的数据库上下文‘ ,
        schema_name AS ‘此操作的架构上下文‘ ,
        object_name AS ‘审核的实体的名称‘ ,
        statement AS ‘TSQL 语句(如果存在)‘ ,
        additional_information AS ‘单个事件的唯一信息,以 XML 的形式返回‘ ,
        file_name AS ‘记录来源的审核日志文件的路径和名称‘ ,
        audit_file_offset AS ‘包含审核记录的文件中的缓冲区偏移量‘ ,
        user_defined_event_id AS ‘作为 sp_audit_write 参数传递的用户定义事件 ID‘ ,
        user_defined_information AS ‘于记录用户想要通过使用 sp_audit_write 存储过程记录在审核日志中的任何附加信息‘
FROM    sys.[fn_get_audit_file](‘D:\sqldbaudits\MyDBFileAudit_698BA060-CC40-4A3C-B19D-12B370712404_0_130595753193920000.sqlaudit‘,
                                DEFAULT, DEFAULT)

将审核日志保存到文件系统的好处就是可以使用TVP里通过where 和order by对审核数据进行筛选和排序

和审核相关的视图

--查询审核相关视图
SELECT * FROM sys.[server_file_audits]
SELECT * FROM sys.[server_audit_specifications]
SELECT * FROM sys.[server_audit_specification_details]
SELECT * FROM sys.[database_audit_specifications]
SELECT * FROM sys.[database_audit_specification_details]
SELECT * FROM sys.[dm_server_audit_status]
SELECT * FROM sys.[dm_audit_actions]
SELECT * FROM sys.[dm_audit_class_type_map]

删除相关对象

--删除顺序
--删除数据库审核规范
USE [sss]
GO
ALTER DATABASE AUDIT SPECIFICATION [CaptureDBActionToEventLog] WITH (STATE=OFF)
GO
DROP DATABASE AUDIT SPECIFICATION [CaptureDBActionToEventLog]
GO

--删除服务器审核规范
USE [master]
GO
ALTER SERVER  AUDIT SPECIFICATION [CaptureLoginsToFile] WITH (STATE=OFF)
GO
DROP SERVER AUDIT SPECIFICATION [CaptureLoginsToFile]
GO

--删除审核对象
ALTER SERVER AUDIT [MyFileAudit] WITH (STATE=OFF)
GO
ALTER SERVER AUDIT [MyAppAudit] WITH (STATE=OFF)
GO
ALTER SERVER AUDIT [MyEventLogAudit] WITH (STATE=OFF)
GO
DROP SERVER AUDIT [MyAppAudit]
GO
DROP SERVER AUDIT [MyFileAudit]
GO
DROP SERVER AUDIT [MyEventLogAudit]
GO


总结

本文概括介绍了SQLSERVER2008新增的审核功能,在SQLSERVER论坛里面“审核”这个话题是大家问得比较多的

希望通过这篇文章,能让大家认识新增的审核功能,在生产环境里面遇到问题也可以互相交流

而审核功能最大的好处是:你使用自建审计表来保存审计数据,如果聪明的黑客攻破你的数据库实例,他自然可以把你的那个审计表

drop掉,你同样查不出黑客的任何蛛丝马迹,而审核不同,他把审核数据放在SQLSERVER外面,除非你们公司的SA和DBA的安全意识

很弱,黑客有机会把磁盘文件删除掉,否则依然有可能查出黑客的蛛丝马迹进行预防!!

时间: 2024-10-07 02:09:06

SQLSERVER2008新增的审核/审计功能的相关文章

SQL Server 审计功能-记录所有的操作记录

SQL Server 审计-记录所有的操作记录 说到审计这个话题,相信作为一个企业管理员都知道,比如一般作为一个AD管理员的话,一般都会通过Policy开启审计功能,记录一些自定义的事务日志.对于SQL Server来说,审计也是一样的,SQL Server审计对象收集单个实例的服务器或数据库级的动作和行为监控组. 审计是在SQL Server实例级. 可以有多个审计/ SQL服务器实例.当你定义一个审计,你指定位置的输出结果. 这是审计目标. 审计是在创建的禁用状态,不会自动审计任何行动. 启

sqlserver2012的审计功能的相关理解

1.sqlserver2012可以做实例的审计,以及数据库的审计,基本包括了所有的操作.可以符合我们的要求. 2.审计功能需要实例级别的配置数据库级别的配置,实例上建立“审核”,数据库上建立“数据库审核规范”,两者同时启动才可以进行审计. 3.审计文件存储对象只有三个,分别为“文件”,“安全日志”,“应用程序日志”.一般我们存储到另外服务器的文件上以保证安全. 4.数据库审核规范只能在读写库上启用,不能再只读库上启用. 5.由于上一条的原因,为了解决在alwayson的只读副本上面的审计,我们需

Oracle 审计功能

一. 简介 审计(Audit)用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:存储在system表空间中的 SYS.AUD$表中,可通过视图dba_audit_trail查看)或操作系统审计记录中(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)..默认情况下审计是没有开启的. 审计记录包含有审计的操作.用户执行的操作.操作的日期和时间等信息. 不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instanc

数据库内置审计功能

作为一名dba,有时候,总会遇到数据库某个库,某个表,某个字段异常,或者数据被莫名的删除了,这个时候大家各种推断是不是bug了啊,是不是被黑了啊...这个时候一个审计功能就凸显出来了. mariadb数据库对审计插件(server_audit.so)支持比较良好,今天我们进行一个简单安装和测试 安装方法也很简单:INSTALL SONAME "server_audit.so" 这样就安装完成了,我们可以看看对应的参数变量 这些参数和变量都是可以动态设置的,具体参数说明,见官网:http

Office365 PowerShell打开邮箱审计功能

最近总公司要求Office365需要在所有的邮箱上面打开审计功能.这个功能没法通过图形界面操作,只能通过powershell脚本实现. 微软提供了一个官方的脚本,不过里面有个小bug https://technet.microsoft.com/en-us/library/dn879651.aspx#step2 我发现Office365的一个bug:我们有个别用户同时存在一个AD同步的账户,也有cloud创建的账户,而且两个账户都是用的同一个名字.Office365允许这么做,而且不会报错. 但是

mysql基于init-connect+binlog完成审计功能

mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用它来完成审计功能. init-connect参数说明: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_init_connect s

Oracle审计功能

一.审计分类: oracle中审计总体上可分为"标准审计"和"细粒度审计"后者也称为"基于政策的审计",在Oracle10G之后功能得到很大增强.其中标准审计可分为用户级审计和系统级审计.用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作.系统级审计只能由DBA设置,用以监测成功或失败的登录要求.监测GRANT和REVO

mysql 5.6 社区版上审计功能,不扯皮

官网 https://mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin/ 一.环境说明 MySQL 5.6.25 社区版 Mariadb 10.0.25 社区版 mysql 企业版有审计功能需要收费,社区版被阉割的不行不行了,和古时候的太监 没啥区别了,比较重要的功能特性都没有,不过也能凑合着用.可能说的有点过, 话糙理不糙,建议用不起企业版的可以考虑percona 和 mariadb,个人建议,仅供参考. 二.安装 1.下载mar

RDIFramework.NET V2.9版本号 WinFom部分新增与修正的功能

RDIFramework.NET  V2.9版本号 WinFom部分新增与修正的功能 转眼间RDIFramework.NET框架走了快6个年头了,随着一个版本号一个版本号的升级改造,如今已经越来越完美了.使用的客户也越来越多,经受住了大量实战项目的考验! RDIFramework.NET V2.9 WinForm版在2.8的基础上添加与修正了大量功能.包含:对多语言的支持.模块操作权限项设置.添加起始页(对经常使用功能列表在起始页展示).新增新的字典字典管理界面,提供对"树"类型的数据