Prosty system kontroli usuwania plików i folderów dla systemu Windows Server

Każdy administrator systemu Windows ma do czynienia z sytuacją, w której rozgniewani użytkownicy chcą wiedzieć, kto dokładnie usunął mega ważny plik z rocznym raportem w folderze udostępnionym na serwerze plików. Informacje te można uzyskać tylko wtedy, gdy skontrolujesz usunięcie plików i folderów na serwerze plików, w przeciwnym razie pozostanie tylko przywrócenie usuniętego pliku z kopii zapasowej (i już to robisz?) I wzruszenie ramionami.

Ale nawet po włączeniu kontroli usuwania plików znalezienie czegoś w dziennikach może być problematyczne. Po pierwsze, znalezienie pożądanego rekordu wśród tysięcy zdarzeń jest dość trudne (nie ma rozsądnych sposobów wyszukiwania interesującego zdarzenia z elastycznym filtrowaniem w systemie Windows), a po drugie, jeśli plik został usunięty dawno temu, to zdarzenie może być po prostu nieobecne w dzienniku, ponieważ został zastąpiony przez nowszy.

W tym artykule pokażemy przykład organizacji we wbudowanych narzędziach systemu Windows. systemy kontroli usuwają pliki i foldery z udostępnionego katalogu sieciowego (serwer plików) z rejestrowaniem zdarzeń w oddzielnej bazie danych w MySQL.

Ze względu na obecność bazy danych z informacjami o wszystkich usuniętych plikach administrator będzie mógł udzielić odpowiedzi na pytania:

  • Kto i kiedy usunął plik
  • Z jakiej aplikacji usunięto plik?
  • W którym momencie musisz przywrócić kopię zapasową

Przede wszystkim na serwerze plików Windows należy włączyć kontrolę zdarzeń, która zapewnia, że ​​informacje o usunięciu pliku są zapisywane w dzienniku systemu. Sprawdziliśmy już tę procedurę w artykule Kontrola dostępu do plików i folderów w systemie Windows.

Kontrolę można włączyć za pomocą wspólnej zasady. Audytu dostępu do obiektu w sekcji polityk Ustawienia zabezpieczeń -> Zasady lokalne -> Zasady audytu

Lub (najlepiej) poprzez zaawansowane zasady kontroli w obiekcie zasad grupy: Ustawienia zabezpieczeń -> Zaawansowana konfiguracja zasad inspekcji -> Dostęp do obiektów -> System plików inspekcji.

Wskazówka. Przeprowadzenie audytu nakłada dodatkowe koszty na zasoby systemowe. Używaj ostrożnie, szczególnie w przypadku mocno obciążonych serwerów plików..

We właściwościach udostępnionego folderu sieciowego (Bezpieczeństwo -> Zaawansowane -> Audyt) usunięcie plików, w których chcemy monitorować, dla grupy Wszyscy włączyć audyt usuwania folderów i plików (Usuń podfoldery i pliki).

Wskazówka. Usuwanie audytu plików w określonym folderze można również włączyć za pomocą programu PowerShell:

$ Path = "D: \ Public"
$ AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule („Wszyscy”, „Usuń, UsuńSubdirectoriesAndFiles”, „brak”, „brak”, „Sukces”)
$ Acl = Get-Acl -Path $ Path
$ Acl.AddAuditRule ($ AuditChangesRules)
Set-Acl -Path $ Path -AclObject $ Acl

Po pomyślnym usunięciu pliku zdarzenie Identyfikator zdarzenia pojawia się w dzienniku bezpieczeństwa systemu 4663 ze źródła Audyt bezpieczeństwa Microsoft Windows. Opis zdarzenia zawiera informacje o nazwie usuniętego pliku, koncie, na którym przeprowadzono usuwanie, oraz nazwie procesu.

Tak więc interesujące nas zdarzenia są zapisywane w dzienniku, czas stworzyć tabelę na serwerze MySQL składającą się z następujących pól:

  • Nazwa serwera
  • Nazwa zdalnego pliku
  • Czas usuwania
  • Nazwa użytkownika, który usunął plik

Zapytanie MySQL do utworzenia takiej tabeli będzie wyglądać następująco:

CREATE TABLE track_del (identyfikator INT NOT NULL AUTO_INCREMENT, serwer VARCHAR (100), nazwa pliku VARCHAR (255), dt_time DATETIME, nazwa użytkownika VARCHAR (100), PRIMARY KEY (ID));

Uwaga. Szczegółowo przeanalizowaliśmy funkcje pracy z bazą danych MySQL w artykule Praca z bazą danych MySQL z PowerShell

Skrypt do zbierania informacji z dziennika zdarzeń. Filtrujemy dziennik zdarzeń o numerze ID 4663 na bieżący dzień.

