Windows Event Log ile Güvenlik Olaylarını İzleme

Bir sabah işe geldiniz, kahvenizi aldınız, bilgisayarınızı açtınız ve güvenlik ekibinden bir mail görüyorsunuz: “Gece 02:30’da domain admin hesabıyla 47 başarısız giriş denemesi yapılmış.” Paniğe kapılmadan önce şunu söyleyeyim, Windows Event Log bu tür durumları kayıt altına alıyor ve doğru yapılandırıldığında size bu bilgiyi çok daha erken verebilir. İşte bu yazıda, Windows Event Log sistemini sysadmin gözüyle nasıl kullanacağınızı, hangi event ID’lerin kritik olduğunu ve gerçek dünya senaryolarında nasıl aksiyon alacağınızı anlatacağım.

Windows Event Log Nedir ve Neden Önemlidir

Windows, sistemde gerçekleşen neredeyse her şeyi kayıt altına alır. Kullanıcı girişleri, servis başlatmaları, policy değişiklikleri, dosya erişimleri, ağ bağlantıları… Bunların tamamı Event Log içinde saklanır. Güvenlik açısından bakıldığında bu loglar, bir saldırının izini sürmek için altın değerindedir.

Event Log üç temel kategoride çalışır:

  • System: İşletim sistemi ve donanım olayları
  • Application: Uygulama bazlı olaylar
  • Security: Kimlik doğrulama, yetki kullanımı ve denetim olayları

Güvenlik perspektifinden en önemli log, tahmin edeceğiniz üzere Security logudur. Ancak burada önemli bir nokta var: Security logunu düzgün kullanabilmek için önce Audit Policy ayarlarını doğru yapılandırmanız gerekiyor.

Audit Policy Yapılandırması

Varsayılan Windows kurulumunda audit policy yeterince kapsamlı değildir. Hangi olayların loglanacağını belirlemek için Group Policy veya komut satırını kullanabilirsiniz.

# Mevcut audit policy durumunu görüntüle
auditpol /get /category:*

# Logon/Logoff olaylarını etkinleştir
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

# Privilege kullanımını etkinleştir
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable

# Process oluşturma olaylarını etkinleştir
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enable

Bu komutları domain ortamında GPO üzerinden tüm makinelere push etmenizi öneririm. Aksi takdirde her sunucuyu tek tek yapılandırmak zorunda kalırsınız ki bu da hem zaman kaybı hem de tutarsız bir log altyapısı demektir.

Kritik Event ID’ler

Kimlik Doğrulama Olayları

Güvenlik ekipleri için en kritik event ID’ler kimlik doğrulama ile ilgili olanlardır. Bunları ezberlemek zorunda değilsiniz ama kağıda yazıp monitörünüzün yanına yapıştırmanızı öneririm.

  • 4624: Başarılı oturum açma. Her başarılı girişi loglar.
  • 4625: Başarısız oturum açma. Brute force saldırılarını tespit etmek için kritik.
  • 4634: Oturum kapatma.
  • 4647: Kullanıcı tarafından başlatılan oturum kapatma.
  • 4648: Explicit credentials kullanarak giriş (RunAs gibi senaryolar).
  • 4672: Yönetici haklarıyla oturum açma. Admin hesaplarının her girişini izlemek için.
  • 4771: Kerberos pre-authentication başarısız. Active Directory ortamlarında önemli.
  • 4776: NTLM kimlik doğrulama girişimi.

Hesap Yönetimi Olayları

  • 4720: Yeni kullanıcı hesabı oluşturuldu.
  • 4722: Kullanıcı hesabı etkinleştirildi.
  • 4723: Kullanıcı şifre değiştirme girişimi.
  • 4724: Yönetici tarafından şifre sıfırlama.
  • 4725: Kullanıcı hesabı devre dışı bırakıldı.
  • 4728: Domain Admins grubuna üye eklendi. Bu olayı mutlaka izleyin.
  • 4732: Local Administrators grubuna üye eklendi.
  • 4756: Universal güvenlik grubuna üye eklendi.

Sistem ve Policy Değişiklikleri

  • 4719: Sistem audit policy değiştirildi. Biri logları kapatmaya çalışıyor olabilir.
  • 4740: Kullanıcı hesabı kilitlendi.
  • 7045: Yeni bir servis kuruldu.
  • 4697: Bir servis sisteme kuruldu (Security logunda).
  • 1102: Security audit log temizlendi. Bu olay kritik bir uyarı işaretidir.
  • 4698: Scheduled task oluşturuldu. Persistence mekanizması olarak sık kullanılır.
  • 4702: Scheduled task güncellendi.

