很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计
例如对失败的登录次数进行审计,某个数据库上的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.html5、更改跟踪:http://www.cnblogs.com/gaizai/p/3482579.html6、变更数据捕获(CDC):http://www.cnblogs.com/gaizai/p/3479731.html
我们一般都会把C2 审核跟踪和登录审核里面只限成功的登录,以防止SQL ERRORLOG日志泛滥,因为服务器是很久才重启一次的,如果不做修改很容易造成磁盘爆满
--禁用C2 审核跟踪和只限成功的登录EXEC sys.sp_configure N'c2 audit mode', N'0'GORECONFIGURE WITH OVERRIDEGOUSE [master]GOEXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software/Microsoft/MSSQLServer/MSSQLServer', N'AuditLevel', REG_DWord, 1GO
SQLSERVER2008新增的审核功能
在sqlserver2008新增了审核功能,可以对服务器级别和数据库级别的操作进行审核/审计,事实上,事件通知、更改跟踪、变更数据捕获(CDC)
都不是用来做审计的,只是某些人乱用这些功能,也正因为乱用这些功能导致踩坑
事件通知:性能跟踪
更改跟踪:用Sync Services来构建偶尔连接的系统
变更数据捕获(CDC):数据仓库的ETL 中的数据抽取(背后使用logreader)
而审核是SQLSERVER专门针对数据库安全的进行的审核,记住,他是专门的!
我们看一下审核的使用方法
审核对象
步骤一:创建审核对象,审核对象是跟保存路径关联的,所以如果你需要把审核操作日志保存到不同的路径就需要创建不同的审核对象
我们把审核操作日志保存在文件系统里,在创建之前我们还要在相关路径先创建好保存的文件夹,我们在D盘先创建sqlaudits文件夹,然后执行下面语句
--创建审核对象之前需要切换到master数据库USE [master]GOCREATE SERVER AUDIT MyFileAudit TO FILE(FILEPATH='D:/sqlaudits') --这里指定文件夹不能指定文件,生成文件都会保存在这个文件夹GO
实际上,我们在创建审核对象的同时可以指定审核选项,下面是相关脚本
把日志放在磁盘的好处是可以使用新增的TVF:sys.[fn_get_audit_file] 来过滤和排序审核数据,如果把审核数据保存在Windows 事件日志里查询起来非常麻烦
USE [master]GOCREATE 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 CaptureLoginsToFileFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GOCREATE SERVER AUDIT MyAppAudit TO application_LOGGOALTER SERVER AUDIT MyAppAudit WITH(STATE =ON)ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE=OFF)GOALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFileFOR SERVER AUDIT MyAppAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GO
我们创建一个服务器级别的审核规范CaptureLoginsToFile,然后再创建多一个审核对象MyAppAudit ,这个审核对象会把审核日志保存到Windows事件日志的应用程序日志里
我们禁用审核规范CaptureLoginsToFile,修改审核规范CaptureLoginsToFile属于审核对象MyAppAudit ,修改成功
而如果要把多个审核规范绑定到同一个审核对象则会报错
CREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileAFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GOCREATE SERVER AUDIT SPECIFICATION CaptureLoginsToFileBFOR SERVER AUDIT MyFileAuditADD (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 CaptureLoginsToFileFOR SERVER AUDIT MyFileAuditADD (failed_login_group),ADD (successful_login_group)WITH (STATE=ON)GO
修改审核规范
--跟审核对象一样,更改审核规范时必须将其禁用ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFile WITH (STATE =OFF)ALTER SERVER AUDIT SPECIFICATION CaptureLoginsToFileADD (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)
这里说一下服务器审核的内部实际上使用的是SQL2008新增的扩展事件里面的其中一个package:SecAudit package,当然他内部也是使用扩展事件来收集服务器信息
审核数据库级别事件
数据库审核规范存在于他们的数据库中,不能审核tempdb中的数据库操作
CREATE DATABASE AUDIT SPECIFICATION和ALTER DATABASE AUDIT SPECIFICATION
工作方式跟服务器审核规范一样
在SQLSERVER2008里一共有15个数据库级别的操作组7个数据库级别的审核操作是:select ,insert,update,delete,execute,receive,references
相关脚本如下:
--创建审核对象USE [master]GOCREATE SERVER AUDIT MyDBFileAudit TO FILE(FILEPATH='D:/sqldbaudits') GOALTER SERVER AUDIT MyDBFileAudit WITH (STATE=ON)GO--创建数据库级别审核规范USE [sss]GOCREATE DATABASE AUDIT SPECIFICATION CaptureDBActionToEventLogFOR SERVER AUDIT MyDBFileAuditADD (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=xxx2&ADsession=1387155615&ADTAG=CLIENT.QQ.5275_.0&ADPUBNO=26274
一般都会在数据库里头创建一张表来保存审计数据,但是当表数据量达到很多的时候,DBA也需要去维护这张表
工作量又增加了,可能你会说,我需要审计的项目不多,所以审计的数据也不会太多,但对于某些大公司来说
他们要审计的数据是非常多的,有些需要归档,而有些不需要归档
对于不需要归档审计数据的情况,我比较喜欢这种方式,当磁盘容量不够的时候把最老的那个审计文件删除掉
当然,你可以把整个sqlaudits文件夹或某个sqlaudit文件进行备份,放到备份磁盘上,然后删除一些较老的sqlaudit文件
备份了之后以后就有机会对之前的审计数据进行翻查,都比较灵活
我们有两种方法查看审核日志
方法一:对象资源管理器-》安全性-》审核-》选中某个审核对象-》右键-》查看审核日志
审核项目包括有:日期、时间戳记、服务器实例名称、操作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(服务器对象,D
新闻热点
疑难解答