Tek tek analiz edilen tüm kullanıcı olay kayıtlarını (EventLog) yazdığımız Powershell script ile sabit genişlikli bir csv dosyaya aktarıyoruz. Bu kullanıcı işlemleri olay kayıt (Event ID) numaralarını bir tabloya dönüştürdük.

Bu script yukarıdaki tabloda bulunan kullanıcı işlemleri olay kayıtlarını (Vista sonrası için) kolay anlaşılabilir bir dosyaya aktarmaktadır. Yerel makineler ve DC'ler üzerinde kullanılabilir. Herhangi bir Log Yönetim yazılımının ve Siem ürünlerinin kullanılmadığı ortamlarda çok işe yarayabilecek bir scripttir. Arşivlemesi önerilir.
Scriptin ile Neler Elde Edilebilir:
Event ID 4720: Bir kullanıcı hesabı oluşturuldu.
- Yeni kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından oluşturuldu.
Event ID 4722: Bir kullanıcı hesabı etkin.
- Pasif kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından aktif edildi.
Event ID 4723: Bir girişim hesabınızın şifresini değiştirmek için yapılmıştır.
- Kullanıcı hesabı parolası ne zaman, nereden değiştirildi.
Event ID 4724: Bir girişim hesaplarına parola sıfırlama yapıldı.
- Kullanıcı hesabı parolası ne zaman, nereden, hangi hesap tarafından sıfırlandı.
Event ID 4725: Bir kullanıcı hesabı devre dışı bırakıldı.
- Kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından pasif edildi.
Event ID 4726: Bir kullanıcı hesabı silindi.
- Kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından silindi.
Event ID 4738: Bir kullanıcı hesabı değiştirildi.
- Kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından değiştirildi.
Event ID 4740: Bir kullanıcı hesabı kilitli.
- Kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından kilitlendi.
Event ID 4767: Bir kullanıcı hesabı kilitli değildi.
- Kilitli kullanıcı hesabı ne zaman, nereden, hangi hesap tarafından kilidi kaldırıldı.
Event ID 4624: Bir hesap başarıyla oturum açmış.
Kullanıcı ne zaman, nereden, ne şekilde oturum açtı:
- Interactive (2): Yerel makine üzerinde.
- Network (3): Ağ üzerinden.
- Batch (4): Script ile.
- Service (5): Servis tarafından.
- Unlock (7): Ekran kilidi.
- NetworkCleartext (8): Ağ üzerinden şifresiz.
- RunAs (9): Farkı çalıştır ile.
- RemoteInteractive (10): Uzaktan bağlantı ile (RDP)
- CachedInteractive (11): Etki alanına üye makinede parolası kayıtlı etki alanı kullanıcısı ile
Event ID 4625: Bir hesap oturum açamadı.
Kullanıcı ne zaman, nereden, ne şekilde oturum açma girişiminde bulundu:
- Interactive (2): Yerel makine üzerinde.
- Network (3): Ağ üzerinden.
- Batch (4): Script ile.
- Service (5): Servis tarafından.
- Unlock (7): Ekran kilidi.
- NetworkCleartext (8): Ağ üzerinden şifresiz.
- RunAs (9): Farkı çalıştır ile.
- RemoteInteractive (10): Uzaktan bağlantı ile (RDP)
- CachedInteractive (11): Etki alanına üye makinede parolası kayıtlı etki alanı kullanıcısı ile
Oturum açamamasının sebepleri (Status&SubStatus):
- (0xC0000064) KullaniciYok
- (0xC000006A) KullaniciVarParolaYanlis
- (0xC0000234) KullaniciKilitli
- (0xC0000072) KullaniciPasif
- (0xC000006F) ZamanKisitlamasi
- (0xC0000070) IstemciKisitlama
- (0xC0000193) HesapExpired
- (0xC0000071) ParolaExpired
- (0xC0000133) ParolaDegis
- (0xC0000224) DCileZamanFarkiCok
- (0xC0000225) ParolaDegistirDevamEt
- (0xc000015b) BuMakinedeOturumAcamaz
- (0xc000006d) KimlikPaketBozuk
- (0xc0000133) OturumAcmaHatasi
- (0xc0000192) NetlogonCalismiyor
Oturum açamama sebepleri Orjinal tablo:

