
Вы можете использовать аудит событий доступа к объектам файловой системы для определения конкретного пользователя, который создал, удалил или изменил определенный файл. В этой статье мы покажем вам, как настроить аудит событий для файлов в общей сетевой папке на Windows Server 2016. После настройки аудита вы сможете использовать информацию из средства просмотра событий для поиска пользователя, удалившего определенный файл на файловом сервере.
Как включить политику аудита доступа к файлам и папкам в Windows?
По умолчанию аудит доступа к объектам файловой системы не включен на Windows Server. Вы можете включить и настроить параметры аудита с помощью групповой политики. Если вам нужно включить политики аудита на нескольких серверах или компьютерах, вы можете использовать GPO домена (настраивается с помощью параметра gpmc.msc
консоли MMC). Если нужно настроить аудит только на одном сервере, можно использовать редактор локальной групповой политики.
- Откройте консоль редактора локальной групповой политики —
gpedit.msc
; - Перейдите в раздел GPO с расширенными политиками аудита: Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Object Access;
- Откройте Файловая система аудита политику и укажите, что вы хотите регистрировать только события успешного доступа к объектам файловой системы (Настройте следующие события аудита -> Успех);
Вы также можете включить аудит доступа к локальным объектам с помощью команды Аудит доступа к объектам политика в рамках Настройки Windows -> Настройки безопасности -> Локальная политика -> Политика аудита. Однако использование политики аудита файловой системы предпочтительнее, поскольку она отслеживает только события доступа к NTFS.
- Сохраните изменения и обновите параметры локальной групповой политики с помощью команды:
gpupdate /force
.
Настройка параметров аудита удаленных файлов в общей папке
Теперь вам нужно настроить аудит в свойствах общей сетевой папки, доступ к которой вы хотите отслеживать. Запустите File Explorer и откройте свойства папки. Перейдите к разделу Безопасность вкладка. Нажмите кнопку Дополнительно кнопка -> перейти к Аудит вкладка.
Если на экране появится сообщение «Вы должны быть администратором или иметь соответствующие привилегии для просмотра свойств аудита этого объекта» появится, нажмите кнопку Продолжить кнопка.
Затем нажмите кнопку Добавить Кнопка, чтобы указать пользователя или группу, для которых вы хотите фиксировать события аудита. Если вы хотите отслеживать события доступа для всех пользователей, укажите Все группа.
Затем необходимо указать, какие разрешения, используемые для доступа к объекту, следует регистрировать. Чтобы сохранить в журнале событий только события удаления файлов, нажмите кнопку Показать дополнительные разрешения кнопка. В списке событий оставьте аудит только для событий удаления папок и файлов. Удалить и Удаление вложенных папок и файлов.
$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.
Откройте любое из оставшихся событий в средстве просмотра событий. Как видите, в нем содержится информация об имени удаленного файла, учетной записи пользователя, удалившего файл, и имени процесса.
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
После включения политики аудита доступа к файлам вы можете найти в журнале безопасности :
- Кто удалил файл из общей сетевой папки и когда это произошло;
- Какое приложение (процесс) использовалось для удаления файла;
- Какова дата резервной копии, которую необходимо восстановить?
Как записать события удаления файлов в базу данных 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));
Чтобы получить события с идентификатором 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
}
}
Следующий сценарий 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.
\
» не записывается в базу данных, мы заменили его на «|
«. Таким образом, если вам нужно отобразить полный путь к файлу, вы можете выполнить обратную замену при выборе из базы данных:
$DataSet.file_name.Replace(‘|’,’\’).
Сценарий записи информации из журнала событий в базу данных можно запускать в конце дня с помощью планировщика задач или прикреплять к EventID удаления файла (On Event), что более ресурсоемко. Это зависит от требований системы.
При необходимости вы можете создать простую веб-страницу на PHP, чтобы получать информацию о пользователях, удаливших файлы, в более удобной форме.
Регистрация событий аудита удаления файлов в текстовый файл
Если вы не хотите использовать отдельный сервер базы данных, вы можете сохранить события аудита удаления файлов в обычный текстовый файл журнала. Используйте этот сценарий 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
}
}
Итак, мы предложили идею и общую модель системы для аудита и хранения информации об удаленных файлах в общих сетевых папках. При необходимости ее можно легко модифицировать в соответствии с вашими требованиями.