PowerShell ile Event Log Sorgulama

Windows Event Log’u GUI üzerinden incelemek mümkün ama büyük ortamlarda bu yaklaşım yetersiz kalır. PowerShell ile çok daha güçlü sorgular yazabilirsiniz.

# Son 24 saatte başarısız giriş denemelerini listele
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message | Format-List

Belirli bir kullanıcı hesabını hedef alan saldırıları tespit etmek istiyorsanız:

# Belirli kullanıcı için başarısız girişleri filtrele
$Events = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = (Get-Date).AddDays(-7)
}

$Events | ForEach-Object {
    $XML = [xml]$_.ToXml()
    $Username = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'TargetUserName'} | 
        Select-Object -ExpandProperty '#text'
    $IPAddress = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'IpAddress'} | 
        Select-Object -ExpandProperty '#text'
    
    [PSCustomObject]@{
        Time = $_.TimeCreated
        Username = $Username
        SourceIP = $IPAddress
    }
} | Group-Object Username | Sort-Object Count -Descending | Select-Object -First 10

Bu script size son 7 gün içinde en çok başarısız giriş denemesi yapılan kullanıcıları listeler. Brute force hedeflerini hızlıca görmenizi sağlar.

Admin Grubuna Ekleme Olaylarını İzleme

# Domain Admins veya Local Admins grubuna ekleme olaylarını izle
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = @(4728, 4732, 4756)
    StartTime = (Get-Date).AddDays(-30)
} | ForEach-Object {
    $XML = [xml]$_.ToXml()
    $MemberName = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'MemberName'} | 
        Select-Object -ExpandProperty '#text'
    $GroupName = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'TargetUserName'} | 
        Select-Object -ExpandProperty '#text'
    $ActorName = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'SubjectUserName'} | 
        Select-Object -ExpandProperty '#text'
    
    Write-Host "[$($_.TimeCreated)] $ActorName kullanicisi $MemberName hesabini $GroupName grubuna ekledi"
}

Log Temizleme Girişimlerini Tespit Etme

# Security log temizleme olaylarini kontrol et
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 1102
} -ErrorAction SilentlyContinue | ForEach-Object {
    $XML = [xml]$_.ToXml()
    $Actor = $XML.Event.UserData.LogFileCleared.SubjectUserName
    Write-Warning "KRITIK: [$($_.TimeCreated)] $Actor tarafindan Security log temizlendi!"
}

Log temizleme olayı tespit ettiğinizde zaten geç kalmış olabilirsiniz. Bu yüzden logları merkezi bir sisteme (SIEM veya basit bir log server) göndermek şart.

Wevtutil ile Komut Satırı Yönetimi

PowerShell dışında, built-in wevtutil aracı da event log yönetimi için oldukça kullanışlıdır.

# Security logunu XML formatında dışa aktar
wevtutil epl Security C:Logssecurity_backup.evtx

# Belirli event ID'leri sorgula (XPath ile)
wevtutil qe Security "/q:*[System[(EventID=4625)]]" /f:text /c:50

# Log boyutu ve retention ayarlarını görüntüle
wevtutil gl Security

# Log maksimum boyutunu 500MB olarak ayarla (retention policy)
wevtutil sl Security /ms:524288000

# Log dolduğunda eski olayların üzerine yaz
wevtutil sl Security /rt:false

wevtutil özellikle script içinde kullanılacak basit sorgular için tercih edilebilir. XPath sözdizimi biraz karmaşık görünse de alıştığınızda çok güçlü filtreler oluşturabilirsiniz.

Gerçek Dünya Senaryosu: Brute Force Tespiti ve Otomatik Engelleme

Şimdi gerçek bir senaryoyu ele alalım. Domain Controller’ınıza RDP veya network üzerinden brute force saldırısı geliyor. Aşağıdaki script, belirli bir eşiği aşan IP adreslerini tespit edip Windows Firewall’a otomatik olarak kural ekler.

# Brute Force tespiti ve otomatik engelleme scripti
# Bu scripti Task Scheduler ile her 15 dakikada bir calistirin

param(
    [int]$FailedAttemptThreshold = 10,
    [int]$TimeWindowMinutes = 30
)

$StartTime = (Get-Date).AddMinutes(-$TimeWindowMinutes)

# Son X dakikadaki basarisiz girisler
$FailedLogins = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = $StartTime
} -ErrorAction SilentlyContinue

if (-not $FailedLogins) {
    Write-Host "Son $TimeWindowMinutes dakikada basarisiz giris yok."
    exit
}

# IP adreslerine gore grupla
$SuspiciousIPs = $FailedLogins | ForEach-Object {
    $XML = [xml]$_.ToXml()
    $IP = $XML.Event.EventData.Data | 
        Where-Object {$_.Name -eq 'IpAddress'} | 
        Select-Object -ExpandProperty '#text'
    $IP
} | Where-Object {$_ -ne '-' -and $_ -ne $null} | 
    Group-Object | 
    Where-Object {$_.Count -ge $FailedAttemptThreshold}

foreach ($SuspiciousIP in $SuspiciousIPs) {
    $IP = $SuspiciousIP.Name
    $Count = $SuspiciousIP.Count
    
    # Firewall kurali zaten var mi kontrol et
    $ExistingRule = Get-NetFirewallRule -DisplayName "BruteForce_Block_$IP" -ErrorAction SilentlyContinue
    
    if (-not $ExistingRule) {
        # Firewall kurali ekle
        New-NetFirewallRule -DisplayName "BruteForce_Block_$IP" `
            -Direction Inbound `
            -Action Block `
            -RemoteAddress $IP `
            -Protocol Any `
            -Enabled True
        
        Write-Warning "ENGELLENDI: $IP adresi $Count basarisiz giris denemesi nedeniyle bloklandi."
        
        # Event log'a yaz
        Write-EventLog -LogName Application `
            -Source "SecurityMonitor" `
            -EventId 9001 `
            -EntryType Warning `
            -Message "Brute force engelleme: $IP adresi $Count deneme sonrasi bloklandi."
    }
}

Bu script production ortamda kullanmadan önce test edin ve özellikle IP whitelist mekanizması ekleyin. Aksi takdirde meşru kullanıcıları veya sistemleri yanlışlıkla engelleyebilirsiniz.

Merkezi Log Toplama: Windows Event Forwarding

Tek bir sunucuda logları analiz etmek yönetilebilir, ama 50-100 sunucunuz varsa her birinde ayrı ayrı log bakmak imkansız hale gelir. Bu noktada Windows Event Forwarding (WEF) devreye girer.

WEF, event logları merkezi bir Windows Event Collector (WEC) sunucusuna push etmenizi sağlar. Yapılandırma adımları:

# WEC sunucusunda - Windows Remote Management servisini baslat
winrm quickconfig -q

# WEC sunucusunda - Event Collector servisini baslat ve otomatik yap
sc config Wecsvc start=auto
net start Wecsvc

# WEC sunucusunda - Event Collector yapilandirmasini aktifle
wecutil qc /q

# Source sunucularda (GPO ile de yapilabilir) - WinRM'i etkinlestir
winrm quickconfig -q

# Source sunucularda - WEC sunucusuna subscription bildir
# Bu genellikle GPO ile "Event Log Readers" grubu ve subscription URL'si ile yapilir

WEF kurulumu biraz zaman alıyor ama sonrasında tüm sunucuların Security loglarını tek bir noktadan izleyebiliyorsunuz. Küçük ve orta ölçekli ortamlar için Splunk, Elastic Stack gibi SIEM çözümlerine geçmeden önce WEF ile başlamak mantıklı bir yaklaşım.

Scheduled Task ile Otomatik Güvenlik Raporu

Her sabah e-posta kutunuzda önceki geceye ait güvenlik özeti olsun istemez misiniz? Aşağıdaki script bunun için basit bir başlangıç noktası:

# Gunluk guvenlik ozeti raporu olustur
$ReportDate = (Get-Date).AddDays(-1)
$ReportPath = "C:SecurityReportsReport_$(Get-Date -Format 'yyyyMMdd').txt"

$Report = @"
===== GUNLUK GUVENLIK OZETI =====
Rapor Tarihi: $(Get-Date -Format 'dd.MM.yyyy HH:mm')
Kapsanan Donem: $($ReportDate.ToString('dd.MM.yyyy'))
=================================

"@

# Basarisiz giris sayisi
$FailedLogins = (Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4625
    StartTime=$ReportDate; EndTime=(Get-Date)
} -ErrorAction SilentlyContinue).Count

$Report += "Basarisiz Giris Denemesi: $FailedLogins`n"

# Hesap kilitleme sayisi
$Lockouts = (Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4740
    StartTime=$ReportDate; EndTime=(Get-Date)
} -ErrorAction SilentlyContinue).Count

$Report += "Hesap Kilitleme Sayisi: $Lockouts`n"

# Yeni kullanici hesabi olusturma
$NewAccounts = (Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4720
    StartTime=$ReportDate; EndTime=(Get-Date)
} -ErrorAction SilentlyContinue).Count

