当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

作者:精品下载站 日期:2024-12-14 22:55:11 浏览:12 分类:玩电脑

如何使用审核策略检测谁删除了 Windows Server 上的文件?


您可以使用文件系统对象访问事件审核来识别创建、删除或修改特定文件的特定用户。在本文中,我们将向您展示如何为 Windows Server 2016 上的共享网络文件夹上的文件配置事件审核。配置审核后,您可以使用事件查看器中的信息来查找删除文件服务器上特定文件的用户。

当您从共享网络文件夹中删除文件时,该文件会立即删除,而不是发送到用户的回收站。可以通过以下方式获取共享文件夹上打开的文件列表。

如何在 Windows 上启用文件和文件夹访问审核策略?

默认情况下,Windows Server 上未启用文件系统对象访问审核。您可以使用组策略启用和配置审核设置。如果需要在多台服务器或多台计算机上启用审核策略,可以使用域 GPO(可使用

gpmc.msc

mmc 控制台)。如果您只想在一台服务器上配置审核,可以使用本地组策略编辑器。

  1. 打开本地组策略编辑器控制台 -

    gpedit.msc

    ;

  2. 转到包含高级审核策略的 GPO 部分:Windows 设置 -> 安全设置 -> 高级审核策略配置 -> 对象访问;

  3. 打开审核文件系统策略并指定您只想记录对文件系统对象的成功访问事件(配置以下审核事件 -> 成功);

    您还可以使用Windows 设置 -> 安全设置 -> 本地策略 -> 审核策略下的审核对象访问策略启用对本地对象访问的审核。但是,最好使用文件系统审核策略,因为它仅跟踪 NTFS 访问事件。

    [玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

  4. 使用以下命令保存更改并更新本地组策略设置:

    gpupdate /force

配置共享文件夹上的文件删除审核设置

现在,您需要在要跟踪访问的共享网络文件夹的属性中配置审核。运行文件资源管理器并打开文件夹属性。转到安全选项卡。单击高级按钮 -> 转到审核选项卡。

如果出现消息“您必须是管理员或已被授予适当的权限才能查看此对象的审核属性”,请单击继续按钮。

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

然后单击添加按钮指定要捕获其审核事件的用户或组。如果您想要跟踪所有用户的访问事件,请指定所有人组。

然后,您需要指定应记录用于访问对象的哪些权限。要仅在事件日志中保存文件删除事件,请单击显示高级权限按钮。在事件列表中,仅保留对文件夹和文件删除事件的审核 - 删除删除子文件夹和文件

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

提示。请记住,Windows 对象的审核策略需要额外的计算资源。小心使用它,始终尽量减少要记录的审核对象和事件的数量。

$Path = "E:\Public"
$AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone', 'Delete,DeleteSubdirectoriesAndFiles', 'none', 'none', 'Success')
$Acl = Get-Acl -Path $Path
$Acl.AddAuditRule($AuditChangesRules)
Set-Acl -Path $Path -AclObject $Acl

现在,如果用户删除共享网络文件夹中的任何文件或文件夹,安全日志中将显示文件系统 -> 审核成功文件删除事件,事件 ID 为 4663(来自 Microsoft Windows 安全审核源)。

打开事件查看器 mmc 控制台 (

eventvwr.msc

),展开Windows 日志 -> 安全部分。按 EventID 4663 启用事件日志过滤器。

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

在事件查看器中打开任何剩余事件。如您所见,它包含有关已删除文件的名称、删除该文件的用户的帐户以及进程名称的信息。

An attempt was made to access an object.
Subject:Security ID:                            CORP\jsmith
Account Name:                     jsmith
Account Domain:                  CORP
Logon ID:                               0x32B12627
Object:Object Server:                        Security
Object Type:                          File
Object Name:                        E:\Distr\Backup.rar
Handle ID:                              0x7bc4
Resource Attributes:            S:AI
Process Information:
Process ID:                             0x4
Process Name:
Access Request Information:
Accesses:                               DELETE
Access Mask:                         0x10000

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

启用文件访问审核策略后,您可以在安全日志中找到:

  • 谁从共享网络文件夹中删除了该文件以及何时发生;

  • 使用什么应用程序(进程)删除了该文件;

  • 要恢复的备份的日期是哪一天。

如何将文件删除事件写入SQL数据库(MySQL/MSSQL)?

然而,即使启用了对已删除文件的审核,在日志中查找某些内容也可能很麻烦。首先,在数千个事件中找到特定条目非常困难(在Windows中没有方便的工具来通过灵活的过滤器搜索事件)。其次,如果文件很久以前被删除,则日志中可能不存在该事件,因为它被新事件覆盖。

您可以将所有文件删除事件保存到 SQL 数据库。您可以使用 Microsoft SQL Server、Elasticsearch 或 MySQL/MariaDB 数据库来存储事件。

在此示例中,我们将向您展示如何将审核事件记录到 MySQL 上的单独数据库表中。我将使用以下表格格式:

  • 服务器名称;

  • 被删除文件的名称;

  • 日期和时间;

  • 删除该文件的用户的名称。

创建此表的 MySQL 查询如下所示:

CREATE TABLE deleted_items (id INT NOT NULL AUTO_INCREMENT, server VARCHAR(100), file_name VARCHAR(255), dt_time  DATETIME, user_name VARCHAR(100),  PRIMARY KEY (ID));

注意。使用 PowerShell 查询 MySQL 数据库一文前面介绍了如何从 PowerShell 访问 MySQL 数据库的示例。

如果您想使用 Microsoft SQL Server 数据库,请查看文章“如何从 PowerShell 运行 MSSQL Server 查询? ”

要从当天的安全日志中获取 EventID 4663 的事件,您可以使用以下 PowerShell 脚本:

$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
}
}

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

