跟踪 Windows 服务器上的文件权限更改

跟踪 Windows 服务器上的文件权限更改

某些东西或某些人偶尔会更改我的 Windows Server 2003 域控制器上的文件的文件权限。

我想跟踪这些更改。最初我以为可以通过默认域控制器策略进行审核来实现这一点,但是虽然有文件访问审核,但我似乎找不到任何跟踪权限更改的方法。

我想知道一组文件和目录的权限是否发生变化,无论是人为更改、应用程序/服务更改还是磁盘错误更改。我想知道更改了什么、何时更改,以及可能更改的原因。

这可能吗?

答案1

权限更改的内置审计通过“审计对象访问”进行处理。如果您查看可以在文件系统对象上配置的审计类型,您会发现“更改权限”是可审计项目之一。

不过,您会发现“审计对象访问”生成的日志数据非常冗长且难以解析。实际的权限更改(“WRITE_DAC”事件 - DAC 表示“自主访问控制”)将仅引用句柄 ID,因此您必须从 WRITE_DAC 反向解析才能找到句柄打开事件。该事件将告诉您 WRITE_DAC 正在修改的对象的名称。相当令人厌烦...

我有一个客户探索使用CPTRAX Windows 文件系统审计跟踪类似情况下的实用性。我不相信他们真的实施过它,但作为他们探索的一部分,我查看了文档并发现它至少看起来是“合理的”。我无法给出任何形式的个人推荐,但它看起来会像制造商声称的那样。

编辑:

今晚我有几分钟时间,所以我写了一个疯狂而痛苦的 CMD 脚本来跟踪权限更改。解析事件日志很痛苦(而且真的需要状态机才能正确完成),所以这是次优的尝试。

该脚本需要传递一个文件的文件名来跟踪其权限,以及一个文件的路径和“基本”文件名来存储观察到的权限。让我们假设一组虚假的参数:perm-track.cmd "C:\Program Files\Some Application\File To Track.exe" "C:\Permission Tracker\File to Track.exe"

脚本第一次运行时(例如,2010 年 7 月 18 日 12:51:30),在“C:\Program Files\Some Application\File To Track.exe”上设置的权限将存储在文件“C:\Permission Tracker\File to Track.exe.20100718_125130.permissions.txt”中。

下次使用相同参数运行脚本时,将比较最近创建的“C:\Permission Tracker\File to Track.exe.*.permissions.txt”文件中存储的权限与“C:\Program Files\Some Application\File To Track.exe”上的当前权限。如果有变化,新的权限将存储在“C:\Permission Tracker”中适当命名的“File to Track.exe.ISODATE.permissions.txt”文件中。

用这个来发送电子邮件相当简单。将其作为计划任务或循环运行也相当简单。

这绝对是快速而粗糙的,并且可能有错误,但是这个脚本可能会满足您的需要。

@echo off

if "%~1"=="" goto syntax
if not exist "%1" goto syntax

if "%~2"=="" goto syntax

rem Get an ISO date (working around shell silliness re: hours earlier than 10:00)
SET YEAR=%DATE:~10,4%
SET MONTH=%DATE:~4,2%
SET DAY=%DATE:~7,2%
SET /A HOUR=%TIME:~0,2%
SET HOUR=0%HOUR%
SET HOUR=%HOUR:~-2%
SET MINUTE=%TIME:~3,2%
SET SECOND=%TIME:~6,2%
SET ISODATE=%YEAR%%MONTH%%DAY%_%HOUR%%MINUTE%%SECOND%

SET TEMPFILE="%TEMP%\%RANDOM%.TXT"

rem Save current permissions into a temporary file
cacls %1 >%TEMPFILE%

rem Get filename of last set of permissions reported
set LASTFILE=
for /f "usebackq delims=" %%f in (`dir /od /b /s "%~2*.permissions.txt"`) do SET LASTFILE=%%f

rem Was there no last file? If so, put current temp file in place
if "%LASTFILE%"=="" (
  move %TEMPFILE% "%~2.%ISODATE%.permissions.txt"
) else (
  rem Compare current permission to last permission-- if it's different, annotate current permission
  fc %TEMPFILE% "%LASTFILE%"
  if errorlevel 1 move %TEMPFILE% "%~2.%ISODATE%.permissions.txt"
)

goto end

:syntax
echo Really, really poor man's permission change tracker.
echo.
echo Call with path of file to monitor on command-line as first argument,
echo path and base filename to store "report" files of permission changes
echo as the second argument.
echo.
echo example:
echo.
echo   perm-track.cmd "C:\Program Files\Some Application\File To Track.exe" "C:\Permission Tracker\File to Track"
echo.

:end

答案2

用一个基于主机的IDS,有时也称为文件系统 IDS。我使用过助手之前在 Windows 上已经成功编译。可以使用 cygwin 进行编译。

AIDE 的替代品是 OSSEC,它似乎有一个Windows 端口

答案3

Varonis DatAdvantage Windows 版是解决此问题的绝佳方法。它监控所有文件系统事件(创建、打开、删除、移动、修改、权限更改)并构建可搜索的审计跟踪。您可以根据触发条件设置定期报告或实时警报,例如 DC 上的权限更改或某人被提升为域管理员时。

也许最好的部分是 DatAdvantage 不需要本机审计(这可能很慢而且很费力)并且永远不会写入您监控的服务器上的磁盘,因此它的开销极低。

(披露:我在 Varonis 工作,但如果我认为不合适,就不会发布此内容。)

相关内容