$Report += "Yeni Hesap Olusturma: $NewAccounts`n"

# Admin grubuna ekleme
$GroupChanges = (Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=@(4728,4732)
    StartTime=$ReportDate; EndTime=(Get-Date)
} -ErrorAction SilentlyContinue).Count

$Report += "Admin Grubu Degisiklik: $GroupChanges`n"

$Report | Out-File $ReportPath -Encoding UTF8
Write-Host "Rapor olusturuldu: $ReportPath"

Bu scripti Task Scheduler’a her sabah 06:00’da çalışacak şekilde ekleyin. Daha gelişmiş bir versiyon için Send-MailMessage cmdlet’i ile e-posta gönderme ekleyebilirsiniz.

Log Retention ve Kapasite Planlaması

Security logları çok hızlı dolabilir, özellikle yoğun bir domain ortamında. Kapasite planlaması yaparken şunlara dikkat edin:

  • Log boyutunu artırın: Varsayılan 20MB hiçbir zaman yeterli değildir. Production ortamda en az 500MB, kritik sunucularda 1-2GB öneririm.
  • Retention süresi belirleyin: Compliance gereksinimlerinize göre 90 gün ile 1 yıl arası retention hedefleyin.
  • Merkezi depolama kullanın: Logları sadece yerel diskte tutmayın. Saldırgan logları silerse kanıt kaybedersiniz.
  • Log integrity’sini koruyun: Log dosyalarına write yetkisini kısıtlayın.
# Tum kritik log boyutlarini 500MB olarak ayarla
$CriticalLogs = @('Security', 'System', 'Application')
foreach ($Log in $CriticalLogs) {
    wevtutil sl $Log /ms:524288000
    Write-Host "$Log log maksimum boyutu 500MB olarak ayarlandi."
}

SIEM Entegrasyonu Hakkında Kısa Not

Anlattığım yöntemler, özellikle küçük ve orta ölçekli ortamlar için gayet işlevsel. Ancak ortamınız büyüdükçe, Splunk, Elastic/ELK Stack veya Microsoft Sentinel gibi SIEM çözümlerine geçişi düşünmelisiniz. Bu araçlar:

  • Gerçek zamanlı korelasyon yapabilir (birden fazla sunucudaki olayları ilişkilendirir)
  • Davranışsal analitik (UEBA) sunar
  • Hazır dashboard ve alert template’leri ile gelir
  • Compliance raporlamayı kolaylaştırır

Bütçe kısıtı varsa, Graylog açık kaynaklı ve güçlü bir alternatif. Windows event loglarını Winlogbeat (Elastic’in agent’ı) ile Graylog’a göndererek ciddi bir SIEM benzeri altyapı kurabilirsiniz.

Sonuç

Windows Event Log, doğru yapılandırıldığında güvenlik olaylarını tespit etmek için son derece güçlü bir araçtır. Ama “doğru yapılandırma” kelimesinin altını çizmek istiyorum. Varsayılan ayarlarla bırakılan bir Windows sistemi, gerçek bir saldırıda yeterli iz bırakmayabilir.

Bugün yapabileceğiniz en değerli üç şey şunlardır: Audit policy’yi kapsamlı hale getirin, log boyutlarını artırın ve en azından kritik event ID’ler için otomatik alertler oluşturun. Bu üç adım bile sizi ortalama bir Windows ortamının çok üstüne çıkarır.

Güvenlik izleme bir proje değil, sürekli devam eden bir süreçtir. Loglarınıza düzenli olarak bakın, anomalileri takip edin ve her incident’tan ders çıkarın. Sabah gelen o güvenlik e-postasını siz gönderiyor olun, almıyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir