Как определить, кто удалил файл на Windows Server с помощью политики аудита

Вы можете использовать аудит событий доступа к объектам файловой системы для определения конкретного пользователя, который создал, удалил или изменил определенный файл. В этой статье мы покажем вам, как настроить аудит событий для файлов в общей сетевой папке на Windows Server 2016. После настройки аудита вы сможете использовать информацию из средства просмотра событий для поиска пользователя, удалившего определенный файл на файловом сервере.

При удалении файла из общей сетевой папки он удаляется сразу, а не отправляется в корзину пользователя. Список файлов, открытых в общей папке, можно получить следующим образом.

Как включить политику аудита доступа к файлам и папкам в Windows?

По умолчанию аудит доступа к объектам файловой системы не включен на Windows Server. Вы можете включить и настроить параметры аудита с помощью групповой политики. Если вам нужно включить политики аудита на нескольких серверах или компьютерах, вы можете использовать GPO домена (настраивается с помощью параметра gpmc.msc консоли MMC). Если нужно настроить аудит только на одном сервере, можно использовать редактор локальной групповой политики.

  1. Откройте консоль редактора локальной групповой политики — gpedit.msc;
  2. Перейдите в раздел GPO с расширенными политиками аудита: Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Object Access;
  3. Откройте Файловая система аудита политику и укажите, что вы хотите регистрировать только события успешного доступа к объектам файловой системы (Настройте следующие события аудита -> Успех);
    Вы также можете включить аудит доступа к локальным объектам с помощью команды Аудит доступа к объектам политика в рамках Настройки Windows -> Настройки безопасности -> Локальная политика -> Политика аудита. Однако использование политики аудита файловой системы предпочтительнее, поскольку она отслеживает только события доступа к NTFS.

    включение политики аудита файловой системы на сервере windowsвключить политику аудита файловой системы на windows server

  4. Сохраните изменения и обновите параметры локальной групповой политики с помощью команды: gpupdate /force.

Настройка параметров аудита удаленных файлов в общей папке

Теперь вам нужно настроить аудит в свойствах общей сетевой папки, доступ к которой вы хотите отслеживать. Запустите File Explorer и откройте свойства папки. Перейдите к разделу Безопасность вкладка. Нажмите кнопку Дополнительно кнопка -> перейти к Аудит вкладка.

Если на экране появится сообщение «Вы должны быть администратором или иметь соответствующие привилегии для просмотра свойств аудита этого объекта» появится, нажмите кнопку Продолжить кнопка.

настройка параметров аудита в общей папке настройка параметров аудита в общей папке

Затем нажмите кнопку Добавить Кнопка, чтобы указать пользователя или группу, для которых вы хотите фиксировать события аудита. Если вы хотите отслеживать события доступа для всех пользователей, укажите Все группа.

Затем необходимо указать, какие разрешения, используемые для доступа к объекту, следует регистрировать. Чтобы сохранить в журнале событий только события удаления файлов, нажмите кнопку Показать дополнительные разрешения кнопка. В списке событий оставьте аудит только для событий удаления папок и файлов. Удалить и Удаление вложенных папок и файлов.

настройка аудита действий по удалению файлов в общей папке на Windows Server 2016folderнастройка аудита действий по удалению файлов из общей папки на Windows Server 2016folder

Совет. Помните, что политика аудита для объектов 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

Теперь, если пользователь удаляет любой файл или папку в общей сетевой папке, в журнале безопасности появляется событие File System -> Audit Success file delete с идентификатором Event ID 4663 из Аудит безопасности Microsoft Windows источник.

Откройте Средство просмотра событий консоль mmc (eventvwr.msc), разверните Журналы Windows -> Безопасность раздел. Включите фильтр журнала событий по идентификатору EventID 4663.

удаление файла событие id 4663 в журнале безопасности программы просмотра событий windows событие удаления файла id 4663 в журнале безопасности программы просмотра событий windows

Откройте любое из оставшихся событий в средстве просмотра событий. Как видите, в нем содержится информация об имени удаленного файла, учетной записи пользователя, удалившего файл, и имени процесса.

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

событие аудита удаления файла 4663 с именем пользователя в журнале безопасности событие аудита удаления файла 4663 с именем пользователя в журнале безопасности

После включения политики аудита доступа к файлам вы можете найти в журнале безопасности :

  • Кто удалил файл из общей сетевой папки и когда это произошло;
  • Какое приложение (процесс) использовалось для удаления файла;
  • Какова дата резервной копии, которую необходимо восстановить?

Как записать события удаления файлов в базу данных 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));

Примечание. Пример доступа к базе данных MySQL с помощью PowerShell был рассмотрен ранее в статье Querying MySQL or MariaDB Database with PowerShell.

Чтобы получить события с идентификатором EventID 4663 из журнала Security за текущий день, можно использовать следующий сценарий 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 - свойства события 4663Аудит безопасности Windows - событие 4663 свойства

Следующий сценарий PowerShell запишет полученные данные в базу данных MySQL на удаленном сервере (с IP-адресом 10.1.1.13):

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.

выберите событие удаления файла из базы данных mysqlвыберите событие удаления файла из базы данных mysql

Примечание. Поскольку была обнаружена проблема, связанная с тем, что символ «\» не записывается в базу данных, мы заменили его на «|«. Таким образом, если вам нужно отобразить полный путь к файлу, вы можете выполнить обратную замену при выборе из базы данных:

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

Сценарий записи информации из журнала событий в базу данных можно запускать в конце дня с помощью планировщика задач или прикреплять к EventID удаления файла (On Event), что более ресурсоемко. Это зависит от требований системы.

Совет. Убедитесь, что вы установили максимальный размер файла журнала событий безопасности, достаточный для регистрации всех событий за день. В противном случае вам придется выполнять задачу экспорта данных в базу данных чаще, чем раз в день или даже по триггеру. Как правило. Максимальный размер журнала на рабочих станциях должен быть не менее 64 МБ, и 262 МБ на файловых серверах Windows. Опцию перезаписи старых событий следует оставить включенной (Перезаписывать события по мере необходимости).

При необходимости вы можете создать простую веб-страницу на 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
}
}

сохранение истории событий удаления файлов в текстовый файл с помощью powershellсохранение истории событий удаления файлов в текстовый файл с помощью powershell

Итак, мы предложили идею и общую модель системы для аудита и хранения информации об удаленных файлах в общих сетевых папках. При необходимости ее можно легко модифицировать в соответствии с вашими требованиями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *