Проста система за одит на премахване на файлове и папки за Windows Server

Всеки администратор на Windows е изправен пред ситуация, при която гневните потребители искат да знаят кой точно е изтрил мега важния файл с годишния отчет в споделена папка на файловия сървър. Тази информация може да бъде получена само ако проверите изтриването на файлове и папки на файловия сървър, в противен случай остава само да възстановите изтрития файл от архива (а вие вече ги правите?) И свийте рамене.

Но дори и при включен одит на изтриване на файлове, намирането на нещо в регистрационните файлове може да бъде проблематично. Първо, да намерите желания запис сред хиляди събития е доста трудно (няма разумни средства за търсене на събитието, което представлява интерес с гъвкаво филтриране в Windows), и второ, ако файлът е изтрит отдавна, това събитие може просто да липсва от дневника, тъй като беше презаписан от по-нови.

В тази статия ще покажем пример за организация на вградените инструменти на Windows. системите за одит изтриват файлове и папки в споделена мрежова директория (файлов сървър) със записи на събития в отделна база данни в MySQL.

Поради наличието на база данни с информация за всички изтрити файлове, администраторът ще може да даде отговори на въпроси:

  • Кой и кога е изтрил файла
  • От какво приложение е изтрит файлът?
  • В кой момент трябва да възстановите резервно копие

На първо място, на файловия сървър на Windows трябва да активирате одит на събития, което гарантира, че информацията за изтриването на файлове се записва в системния дневник. Вече разгледахме тази процедура в статията Одит на достъпа до файлове и папки в Windows.

Одитът може да бъде активиран чрез обща политика. Одит Достъп до обекти в секцията с политики Настройки за сигурност -> Локална политика -> Одитна политика

Или (за предпочитане) чрез разширени политики за одит в групата за общо ползване: Настройки за сигурност -> Разширена конфигурация на политиката за одит -> Достъп до обекти -> Одитна файлова система.

съвет. Провеждането на одит налага допълнителни разходи за системните ресурси. Използвайте с повишено внимание, особено за силно заредени файлови сървъри..

В свойствата на споделената мрежова папка (Защита -> Разширено -> Одитиране), премахването на файловете, в които искаме да наблюдаваме, за групата всички разрешаване на одит на изтриване на папки и файлове (Изтриване подпапки и файлове).

съвет. Одит изтриването на файлове в определена папка също може да бъде активирано чрез PowerShell:

$ Path = "D: \ публично"
$ AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule („Всички“, „Изтриване, Изтриване, Изтриване на подразделенияАndFiles“, „няма“, „няма“, „Успех“)
$ Acl = Get-Acl-Path $ Path
$ Acl.AddAuditRule ($ AuditChangesRules)
Set-Acl -Path $ Path -AclObject $ Acl

Когато файлът бъде успешно изтрит, събитието ID на събитието се появява в системния дневник за сигурност 4663 от източника Одитиране на сигурността на Microsoft Windows. Описанието на събитието съдържа информация за името на изтрития файл, акаунта, под който е извършено изтриването, и името на процеса.

И така, събитията, които ни интересуват, се записват в дневника, време е да създадем таблица на MySQL сървъра, състояща се от следните полета:

  • Име на сървъра
  • Име на отдалечен файл
  • Време за премахване
  • Името на потребителя, който е изтрил файла

MySQL заявката за създаване на такава таблица ще изглежда така:

СЪЗДАВАНЕ НА ТАБЛИЦА track_del (id INT НЕ NULL AUTO_INCREMENT, сървър VARCHAR (100), име на файл VARCHAR (255), dt_time DATETIME, потребителско име VARCHAR (100), PRIMARY KEY (ID));

забележка. Разгледахме подробно характеристиките на работата с MySQL база данни в статията Работа с MySQL база данни от PowerShell

Скрипт за събиране на информация от дневника на събитията. Филтрираме дневника на събитията с ID 4663 за текущия ден.

$ today = get-date -DisplayHint date -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Сигурност"; starttime = "$ днес"; id = 4663 | Foreach
$ event = [xml] $ _. ToXml ()
ако ($ събитие)

$ Time = Дата на получаване $ _. TimeCreate -UFormat "% Y-% m-% d% H:% M:% S"
$ File = $ event.Event.EventData.Data [6]. "# Текст"
$ User = $ event.Event.EventData.Data [1]. "# Текст"
$ Computer = $ event.Event.System.com Computer

Следният скрипт ще записва получените данни в MySQL база данни на отдалечен сървър:

Set-ExecutionPolicy RemoteSigned
Add-Type -Path 'C: \ Program Files (x86) \ MySQL \ MySQL Connector Net 6.9.8 \ Асембли \ v4.5 \ MySql.Data.dll'
$ Connection = [MySql.Data.MySqlClient.MySqlConnection] @ ConnectionString = 'сървър = 10.7.7.13; uid = posh; pwd = P @ ssw0rd; база данни = aduser'
$ Connection.Open ()
$ sql = Нов обект MySql.Data.MySqlClient.MySqlCommand
$ sql.Connection = $ връзка
$ today = get-date -DisplayHint date -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Сигурност"; starttime = "$ днес"; id = 4663 | Foreach
$ event = [xml] $ _. ToXml ()
ако ($ събитие)

$ Time = Дата на получаване $ _. TimeCreate -UFormat "% Y-% m-% d% H:% M:% S"
$ File = $ event.Event.EventData.Data [6]. "# Текст"

$ File = $ File.Replace ('\', '|')
$ User = $ event.Event.EventData.Data [1]. "# Текст"
$ Computer = $ event.Event.System.com Computer
$ sql.CommandText = "ВЪВЕДЕТЕ INTO track_del (сървър, име на файл, dt_time, потребителско име) VALUES ('$ Computer', '$ File', '$ Time', '$ User')"
$ sql.ExecuteNonQuery ()


$ Reader.Close ()
$ Connection.Close ()

Сега, за да разберете кой е изтрил файла "документ1 - Copy.DOC", просто изпълнете следния скрипт в конзолата PowerShell.

$ DeletedFile = "% document1 - Copy.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type -Path 'C: \ Program Files (x86) \ MySQL \ MySQL Connector Net 6.9.8 \ Асембли \ v4.5 \ MySql.Data.dll'
$ Connection = [MySql.Data.MySqlClient.MySqlConnection] @ ConnectionString = 'сървър = 10.7.7.13; uid = posh; pwd = P @ ssw0rd; база данни = aduser'
$ Connection.Open ()
$ MYSQLCommand = Нов обект MySql.Data.MySqlClient.MySqlCommand
$ MYSQLDataAdapter = Нов обект MySql.Data.MySqlClient.MySqlDataAdapter
$ MYSQLDataSet = Система за нов обект.Data.DataSet
$ MYSQLCommand.Connection = $ връзка
$ MYSQLCommand.CommandText = "ИЗБЕРЕТЕ потребителско име, dt_time от track_del, където име на файл LIKE" $ DeletedFile ""
$ MYSQLDataAdapter.SelectCommand = $ MYSQLCommand
$ NumberOfDataSets = $ MYSQLDataAdapter.Fill ($ MYSQLDataSet, "данни")
foreach ($ DataSet в $ MYSQLDataSet.tables [0])

write-host "Потребител:" $ DataSet.user_name "в:" $ DataSet.dt_time

$ Connection.Close ()

В конзолата получаваме потребителското име и времето за изтриване на файла.

забележка. защото бе открит проблем, символът chir "\" не се записва в базата данни, ние го заменихме с "|". Съответно, ако трябва да посочите пълния път към файла, при извличане от базата данни можете да извършите обратната подмяна на $ DataSet.file_name.Replace ('|', '\'). Благодаря на Алекс Корнев за коментара.!

Скриптът за изхвърляне на данни от дневника в базата данни може да се стартира веднъж в края на деня според планиращия или затвори на събитие за изтриване (On Event), което е по-интензивно за ресурси. Всичко зависи от системните изисквания..

съвет. Трябва да се уверите, че дневникът за сигурност е достатъчно голям, за да съдържа всички събития за деня. В противен случай ще трябва да изпълнявате задачата да изхвърляте данни от дневника в базата данни по-често от 1 път на ден или като цяло при спусък. За работна станция Максимален размер на лога обикновено се задават поне 64 Mb на север - 262 MB. Оставете опцията за презаписване включена (Презапишете събития според нуждите).

Ако желаете, по аналогия можете да реагирате на обикновена уеб страница на php, за да получите информация за виновниците за изтриването на файлове в по-удобна форма. Задачата се решава от всеки програмист на php за 1-2 часа.

Важен съвет. Ако дневникът съдържа информация за изтриването на файл от потребителя, не бързайте да го тълкувате недвусмислено като умишлено или дори злонамерено. Много програми (особено MS Office програми грешат), когато запазват данни, те първо създават временен файл, записват документа в него и изтриват старата версия на файла. В този случай има смисъл допълнително да напишете в базата данни името на процеса, извършил изтриването на файла (полето ProcessName на събитието) и да анализирате изтриването на файлове, като вземете предвид този факт. Или напълно радикално филтрирайте събития от такива процеси на боклук, например winword.exe, excel.exe и т.н..

Така че, ние предложихме идеята и определена обща рамка на системата за одит и съхранение на информация за изтрити файлове в мрежови топки, ако желаете, тя може лесно да бъде променена, за да отговаря на вашите нужди.