SCRIPT:
User_Activity_Analysis.ps1
Script varsayılan olarak son 90 günü taramaktadır. Taramak istediğiniz zamanı isteğe göre değiştirebilirsiniz. Bunun için "...-After (Get-Date).AddDays(-90) # Son 90 gün" satırındaki -90 ibaresini değiştirebilirsiniz.
# =========================================================== # NAME: User_Activity_Analysis.ps1 # AUTHOR: Bekir Yalçın # DATE: 30/12/2012 # COMMENT: Kullanıcı aktiviteleri analizi (EventLog) # EventID: 4720,4738,4726,4767,4740,4722,4725,4624,4625,4724,4723 # VERSION: 1 # =========================================================== # Clear $LogFileName="User_Activity_Reports_" + (Get-Date –f "yyyyMMdd_HHmmss_").tostring() + (hostname).tostring() + ".csv" Write-Host ((0..48)|%{if (($_+1)%3 -eq 0){[char][int]("119119119046115105098101114098111103046111114103064117101107097101046116117098105116097107046103111118046116114"[($_-2)..$_] -join "")}}) -separator "" -ForegroundColor Blue $DosyaEkle = @()$EventList=Get-Eventlog security -InstanceId 4720,4738,4726,4767,4740,4722,4725, 4624,4625,4724,4723 -After (Get-Date).AddDays(-90) # Son 90 gün # 4624,4625,4724,4723 -After (Get-Date).AddHours(-1) # Son 1 saatFunction LogonTypeConvertName { param( $LogonType ) switch ($LogonType){ (2) {"Interactive"} (3) {"Network"} (4) {"Batch"} (5) {"Service"} (7) {"Unlock"} (8) {"NetworkCleartext"} (9) {"RunAs"} (10) {"RemoteInteractive"} (11) {"CachedInteractive"} default {"Unknown"} } }Function CodeConvertName { param( $Status ) switch ($Status){ ("0xC0000064") {"KullaniciYok"} ("0xC000006A") {"KullaniciVarParolaYanlis"} ("0xC0000234") {"KullaniciKilitli"} ("0xC0000072") {"KullaniciPasif"} ("0xC000006F") {"ZamanKisitlamasi"} ("0xC0000070") {"IstemciKisitlama"} ("0xC0000193") {"HesapExpired"} ("0xC0000071") {"ParolaExpired"} ("0xC0000133") {"ParolaDegis"} ("0xC0000224") {"DCileZamanFarkiCok"} ("0xC0000225") {"ParolaDegistirDevamEt"} ("0xc000015b") {"BuMakinedeOturumAcamaz"} ("0xc000006d") {"0xc000006d"} ("0xc0000133") {"OturumAcmaHatasi"} ("0xc0000192") {"NetlogonCalismiyor"} ("0xc000006e") {"0xc000006e"} ("0x0") {"0x0"} default {"Unknown"} } } Function EventID4625 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4625" EventDescription = "Logon Failed" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[5] TargetDomainName = $_.ReplacementStrings[6] TargetUserSid = $_.ReplacementStrings[4] SubjectUserSid = $_.ReplacementStrings[0] SubjectUserName = $_.ReplacementStrings[1] SubjectDomainName = $_.ReplacementStrings[2] SubjectLogonId = $_.ReplacementStrings[3] Source_WorkstationName = $_.ReplacementStrings[13] Source_IPAddress = $_.ReplacementStrings[19] Source_IpPort = $_.ReplacementStrings[20] Status = $_.ReplacementStrings[7] LogonType = $_.ReplacementStrings[10] SubStatus = $_.ReplacementStrings[9] ProcessID = $_.ReplacementStrings[17] ProcessName = $_.ReplacementStrings[18] LogonProcessName = $_.ReplacementStrings[11] } } RETURN $Event } Function EventID4624 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4624" EventDescription = "Logon" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[5] TargetDomainName = $_.ReplacementStrings[6] TargetUserSid = $_.ReplacementStrings[4] SubjectUserSid = $_.ReplacementStrings[0] SubjectUserName = $_.ReplacementStrings[1] SubjectDomainName = $_.ReplacementStrings[2] SubjectLogonId = $_.ReplacementStrings[3] Source_WorkstationName = $_.ReplacementStrings[11] Source_IPAddress = $_.ReplacementStrings[18] Source_IpPort = $_.ReplacementStrings[19] LogonType = $_.ReplacementStrings[8] ProcessID = $_.ReplacementStrings[16] ProcessName = $_.ReplacementStrings[17] LogonProcessName = $_.ReplacementStrings[9] } } RETURN $Event } Function EventID4720 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4720" EventDescription = "New User" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] Source_WorkstationName = $_.ReplacementStrings[15] } } RETURN $Event } Function EventID4738 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4738" EventDescription = "User Change" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[1] TargetDomainName = $_.ReplacementStrings[2] TargetUserSid = $_.ReplacementStrings[3] SubjectUserSid = $_.ReplacementStrings[4] SubjectUserName = $_.ReplacementStrings[5] SubjectDomainName = $_.ReplacementStrings[6] SubjectLogonId = $_.ReplacementStrings[7] Source_WorkstationName = $_.ReplacementStrings[16] } } RETURN $Event } Function EventID4725 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4725" EventDescription = "User Disable" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4724 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4724" EventDescription = "Pass Reset" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4723 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4723" EventDescription = "Pass Change" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4722 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4722" EventDescription = "User Enable" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4726 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4726" EventDescription = "User Delete" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4767 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4767" EventDescription = "User Lock" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Function EventID4740 { param( $Event )$Event=$Event | Select TimeGenerated,ReplacementStrings | % { New-Object PSObject -Property @{ EventID = "4740" EventDescription = "User Unlock" TimeGenerated = $_.TimeGenerated TargetUserName = $_.ReplacementStrings[0] TargetDomainName = $_.ReplacementStrings[1] TargetUserSid = $_.ReplacementStrings[2] SubjectUserSid = $_.ReplacementStrings[3] SubjectUserName = $_.ReplacementStrings[4] SubjectDomainName = $_.ReplacementStrings[5] SubjectLogonId = $_.ReplacementStrings[6] } } RETURN $Event } Foreach ($Event in $EventList) { switch ($Event.EventID) { (4720) { $DosyaEkle += @(EventID4720 $Event) } (4738) { $DosyaEkle += @(EventID4738 $Event) } (4726) { $DosyaEkle += @(EventID4726 $Event) } (4767) { $DosyaEkle += @(EventID4767 $Event) } (4740) { $DosyaEkle += @(EventID4740 $Event) } (4722) { $DosyaEkle += @(EventID4722 $Event) } (4725) { $DosyaEkle += @(EventID4725 $Event) } (4624) { $DosyaEkle += @(EventID4624 $Event) } (4625) { $DosyaEkle += @(EventID4625 $Event) } (4724) { $DosyaEkle += @(EventID4724 $Event) } (4723) { $DosyaEkle += @(EventID4723 $Event) } default { "Unknown" } } } $DosyaEkle | Format-Table TimeGenerated,EventDescription,EventID, SubjectDomainName,SubjectUserName,SubjectUserSid,TargetDomainName, TargetUserName,TargetUserSid,SubjectLogonId,Source_WorkstationName, Source_IPAddress,Source_IpPort, @{Label="LogonTypeName"; Expression={ LogonTypeConvertName $_.LogonType}}, LogonType,@{Label="StatusName"; Expression={ CodeConvertName $_.Status }}, Status,@{Label="SubStatusName"; Expression={ CodeConvertName $_.SubStatus }}, SubStatus,ProcessID,ProcessName,LogonProcessName -AutoSize | Out-File -Width 1200 -Append -FilePath $LogFileName -Encoding Unicode Notepad.exe $LogFileName |
Script çalıştırıldığında User_Activity_Reports_20130101_035126_PCAdi.csv formatında bir rapor dosyası oluşmaktadır. Dosya sabit genişlikli formattadır ve script çalıştırıldığında Notepad.exe ile otomatik olarak rapor dosyası açılmaktadır (Düzgün bir görünüm için Notepad.exe uygulamasında Sözcük kaydır ayarını devre dışı bırakın). Bu dosyayı Microsoft Excel vb. uygulamalar ile açabilir ve sabit genişlikli olarak otomatik sütunlara dönüştürebilirsiniz. Ayrıca kolonlara filtre ekleyerek istediğiniz gibi de inceleyebilirsiniz.
Log dosyası örnek ekran görüntüsü:

Örnek raporu incelemek için lütfen resme tıklayın.
NOT1: Scriptin bir sonraki versiyonuna çoklu makine tarama desteği eklenecektir.
NOT2: Scriptin çalışması log dosya boyutuna ve çalışan bilgisayar performansına göre 15-30 dakika kadar sürebilmektedir.
Download Script: http://siberblog.org/wp-content/uploads/2012/12/User_Activity_Analysis.rar
References: http://ultimatewindowssecurity.com/
Hiç yorum yok:
Yorum Gönder