我目前正在一个需要我们在企业范围内启用SQL Server Audit的环境中工作。我们生成.sqlaudit
文件,因为我们有保留和访问指南,我发现我们需要编译有关生成的文件的趋势信息,例如每小时创建的数量、审计信息的总量等。目前,我只知道提供审计定义信息的 DMV/DMF 的数量(可以在此处找到列表),但与 SQL Server 审计过程的输出无关。
我目前正在运行 PowerShell 脚本来从.sqlaudit
文件的元数据中收集这些信息,但如果可能的话,我不希望依赖外部进程。我研究了扩展存储过程,例如xp_dirtree
,但它只返回文件数而不是大小信息,所以它没有提供我需要的完整图片。 xp_cmdshell
,虽然可行,但出于明显的安全原因是不允许的,因为NIST 合规性明确禁止其使用。数据库引擎中是否有任何方法(我问的是我可以用 TSQL 解决的问题)我可以获得这些信息,例如我还没有遇到的扩展事件或隐藏的 DMV?我觉得我已经进行了一些广泛的挖掘,但如果我错过了什么,我从不感到惊讶。
如果其他人感兴趣,我不妨张贴我的绝妙方法。基本上,以下是一个两步过程。首先是在您选择的数据库中创建一个表,该表将保存您希望收集的审核文件元数据的日志:
我通过只跟踪名称、创建日期和大小(压缩和未压缩)来保持简单。为什么要压缩?好吧,我们环境中的系统每天会产生数 TB 的审计活动,因此我们必须在
.sqlaudit
文件生成后立即对其进行压缩,否则我们会遇到Tribble情况。因此,下面的 PowerShell 例程.zip
直接从文件中提取一些元数据。此过程的第二部分是使用触发以下内容的 PowerShell 步骤设置 SQLAgent 作业:
该例程所做的是识别写入审计文件的路径以及跟踪的最后一个审计文件的时间戳。使用它,它会
Get-ChildItem
针对已识别的目录运行查找所有*.zip
文件,这些文件仅返回比我们之前识别的最后一个文件更旧的文件。假设:
WHERE sfa.on_failure = 1
).zip
文件。如果您不压缩 .sqlaudit 文件,您将遇到这样一种情况,即最后一个.sqlaudit
文件上的元数据可能会在下一次运行时发生变化,因为数据库引擎仍在写入它。在这种情况下,我建议忽略数组中返回的最后一个文件,这样可以避免任何重复/不一致的数据。最后,这完全特定于我的环境,但它正是我所需要的。如果您有建议、更新等,请发布另一个答案,因为更多的想法总是受到赞赏。