SQL Server 2012审计报告生成

4
尝试确定一个服务器输出的审计文件是否可以在该服务器上没有 CONTROL SERVER 访问权限的情况下被读取。MSDN文档表明这是可能的:即使数据库引擎正在写入文件,只要有权限,其他Windows用户就可以读取审计文件。数据库引擎不会采取排他锁来阻止读操作。同时,建议从一个单独的SQL Server实例(例如SQL Server Express的实例)生成审计报告,只有审计管理员或审计读者才能访问。通过使用单独的数据库引擎实例进行报告生成,可以帮助防止未经授权的用户获取访问审计记录的权限。简而言之,我可以这样做吗?
  • 配置生产数据库上的审计以输出到文件共享
  • 给审计读者读取文件共享的权限
  • 从另一个数据库中使用sys.fn_get_audit_file('fileshare*')来生成审计报告。
【澄清】 q的关键是,您能否使用sys.fn_get_audit_file从单独的DB访问文件,而无需在创建审核信息的DB上具有管理员访问权限。这样,我们可以拥有具有文件系统访问权限的审核读者,而不需要具有DB管理员访问权限的DBA。抱歉一开始没有表述清楚。
【回答澄清后的问题】 就您的答案而言,此查询是否可以由原始DB上的非DBA在不相关的SQL Mgmt Studio/DB中运行?
SELECT 
    event_time, action_id, session_id, object_id, class_type, 
    database_principal_name, database_name, object_name, statement
FROM 
    sys.fn_get_audit_file('\\Temp\Audit\*',NULL,NULL);

你尝试过上面列出的简短步骤了吗?你尝试过其他东西吗? - milivojeviCH
@mceda - 我至少要到一月中旬才能访问SQL 2012,我打算在此期间尝试使用SQL 2008,因为文档看起来很相似。 - Steve Townsend
我没有尝试过的部分是项目列表中的第三点——一个单独的数据库并不重要——访问文件的用户是您的SQL Server服务用户。 - milivojeviCH
@mceda - 再次感谢您 - 您已经做了很多来赢得悬赏,但用户职责的分离(实时数据的审计员不应该成为DBA)是至关重要的。 - Steve Townsend
无论我尝试了什么,包括上下文切换、读取文件的存储过程等,在同一个服务器上,我都不能赋予我的普通用户足够的权限。 - milivojeviCH
1个回答

2

确实,这有效。

USE [master]
GO

CREATE SERVER AUDIT [SQL2012-Audit-20121214-Demo]
TO FILE 
(   FILEPATH = N'\\Temp\Audit'
    ,MAXSIZE = 2 MB
    ,MAX_FILES = 32
    ,RESERVE_DISK_SPACE = OFF
) WITH (QUEUE_DELAY = 2000,ON_FAILURE = CONTINUE)
GO

ALTER SERVER AUDIT [SQL2012-Audit-20121214-Demo] WITH (STATE = ON);

USE [Performance]
GO

CREATE DATABASE AUDIT SPECIFICATION [SQL2012-DBAudit-20121214-Demo]
FOR SERVER AUDIT [SQL2012-Audit-20121214-Demo]
ADD (SELECT,INSERT,DELETE,UPDATE,EXECUTE ON DATABASE::[Performance] BY [dbo])
WITH (STATE = ON);
GO

在服务器审计和数据库审计已经启用的情况下,第一个审计文件立即被创建,由于Windows系统显示该文件正在使用中,因此无法删除该文件。
然而,从文件中选择操作一直可以正常进行。以下是可能被审计设置捕获的活动“工作负载”:
SELECT * INTO partition_stats_4 FROM Performance.sys.dm_db_partition_stats
SELECT * INTO partition_stats_3 FROM Performance.sys.dm_db_partition_stats
SELECT * INTO partition_stats_2 FROM Performance.sys.dm_db_partition_stats
SELECT * INTO partition_stats_1 FROM Performance.sys.dm_db_partition_stats
SELECT * INTO partition_stats   FROM Performance.sys.dm_db_partition_stats

DELETE FROM partition_stats
DELETE FROM partition_stats_1
DELETE FROM partition_stats_2
DELETE FROM partition_stats_3
DELETE FROM partition_stats_4

DROP TABLE partition_stats_4
DROP TABLE partition_stats_3
DROP TABLE partition_stats_2
DROP TABLE partition_stats_1
DROP TABLE partition_stats

以下是结果:

SELECT 
    event_time, action_id, session_id, object_id, class_type, 
    database_principal_name, database_name, object_name, statement
FROM 
    sys.fn_get_audit_file('\\Temp\Audit\*',NULL,NULL);

SQL Server 2012 - 数据库审计结果

顺便提一下,当涉及到服务器端跟踪文件时,情况完全相同。我们一直在运行跟踪,并且这些文件可以轻松地进行“查询”。

祝您审计愉快!


我没有一个可以测试活动审计文件只读访问的环境。然而,如果用户具有“CONTROL SERVER”权限,则从生产复制到不同环境的同一审计文件中选择记录在不同服务器上运行。 - milivojeviCH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接