Vsak skrbnik sistema Windows se srečuje s situacijo, ko jezni uporabniki želijo vedeti, kdo je natančno izbrisal mega pomembno datoteko z letnim poročilom v deljeni mapi v datotečnem strežniku. Te podatke lahko dobite le, če preverite izbris datotek in map na datotečnem strežniku, sicer ostane samo, da izbrišete datoteko obnovite iz varnostne kopije (in jo že storite?) In skomignete.
Toda tudi če je vklopljena revizija brisanja datotek, je iskanje nekaj v dnevnikih lahko problematično. Prvič, najti želeni zapis med tisoči dogodkov je precej težko (ni prostih načinov iskanja dogodka, ki ga zanima, s prilagodljivim filtriranjem v sistemu Windows), in drugič, če je bila datoteka že zdavnaj izbrisana, lahko ta dogodek preprosto ni v dnevniku, ker je prepisala novejša.
V tem članku bomo prikazali primer organizacije vgrajenih orodij sistema Windows. revizijski sistemi izbrišejo datoteke in mape v omrežnem imeniku v skupni rabi (datotečni strežnik) s snemanjem dogodkov v ločeni bazi podatkov v MySQL.
Zaradi prisotnosti baze podatkov z informacijami o vseh izbrisanih datotekah bo skrbnik lahko dal odgovore na vprašanja:
- Kdo in kdaj je izbrisal datoteko
- Iz katere aplikacije je datoteka izbrisana?
- V katerem trenutku morate obnoviti varnostno kopijo
Najprej morate na datotečnem strežniku Windows omogočiti revizijo dogodkov, kar zagotavlja, da se podatki o brisanju datotek beležijo v sistemski dnevnik. Ta postopek smo že preučili v članku Revizija dostopa do datotek in map v sistemu Windows.
Revizijo je mogoče omogočiti s skupno politiko. Revizija dostopa do predmetov v razdelku o politikah Varnostne nastavitve -> Lokalna politika -> Revizijska politika
Ali (po možnosti) s pomočjo naprednih revizijskih politik v GPO: Varnostne nastavitve -> Napredna konfiguracija pravilnika revizije -> Dostop do objekta -> Sistem revizijskih datotek.
Namig. Izvajanje revizije povzroča dodatne stroške sistemskim virom. Uporabljajte previdno, zlasti pri zelo naloženih datotečnih strežnikih..V lastnostih omrežne mape v skupni rabi (Varnost -> Napredno -> Revizija) odstranitev datotek, v katerih želimo spremljati, za skupino Vsi omogočiti revizijo brisanja map in datotek (Izbriši podmape in datoteke).
Namig. Preverjanje brisanja datotek v določeni mapi je mogoče omogočiti tudi prek PowerShell:
$ Path = "D: \ javno"
$ AuditChangesRules = Nov objektni sistem.Security.AccessControl.FileSystemAuditRule ("Vsi", "Izbriši, Zbriši, Izbriši poddirektorije in Fifile", "Nič", "Brez", "Uspeh")
$ Acl = Get-Acl-Path $ Pot
$ Acl.AddAuditRule ($ AuditChangesRules)
Set-Acl -Path $ Path -AclObject $ Acl
Ko je datoteka uspešno izbrisana, se dogodek ID-ja dogodka prikaže v varnostnem dnevniku sistema 4663 od vira Revizija varnosti sistema Windows. Opis dogodka vsebuje podatke o imenu izbrisane datoteke, računu, pod katerim je bilo izbris izveden, in imenu postopka.
Torej, dogodki, ki nas zanimajo, se zapišejo v dnevnik, čas je, da na MySQL strežniku izdelamo tabelo, ki jo sestavljajo naslednja polja:
- Ime strežnika
- Ime oddaljene datoteke
- Čas odstranitve
- Ime uporabnika, ki je datoteko izbrisal
Poizvedba MySQL za ustvarjanje takšne tabele bo videti tako:
CREATE TABLE track_del (id INT NOT NULL AUTO_INCREMENT, strežnik VARCHAR (100), ime datoteke VARCHAR (255), dt_time DATETIME, uporabniško ime VARCHAR (100), PRIMARY KEY (ID));
Skript za zbiranje informacij iz dnevnika dogodkov. Za trenutni dan filtriramo dnevnik dogodkov z ID 4663.
$ today = datum-get -DisplayHint datum -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Varnost"; starttime = "$ danes"; id = 4663 | Foreach
$ event = [xml] $ _. ToXml ()
če ($ dogodek)
$ Time = Datum pridobitve $ _. TimeCreate -UFormat "% Y-% m-% d% H:% M:% S"
$ File = $ event.Event.EventData.Data [6]. "# Besedilo"
$ User = $ event.Event.EventData.Data [1]. "# Besedilo"
$ Computer = računalnik $ event.Event.System.com
Naslednji skript bo prejel prejete podatke v bazo podatkov MySQL na oddaljeni strežnik:
Set-ExecutionPolicy RemoteSigned
Add-Type-Path 'C: \ Program Files (x86) \ MySQL \ MySQL Connector Net 6.9.8 \ Sklopi \ v4.5 \ MySql.Data.dll'
$ Connection = [MySql.Data.MySqlClient.MySqlConnection] @ ConnectionString = 'strežnik = 10.7.7.13; uid = posh; pwd = P @ ssw0rd; baza podatkov = aduser'
$ Connection.Open ()
$ sql = Nov objekt MySql.Data.MySqlClient.MySqlCommand
$ sql.Connection = $ povezava
$ today = datum-get -DisplayHint datum -UFormat% Y-% m-% d
Get-WinEvent -FilterHashTable @ LogName = "Varnost"; starttime = "$ danes"; id = 4663 | Foreach
$ event = [xml] $ _. ToXml ()
če ($ dogodek)
$ Time = Datum pridobitve $ _. TimeCreate -UFormat "% Y-% m-% d% H:% M:% S"
$ File = $ event.Event.EventData.Data [6]. "# Besedilo"
$ File = $ File.Replace ('\', '|')
$ User = $ event.Event.EventData.Data [1]. "# Besedilo"
$ Computer = računalnik $ event.Event.System.com
$ sql.CommandText = "VNOSI INTO track_del (strežnik, ime datoteke, dt_time, uporabniško ime) VALUES ('$ Computer', '$ File', '$ Time', '$ User')"
$ sql.ExecuteNonQuery ()
$ Reader.Zaprite ()
$ Connection.Zaprite ()
Zdaj, da ugotovimo, kdo je izbrisal datoteko "dokument1 - Kopija.DOC", dovolj je, da v konzoli PowerShell zaženete naslednji skript.
$ DeletedFile = "% document1 - Kopiraj.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type-Path 'C: \ Program Files (x86) \ MySQL \ MySQL Connector Net 6.9.8 \ Sklopi \ v4.5 \ MySql.Data.dll'
$ Connection = [MySql.Data.MySqlClient.MySqlConnection] @ ConnectionString = 'strežnik = 10.7.7.13; uid = posh; pwd = P @ ssw0rd; baza podatkov = aduser'
$ Connection.Open ()
$ MYSQLCommand = Nov objekt MySql.Data.MySqlClient.MySqlCommand
$ MYSQLDataAdapter = Nov objekt mojSql.Data.MySqlClient.MySqlDataAdapter
$ MYSQLDataSet = Nov objektni sistem.Data.DataSet
$ MYSQLCommand.Connection = $ povezava
$ MYSQLCommand.CommandText = "SELECT uporabniško ime, dt_time iz track_del, kjer ime datoteke LIKE" $ DeletedFile ""
$ MYSQLDataAdapter.SelectCommand = $ MYSQLCommand
$ NumberOfDataSets = $ MYSQLDataAdapter.Fill ($ MYSQLDataSet, "podatki")
foreach ($ DataSet v $ MYSQLDataSet.tables [0])
piši gostitelj "Uporabnik:" $ DataSet.user_name "pri:" $ DataSet.dt_time
$ Connection.Zaprite ()
V konzoli dobimo uporabniško ime in čas brisanja datoteke.
Opomba. Ker odkrita je težava, znak chir "\" ni zapisan v bazo podatkov, zamenjali smo ga z "|". Če želite določiti celotno pot do datoteke, lahko ob pridobivanju iz baze podatkov izvedete obratno zamenjavo $ DataSet.file_name.Replace ('|', '\'). Hvala Alexu Kornevu za komentar.!Skript za odmetavanje podatkov iz dnevnika v bazo podatkov lahko zaženete enkrat na koncu dneva v skladu z razporejevalnikom ali obesite na izbrisni dogodek (On Event), ki je bolj intenziven. Vse je odvisno od sistemskih zahtev..
Namig. Poskrbeti morate, da bo varnostni dnevnik dovolj velik, da vsebuje vse dogodke v dnevu. V nasprotnem primeru boste morali nalogo odlaganja podatkov iz dnevnika v bazo podatkov izvajati pogosteje kot 1-krat na dan ali na splošno ob sprožitvi. Za delovno postajo Največja velikost dnevnika ponavadi nastavite vsaj 64 Mb na severu - 262 Mb Možnost prepisa pustite vklopljeno (Po potrebi napišite dogodke).Po želji lahko po analogiji reagirate s preprosto spletno stranjo na php in tako pridobite informacije o krivcih za brisanje datotek v bolj priročni obliki. Nalogo reši katerikoli php programer v 1-2 urah.
Pomemben nasvet. Če dnevnik vsebuje podatke o izbrisu datoteke s strani uporabnika, ne hitite, da jo nedvoumno razlagate kot namerno ali celo zlonamerno. Številni programi (zlasti programi MS Office grešijo) pri shranjevanju podatkov najprej ustvarijo začasno datoteko, jo shranijo v dokument in izbrišejo staro različico datoteke. V tem primeru je smiselno dodati dodaten zapis v bazi podatkov imenu procesa, s katerim je bila datoteka izbrisana (polje ProcessName dogodka), in analizirati brisanje datotek ob upoštevanju tega dejstva. Ali pa popolnoma radikalno filtrirajte dogodke iz takih procesov smeti, na primer winword.exe, excel.exe itd..Torej, predlagali smo idejo in določen splošni okvir revizijskega sistema ter shranjevanje informacij o izbrisanih datotekah v mrežnih kroglicah, po želji pa ga lahko enostavno spremenite tako, da ustreza vašim potrebam.