Bir Windows sunucusunda beklenmedik bir gece yarısı girişi, yetkisiz bir servis kurulumu ya da toplu hesap kilitleme olayı… Bunların hepsini ancak doğru şekilde yapılandırılmış bir Event Log izleme sistemiyle yakalayabilirsiniz. Windows Event Log, aslında çoğu sysadmin’in göz ardı ettiği ama iyi kullanıldığında inanılmaz derecede güçlü bir güvenlik aracıdır. Bu yazıda, Windows Event Log’u gerçek anlamda bir güvenlik sensörüne dönüştürmek için bilmeniz gereken her şeyi ele alacağız.
Windows Event Log Temelleri ve Güvenlik Kanalları
Windows Event Log sistemi birçok farklı kanaldan oluşur. Güvenlik açısından asıl ilgilenmeniz gereken kanal Security kanalıdır. Ancak bununla birlikte System ve Application kanalları da güvenlik olaylarını tespit etmede yardımcı olabilir.
Security kanalında olaylar üç temel kategoriye ayrılır:
- Success Audit: Başarılı güvenlik olayları (örneğin başarılı oturum açma)
- Failure Audit: Başarısız güvenlik denemeleri (örneğin yanlış parola girişi)
- Information: Genel bilgilendirme amaçlı olaylar
Varsayılan Windows yapılandırmasında çok sayıda kritik olay loglanmaz. Bu yüzden ilk yapmanız gereken şey, denetim politikalarını düzgün yapılandırmaktır.
Denetim Politikalarını Yapılandırma
Group Policy üzerinden ya da doğrudan auditpol.exe komutuyla denetim politikalarını ayarlayabilirsiniz. Üretim ortamında her zaman auditpol komutunu tercih edin çünkü daha granüler kontrol sağlar.
# Mevcut denetim politikalarını görüntüle
auditpol /get /category:*
# Oturum açma olaylarını hem başarılı hem başarısız logla
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
# Hesap yönetimi olaylarını etkinleştir
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
# Ayrıcalıklı işlem kullanımını logla
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable
# Obje erişimini etkinleştir (dosya/klasör izleme için gerekli)
auditpol /set /subcategory:"File System" /success:enable /failure:enable
# Politika değişikliklerini logla
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable
# Tüm ayarları bir dosyaya kaydet (yedek amaçlı)
auditpol /backup /file:C:AuditPolicy_Backup.csv
Kritik Event ID’leri ve Ne Anlama Geldikleri
Her güvenlik olayının bir Event ID’si vardır. Bu ID’leri ezberlemek zorunda değilsiniz ama en kritik olanları bilmek sizi gerçek sorunlara anında odaklanmanızı sağlar.
Kimlik Doğrulama Olayları:
- 4624: Başarılı oturum açma
- 4625: Başarısız oturum açma girişimi
- 4634: Oturum kapama
- 4648: Açık kimlik bilgileri kullanarak oturum açma (runas gibi)
- 4672: Yönetici ayrıcalıklarıyla oturum açma
- 4768: Kerberos TGT isteği
- 4771: Kerberos ön kimlik doğrulama başarısız
Hesap Yönetimi Olayları:
- 4720: Yeni kullanıcı hesabı oluşturuldu
- 4722: Kullanıcı hesabı etkinleştirildi
- 4723: Parola değiştirme girişimi
- 4724: Parola sıfırlama
- 4725: Kullanıcı hesabı devre dışı bırakıldı
- 4726: Kullanıcı hesabı silindi
- 4728: Kullanıcı güvenlik grubuna eklendi
- 4732: Yerel gruba üye eklendi
- 4756: Evrensel gruba üye eklendi
Sistem ve Politika Olayları:
- 4698: Zamanlanmış görev oluşturuldu
- 4702: Zamanlanmış görev güncellendi
- 7045: Yeni servis kuruldu
- 4697: Servis sistemde kuruldu
- 1102: Güvenlik logu temizlendi (bu kritik!)
- 4719: Sistem denetim politikası değiştirildi
PowerShell ile Event Log Analizi
Windows Event Viewer GUI olarak iyidir ama gerçek bir sysadmin PowerShell olmadan yaşayamaz. İşte günlük hayatta kullanabileceğiniz pratik scriptler.
Başarısız Oturum Açma Girişimlerini Tespit Etme
# Son 24 saatte başarısız oturum açma girişimlerini listele
$StartTime = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
} | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
TargetUser = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
WorkStation = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'WorkstationName'} | Select-Object -ExpandProperty '#text'
SourceIP = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'
LogonType = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'} | Select-Object -ExpandProperty '#text'
}
} | Sort-Object TimeCreated -Descending | Format-Table -AutoSize
Brute Force Saldırısı Tespiti
Gerçek dünyada en sık karşılaşılan senaryolardan biri brute force saldırılarıdır. Bir IP adresinden kısa sürede çok sayıda başarısız giriş denemesi geliyorsa bu bir brute force işaretidir.
# IP başına başarısız giriş sayısını hesapla ve eşik değeri aşanları raporla
$EsikDeger = 10
$SureAraligi = (Get-Date).AddHours(-1)
$SonucList = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $SureAraligi
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'
} | Where-Object { $_ -ne '-' -and $_ -ne '::1' } |
Group-Object | Where-Object { $_.Count -ge $EsikDeger } |
Select-Object Name, Count |
Sort-Object Count -Descending
if ($SonucList) {
Write-Host "UYARI: Asagidaki IP adresleri brute force saldirisi yapıyor olabilir!" -ForegroundColor Red
$SonucList | Format-Table @{Label="IP Adresi"; Expression={$_.Name}}, @{Label="Basarisiz Giris Sayisi"; Expression={$_.Count}}
# Sonuclari log dosyasına yaz
$SonucList | Export-Csv -Path "C:LogsBruteForce_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation
} else {
Write-Host "Son 1 saatte brute force belirtisi bulunamadi." -ForegroundColor Green
}
Yeni Kullanıcı ve Grup Değişikliklerini İzleme
# Son 7 gunde yapilan hesap degisikliklerini raporla
$BaslangicTarihi = (Get-Date).AddDays(-7)
$HesapOlaylari = @(4720, 4722, 4723, 4724, 4725, 4726, 4728, 4732, 4756)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = $HesapOlaylari
StartTime = $BaslangicTarihi
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Zaman = $_.TimeCreated
EventID = $_.Id
OlayAciklama = $_.Message.Split("`n")[0]
HedefKullanici = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text')
YapanKullanici = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'SubjectUserName'} | Select-Object -ExpandProperty '#text')
}
} | Sort-Object Zaman -Descending | Format-List
Windows Event Forwarding ile Merkezi Log Toplama
Birden fazla sunucu yönetiyorsanız, her sunucuya tek tek bağlanıp log bakmak pratik değildir. Windows Event Forwarding (WEF) bu sorunu çözer. Tüm sunucuların loglarını merkezi bir kolektör sunucusuna yönlendirirsiniz.
Kolektör sunucusunda WinRM servisini yapılandırın:
# Kolektor sunucusunda Windows Remote Management'i yapilandir
winrm quickconfig -q
# WecUtil ile abonelik olustur
wecutil qc /q
# Kaynak sunucudan event forwarding'i etkinlestir
# (Kaynak sunucularda calistirilacak komutlar)
winrm quickconfig -q
gpupdate /force
# Kolektor'da abonelik durumunu kontrol et
wecutil es
# Belirli bir aboneligi detayli goruntule
wecutil gs "GuvenlikOlaylari"
# Abonelik istatistiklerini goster
wecutil gr "GuvenlikOlaylari"
WEF yapılandırması için en iyi yöntem Group Policy kullanmaktır. GPO üzerinden Computer Configuration > Windows Settings > Security Settings > Event Log yolunu izleyerek tüm makinelere merkezi politika uygulayabilirsiniz.
Gerçek Dünya Senaryosu: Pass-the-Hash Saldırısını Tespit Etme
Pass-the-Hash saldırıları, lateral movement için kullanılan yaygın bir tekniktir. Bu saldırıda saldırgan gerçek parolayı bilmeden hash değerini kullanarak kimlik doğrulama yapar. Belirtileri şunlardır:
- Logon Type 3 (Network logon) ile gelen bağlantılar
- NTLM kimlik doğrulaması kullanımı (Kerberos yerine)
- Aynı hesabın birden fazla sistemde kısa sürede oturum açması
# NTLM kimlik dogrulamali network logon olaylarini tespit et
$BaslangicTarihi = (Get-Date).AddHours(-4)
$SupheligirisimList = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = $BaslangicTarihi
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$LogonType = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'} | Select-Object -ExpandProperty '#text')
$AuthPkg = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'AuthenticationPackageName'} | Select-Object -ExpandProperty '#text')
# Logon Type 3 ve NTLM kombinasyonu saldiri isareti olabilir
if ($LogonType -eq '3' -and $AuthPkg -eq 'NTLM') {
[PSCustomObject]@{
Zaman = $_.TimeCreated
KullaniciAdi = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text')
KaynakIP = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text')
LogonType = $LogonType
AuthPaketi = $AuthPkg
}
}
} | Where-Object { $_ -ne $null -and $_.KullaniciAdi -ne 'ANONYMOUS LOGON' }
if ($SupheligirisimList) {
Write-Warning "NTLM tabanli network logon olaylari tespit edildi. Pass-the-Hash saldirisi olabilir!"
$SupheligirisimList | Sort-Object Zaman -Descending | Format-Table -AutoSize
}
Event Log Boyutunu ve Saklama Politikasını Yönetme
Varsayılan olarak Windows Security log’u yalnızca 20 MB boyutundadır. Yoğun bir ortamda bu birkaç saatlik veriyi bile tutmayabilir. Bunu PowerShell ile düzenleyin:
# Security log boyutunu 1 GB olarak ayarla
# ve dolunca eski olaylari ust uste yaz
$LogAyarlari = @{
MaximumSizeInBytes = 1073741824 # 1 GB
LogMode = 'Circular' # Circular = eski olaylari uzerine yaz
}
# Log boyutunu ayarla
wevtutil sl Security /ms:1073741824
# Log modunu ayarla (circular/retain/autobackup)
wevtutil sl Security /rt:false
# Uygulanan ayarlari dogrula
wevtutil gl Security | Select-String "maxSize|retention|autoBackup"
# Otomatik yedekleme moduna al (dolunca otomatik arsivle)
wevtutil sl Security /ab:true /ms:524288000
# Mevcut log boyutlarini goruntule
Get-WinEvent -ListLog Security, System, Application |
Select-Object LogName, MaximumSizeInBytes, RecordCount, IsEnabled |
Format-Table -AutoSize
Otomatik Uyarı Sistemi Kurma
Log bakmak yetmez, kritik olaylar gerçekleştiğinde sizi uyarmasını da isteyebilirsiniz. Bunu Windows Task Scheduler ile birleştirerek basit bir uyarı mekanizması kurabilirsiniz.
# Kritik guvenlik olayi icin otomatik e-posta uyarisi
# Bu scripti bir .ps1 dosyasina kaydedin: C:ScriptsSecurityAlert.ps1
param(
[string]$EventID,
[string]$Message
)
$SMTPServer = "smtp.sirketiniz.com"
$SMTPPort = 587
$Gonderen = "[email protected]"
$Alici = "[email protected]"
$Konu = "[GUVENLIK UYARISI] Event ID: $EventID - $(Get-Date -Format 'dd.MM.yyyy HH:mm')"
$GovdeMesaji = @"
Sunucu: $env:COMPUTERNAME
Tarih/Saat: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')
Event ID: $EventID
Olay Detayi:
$Message
Bu mesaj otomatik olarak olusturulmustur.
"@
$MailAyarlari = @{
From = $Gonderen
To = $Alici
Subject = $Konu
Body = $GovdeMesaji
SmtpServer = $SMTPServer
Port = $SMTPPort
UseSsl = $true
}
try {
Send-MailMessage @MailAyarlari
Write-EventLog -LogName Application -Source "SecurityMonitor" -EventId 9999 -EntryType Information -Message "Guvenlik uyarisi e-postasi gonderildi: EventID $EventID"
} catch {
Write-Error "E-posta gonderilemedi: $_"
}
Task Scheduler ile bu scripti tetiklemek için:
# Guvenlik log temizleme olayini (1102) yakalayan gorev olustur
$TetikleyiciAyar = New-ScheduledTaskTrigger -AtStartup
$EylemAyar = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NonInteractive -File C:ScriptsSecurityAlert.ps1 -EventID 1102 -Message 'Guvenlik logu temizlendi!'"
Register-ScheduledTask -TaskName "SecurityLogAlert_1102" `
-Trigger $TetikleyiciAyar `
-Action $EylemAyar `
-RunLevel Highest `
-User "SYSTEM"
# Daha dogru yontem: Event tetikleyicili gorev
$EventTrigger = New-CimInstance -CimClass (Get-CimClass -ClassName MSFT_TaskEventTrigger `
-Namespace Root/Microsoft/Windows/TaskScheduler) -ClientOnly -Property @{
Enabled = $true
Subscription = '<QueryList><Query Id="0"><Select Path="Security">*[System[EventID=1102]]</Select></Query></QueryList>'
}
Sysmon ile Gelişmiş Tehdit Tespiti
Yerleşik Windows logları bazı durumlarda yetersiz kalır. Sysinternals’ın Sysmon aracı ile çok daha detaylı sistem olaylarını loglayabilirsiniz. Sysmon özellikle process oluşturma, ağ bağlantıları ve dosya hash’leme konularında son derece güçlüdür.
# Sysmon kurulumu (onceden indirip C:Tools altina koydugunuzu varsayiyorum)
# Temel kurulum
C:ToolsSysmon64.exe -accepteula -i
# Ozel konfigurasyon dosyasiyla kurulum (SwiftOnSecurity konfigurasyon sablonu onerilir)
C:ToolsSysmon64.exe -accepteula -i C:Toolssysmonconfig.xml
# Sysmon servis durumunu kontrol et
Get-Service Sysmon64 | Select-Object Name, Status, StartType
# Sysmon loglarini goruntule
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 50 |
Where-Object { $_.Id -eq 1 } | # Process Create olaylari
ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Zaman = $_.TimeCreated
ProcessAdi = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'Image'} | Select-Object -ExpandProperty '#text')
ParentProc = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'ParentImage'} | Select-Object -ExpandProperty '#text')
CommandLine = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'CommandLine'} | Select-Object -ExpandProperty '#text')
Kullanici = ($xml.Event.EventData.Data | Where-Object {$_.Name -eq 'User'} | Select-Object -ExpandProperty '#text')
}
} | Format-List
Günlük Güvenlik Raporu Oluşturma
Her sabah çalışma masanıza oturduğunuzda önünüzde bir güvenlik özeti olsun istiyorsanız şu scripti task scheduler’a ekleyin:
# Gunluk guvenlik raporu scripti
# Her sabah 07:00'de calisacak sekilde ayarlayin
$RaporTarihi = Get-Date -Format "dd.MM.yyyy"
$DunBaslangic = (Get-Date).Date.AddDays(-1)
$DunBitis = (Get-Date).Date.AddSeconds(-1)
$RaporDosyasi = "C:RaporlarGuvenlikRaporu_$(Get-Date -Format 'yyyyMMdd').txt"
$Rapor = @()
$Rapor += "=" * 60
$Rapor += "GUNLUK GUVENLIK RAPORU - $RaporTarihi"
$Rapor += "Sunucu: $env:COMPUTERNAME"
$Rapor += "=" * 60
# Basarisiz giris sayisi
$BasarisizGiris = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4625; StartTime=$DunBaslangic; EndTime=$DunBitis
} -ErrorAction SilentlyContinue).Count
# Basarili admin girisi
$AdminGiris = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4672; StartTime=$DunBaslangic; EndTime=$DunBitis
} -ErrorAction SilentlyContinue).Count
# Yeni kullanici olusturma
$YeniKullanici = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4720; StartTime=$DunBaslangic; EndTime=$DunBitis
} -ErrorAction SilentlyContinue).Count
# Log temizleme
$LogTemizleme = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=1102; StartTime=$DunBaslangic; EndTime=$DunBitis
} -ErrorAction SilentlyContinue).Count
$Rapor += ""
$Rapor += "OZET ISTATISTIKLER:"
$Rapor += " Basarisiz giris denemesi : $BasarisizGiris"
$Rapor += " Admin oturum acma : $AdminGiris"
$Rapor += " Yeni kullanici olusturma : $YeniKullanici"
$Rapor += " Log temizleme olaylari : $LogTemizleme"
if ($LogTemizleme -gt 0) {
$Rapor += ""
$Rapor += "!!! KRITIK UYARI: Log temizleme olayi tespit edildi !!!"
}
$Rapor | Out-File -FilePath $RaporDosyasi -Encoding UTF8
Write-Host "Rapor olusturuldu: $RaporDosyasi"
Sonuç
Windows Event Log, doğru yapılandırıldığında bir siber güvenlik ihlalini tespit etmenin en hızlı yollarından biridir. Bu yazıda ele aldığımız adımları özetlemek gerekirse:
- Denetim politikalarını
auditpolile granüler biçimde yapılandırın. Varsayılan ayarlar kesinlikle yeterli değildir. - Kritik Event ID’leri bilin ve bunları filtreleyin. Her logu okumaya çalışmak yerine yüksek öncelikli olayları takip edin.
- PowerShell scriptlerini kullanarak manuel log inceleme sürecini otomatize edin. Brute force tespitinden yeni hesap oluşturmaya kadar her şeyi script haline getirin.
- Log boyutunu artırın. 20 MB’lık varsayılan boyut gerçek bir ortamda çok yetersiz kalır, en az 512 MB ile başlayın.
- Birden fazla sunucu yönetiyorsanız Windows Event Forwarding ile merkezi log toplama yapın.
- Sysmon kurun. Özellikle kritik sunucularda Sysmon olmadan tehdit tespiti eksik kalır.
- Otomatik uyarı mekanizmaları kurun. Sabah işe geldiğinizde dünün özet raporunu elinizin altında bulundurun.
Güvenlik olaylarını izlemek bir defalık yapılıp geçilen bir iş değildir. Tehdit ortamı sürekli değişir ve loglarınızı düzenli olarak gözden geçirme alışkanlığı edinmeniz gerekir. Başlangıçta çok fazla gürültü göreceksiniz ama zamanla hangi olayların normal, hangilerinin anormal olduğunu ayırt etmeye başlayacaksınız. O noktaya geldiğinizde gerçek anlamda proaktif bir güvenlik duruşuna kavuşmuş olursunuz.