下一个 PowerShell 脚本会将您获取的数据写入远程服务器(IP 地址为 10.1.1.13)上的 MySQL 数据库:

Add-Type -Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$File = $File.Replace(‘\’,’|’)
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
$sql.CommandText = "INSERT INTO deleted_items (server,file_name,dt_time,user_name ) VALUES ('$Computer','$File','$Time','$User')"
$sql.ExecuteNonQuery()
}
}
$Reader.Close()
$Connection.Close()

将事件保存到外部数据库后,可以清除该事件日志。

现在,要找出谁删除了文件“AnnualReport.DOC”,只需在 PowerShell 控制台中运行以下脚本即可:

$DeletedFile = "%AnnualReport.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type -Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$MYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$MYSQLCommand.Connection=$Connection
$MYSQLCommand.CommandText="SELECT user_name,dt_time    from  deleted_items where file_name LIKE '$DeletedFile'"
$MYSQLDataAdapter.SelectCommand=$MYSQLCommand
$NumberOfDataSets=$MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
foreach($DataSet in $MYSQLDataSet.tables[0])
{
write-host "User:" $DataSet.user_name "at:" $DataSet.dt_time
}
$Connection.Close()

您现在可以在 PS 控制台中看到用户名和文件被删除的时间。

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

注意。由于发现了一个问题,符号“

\

” 没有写入数据库,我们已将其替换为“

|

”。因此如果必须显示文件的完整路径,可以在从数据库中选择时进行反向替换:

$DataSet.file_name.Replace(‘|’,’\’).

将事件日志中的信息写入数据库的脚本可以在一天结束时使用任务计划程序运行,或者附加到文件删除EventID(On Event),这会更消耗资源。这取决于系统的要求。

提示。确保将安全事件日志文件的最大大小设置为足以记录当天的所有事件。否则,您将不得不每天甚至在触发器上多次运行将数据导出到数据库的任务。通常,工作站上的最大日志大小必须至少为64 MB,Windows 文件服务器上的最大日志大小必须至少为262 MB。覆盖旧事件的选项应保持启用状态(根据需要覆盖事件)。

如果有必要,您可以创建一个简单的PHP网页,以更方便的形式获取删除文件的用户的信息。

重要提示。如果日志包含用户删除文件的条目,请不要急于将其解释为故意或恶意操作。许多程序(尤其是 MS Office 应用程序)在保存更改时会创建一个临时文件,然后删除旧版本的文件。在这种情况下,启用记录删除文件的进程名称(ProcessName fileld),您可以根据它解析文件删除事件。或者您可以过滤此类进程的事件,例如 winword.exe、excel.exe 等。

将文件删除审核事件记录到文本文件

如果您不想使用单独的数据库服务器,可以将文件删除审核事件保存到纯文本日志文件中。使用此 PowerShell 脚本将输出保存到文本文件:


$Outfile = "C:\Logs\Deleted-file-history-log.txt"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$strLog = $Computer + " " + $File + " " + $Time + " " +  $User
$strLog  | out-file $Outfile -append
}
}

[玩转系统] 如何使用审核策略检测谁删除了 Windows Server 上的文件?

因此,我们提出了一种想法和系统的一般模型来审核和存储共享网络文件夹中已删除文件的信息。如果需要,可以轻松对其进行修改以满足您的要求。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