Önder Online

Silinen dosyaları SQL Veritabanına (MySQL / MSSQL) Kayıt Altına Alın

Bu yazımda Serverda silinen dosyaların olay günlüklerinde nasıl denetlendiğini anlattım, şimdi ise bunu veritabında nasıl saklanacağını yazıya döküyorum.

Silinen dosyaların denetimi etkinleştirilse bile, günlüklerde bir şeyler bulmak zahmetli olabilir. İlk olarak, binlerce olay arasında belirli bir giriş bulmak oldukça zordur (Windows’ta esnek bir filtre ile bir olayı aramak için uygun bir araç yoktur). İkinci olarak, bir dosya uzun süre önce silinmişse, bu olay yeni olaylar tarafından üzerine yazıldığı için günlüklerde bulunmayabilir.

Tüm dosya silme olaylarını SQL veritabanına kaydedebilirsiniz. Etkinliklerinizi depolamak için Microsoft SQL Server, Elasticsearch veya MySQL / MariaDB veritabanlarını kullanabilirsiniz.

Bu örnekte, denetim olaylarını bir MySQL’deki ayrı bir veritabanı tablosuna nasıl kaydedeceğinizi göstereceğiz. Aşağıdaki tablo formatını kullanacağım:

Sunucu adı;
Silinen dosyanın adı;
Tarih ve saat;
Dosyayı silen kullanıcının adı.
Tablomuzu oluşturalım :

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));

Geçerli gün için Güvenlik günlüğünden EventID 4663 ile olayları almak için aşağıdaki PowerShell komut dosyasını kullanabilirsiniz:

$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
}
}

Bir sonraki PowerShell betiği, aldığınız verileri uzak bir sunucudaki MySQL veritabanına yazacaktır (IP adresi 10.1.1.13 ile):

Add-Type –Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.21\Assemblies\v4.5.2\MySql.Data.dll’
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString=’server=localhost;uid=root;pwd=;database=sys’}
$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()

Şimdi, ” AnnualReport.DOC ” dosyasını kimin sildiğini bulmak için, PowerShell konsolunda aşağıdaki betiği çalıştırmak yeterli:

 

Add-Type –Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.21\Assemblies\v4.5.2\MySql.Data.dll’
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString=’server=localhost;uid=root;pwd=;database=sys’}
$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()

Olay günlüğünden veritabanına bilgi yazma komut dosyası günün sonunda Görev Zamanlayıcı kullanılarak çalıştırılabilir veya daha fazla kaynak tüketen dosya silme Olay Kimliği’ne (Olayda) eklenebilir .

 

Gerekirse dosyaları silen kullanıcılar hakkında daha rahat bir şekilde bilgi almak için basit bir PHP web sayfası oluşturabilirsiniz.

Önemli ipucu . Günlük, dosyanın kullanıcı tarafından silindiğine dair bir girdi içeriyorsa, bunu kasıtlı veya kötü niyetli bir eylem olarak yorumlamak için acele etmeyin. Çoğu program (özellikle MS Office uygulamaları) değişiklikleri kaydederken geçici bir dosya oluşturur ve ardından dosyanın eski sürümünü siler. Bu durumda, dosyanın silindiği işlem adının (İşlemAdı dosyası) günlüğe kaydedilmesini etkinleştirin ve buna göre dosya silme olaylarını ayrıştırabilirsiniz. Veya olayları winword.exe, excel.exe gibi işlemlerden filtreleyebilirsiniz.

Günlük Dosyası Denetim Olaylarını Bir Metin Dosyasına Verme

Ayrı bir veritabanı sunucusu kullanmak istemiyorsanız, dosya silme denetim olaylarını bir düz metin günlük dosyasına kaydedebilirsiniz. Çıktınızı bir metin dosyasına kaydetmek için bu PowerShell betiğini kullanın:

$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
}
}