$ Today = get-date -DisplayHint date -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Bezpieczeństwo"; starttime = "$ dzisiaj"; 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

Poniższy skrypt zarejestruje otrzymane dane w bazie danych MySQL na zdalnym serwerze:

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.7.7.13; uid = posh; pwd = P @ ssw0rd; database = aduser'
$ Connection.Open ()
$ sql = Nowy obiekt MySql.Data.MySqlClient.MySqlCommand
$ sql.Connection = $ Connection
$ Today = get-date -DisplayHint date -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Bezpieczeństwo"; starttime = "$ dzisiaj"; 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 track_del (serwer, nazwa_pliku, dt_time, nazwa_użytkownika) WARTOŚCI („ $ Komputer ”,„ $ Plik ”,„ $ Czas ”,„ $ Użytkownik ”)”
$ sql.ExecuteNonQuery ()


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

Teraz, aby dowiedzieć się, kto usunął plik „dokument1 - Kopiuj.DOC”, wystarczy uruchomić następujący skrypt w konsoli PowerShell.

$ DeleteFile = "% document1 - Copy.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.7.7.13; uid = posh; pwd = P @ ssw0rd; database = aduser'
$ Connection.Open ()
$ MYSQLCommand = Nowy obiekt MySql.Data.MySqlClient.MySqlCommand
$ MYSQLDataAdapter = Nowy obiekt MySql.Data.MySqlClient.MySqlDataAdapter
$ MYSQLDataSet = Nowy obiekt System.Data.DataSet
$ MYSQLCommand.Connection = $ Connection
$ MYSQLCommand.CommandText = "SELECT nazwa_użytkownika, dt_time od ścieżki_del gdzie nazwa_pliku LIKE„ $ DeleteFile ””
$ MYSQLDataAdapter.SelectCommand = $ MYSQLCommand
$ NumberOfDataSets = $ MYSQLDataAdapter.Fill ($ MYSQLDataSet, „dane”)
foreach ($ DataSet w $ MYSQLDataSet.tables [0])

write-host „Użytkownik:„ $ DataSet.user_name ”o godzinie:„ $ DataSet.dt_time

$ Connection.Close ()

W konsoli otrzymujemy nazwę użytkownika i czas usuwania pliku.

Uwaga. Ponieważ wykryto problem, znak chir „\” nie jest zapisywany w bazie danych, zastąpiliśmy go „|”. Odpowiednio, jeśli musisz podać pełną ścieżkę do pliku, podczas pobierania z bazy danych, możesz wykonać odwrotną zamianę $ DataSet.nazwa_pliku.Replace ('|', '\'). Dzięki Alex Kornev za komentarz.!

Skrypt do zrzucania danych z dziennika do bazy danych można uruchomić raz na koniec dnia zgodnie z harmonogramem lub zawiesić zdarzenie usuwania (On Event), które wymaga więcej zasobów. Wszystko zależy od wymagań systemowych..

Wskazówka. Musisz upewnić się, że dziennik zabezpieczeń jest wystarczająco duży, aby pomieścić wszystkie zdarzenia dnia. W przeciwnym razie będziesz musiał uruchamiać zadanie zrzucania danych z dziennika do bazy danych częściej niż 1 raz dziennie lub ogólnie na zasadzie wyzwalacza. Do stacji roboczej Maksymalny rozmiar kłody zwykle ustawiony co najmniej 64 Mb na północy - 262 Mb Pozostaw opcję zastępowania na (W razie potrzeby zastępuj zdarzenia).

W razie potrzeby, analogicznie, możesz zareagować na prostą stronę internetową na php, aby uzyskać informacje o winowajcach usuwania plików w wygodniejszej formie. Zadanie jest rozwiązywane przez dowolnego programistę PHP w ciągu 1-2 godzin.

Ważna wskazówka. Jeśli dziennik zawiera informacje o usunięciu pliku przez użytkownika, nie spiesz się, aby jednoznacznie zinterpretować go jako celowy lub nawet złośliwy. Wiele programów (szczególnie programy MS Office grzeszą), zapisując dane, najpierw tworzą plik tymczasowy, zapisują dokument i usuwają starą wersję pliku. W takim przypadku warto dodatkowo zapisać w bazie danych nazwę procesu, który wykonał usunięcie pliku (pole ProcessName zdarzenia), i przeanalizować usunięcie plików, biorąc pod uwagę ten fakt. Lub całkowicie radykalnie odfiltruj zdarzenia z takich procesów śmieciowych, na przykład winword.exe, excel.exe itp..

Zaproponowaliśmy więc pomysł i pewną ogólną strukturę systemu audytu i przechowywania informacji o usuniętych plikach w kulkach sieciowych, w razie potrzeby można je łatwo zmodyfikować, aby dopasować do twoich potrzeb.