Windows Olay İzleyici ile Başarısız Giriş Denemelerini Bulma
Sunucunuza kim girmeye çalışıyor? Bu soruyu kendinize hiç sordunuz mu? Bir Windows Server yönetiyorsanız ve olay günlüklerini düzenli takip etmiyorsanız, şu an bile birileri sisteminize kaba kuvvet saldırısı yapıyor olabilir. Windows Olay İzleyici (Event Viewer), bu tür saldırıları tespit etmek için inanılmaz güçlü bir araç, ancak çoğu sysadmin bunu yüzeysel kullanıyor. Bu yazıda, başarısız giriş denemelerini nasıl bulacağınızı, analiz edeceğinizi ve buna karşı önlem alacağınızı adım adım ele alacağım.
Windows Olay Günlükleri Nasıl Çalışır?
Windows, sistemde gerçekleşen her önemli olayı günlük dosyalarına kaydeder. Bu günlükler birkaç ana kategoriye ayrılır:
- Security (Güvenlik): Kimlik doğrulama, yetkilendirme, hesap yönetimi olayları
- System (Sistem): İşletim sistemi bileşenlerine ait olaylar
- Application (Uygulama): Uygulamaların ürettiği olaylar
- Setup: Windows kurulum ve güncelleme olayları
Bizi en çok ilgilendiren Security günlüğü. Başarısız giriş denemeleri, hesap kilitlemeleri ve yetkisiz erişim girişimleri burada saklanır. Ancak bu günlüğün aktif olabilmesi için denetim politikasının (audit policy) doğru yapılandırılmış olması gerekir.
Denetim Politikasını Aktifleştirme
Varsayılan olarak Windows Server ortamlarında güvenlik denetimi açıktır, ancak Workstation makinelerde bazı ayarların manuel olarak etkinleştirilmesi gerekebilir. Group Policy ile bunu kontrol edebilirsiniz:
# Mevcut denetim politikasını görüntüle
auditpol /get /category:"Logon/Logoff"
# Başarısız girişleri denetlemeyi etkinleştir
auditpol /set /subcategory:"Logon" /failure:enable
# Hesap kilitleme olaylarını etkinleştir
auditpol /set /subcategory:"Account Lockout" /failure:enable /success:enable
# Tüm ayarları kontrol et
auditpol /get /category:*
Bu komutları çalıştırdıktan sonra sistem artık başarısız giriş denemelerini Event ID 4625 ile kayıt altına almaya başlar.
Kritik Event ID’leri Bilmek Şart
Windows’ta güvenlik olayları belirli kimlik numaraları (Event ID) ile kategorize edilir. Başarısız giriş incelemeleri için bilmeniz gereken temel ID’ler şunlar:
- 4625: Başarısız hesap girişi (en önemli olay)
- 4624: Başarılı giriş (anormal saatlerdeki başarılı girişler de şüpheli olabilir)
- 4648: Açık kimlik bilgileriyle giriş denemesi
- 4740: Hesap kilitlendi
- 4771: Kerberos ön kimlik doğrulama başarısız (domain ortamı)
- 4776: NTLM kimlik doğrulama başarısız
- 4768: Kerberos TGT isteği başarısız
Event ID 4625 içinde ayrıca bir Logon Type alanı bulunur ve bu alan saldırının nasıl gerçekleştirildiğini anlamanızı sağlar:
- Logon Type 3: Ağ üzerinden giriş (en yaygın RDP öncesi tarama)
- Logon Type 10: RDP ile uzak etkileşimli giriş
- Logon Type 2: Yerel etkileşimli giriş
- Logon Type 7: Ekran kilidini açma girişimi
- Logon Type 8: Ağ üzerinden şifresiz metin kimlik bilgisi
Event Viewer ile Manuel İnceleme
Grafik arayüz üzerinden hızlı bir inceleme yapmak için Event Viewer’ı açın. Win + R tuşlarına basın ve eventvwr.msc yazın. Açılan pencerede Windows Logs > Security yolunu izleyin.
Binlerce kayıt arasında kaybolmamak için filtre kullanmanız şart. Sağ paneldeki Filter Current Log seçeneğine tıklayın ve Event ID alanına 4625 yazın. Bu size sadece başarısız giriş denemelerini gösterir.
Ancak gerçek analizler için komut satırı çok daha verimli.
PowerShell ile Başarısız Giriş Sorgulama
PowerShell, olay günlüklerini sorgulamak için son derece güçlü araçlar sunar. Aşağıdaki script ile son 24 saatteki tüm başarısız giriş denemelerini getirebilirsiniz:
# Son 24 saatteki başarısız giriş denemelerini listele
$startTime = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
} | Select-Object TimeCreated,
@{N='Username';E={$_.Properties[5].Value}},
@{N='Domain';E={$_.Properties[6].Value}},
@{N='LogonType';E={$_.Properties[10].Value}},
@{N='SourceIP';E={$_.Properties[19].Value}} |
Format-Table -AutoSize
Bu komut size zaman damgası, kullanıcı adı, domain, giriş tipi ve kaynak IP adresini yan yana gösterir. Bir IP adresinden onlarca deneme geliyorsa, bu neredeyse kesinlikle otomatik bir saldırıdır.
IP Bazlı Gruplama ile Saldırı Tespiti
Hangi IP adresinin en çok deneme yaptığını bulmak için sonuçları gruplandırabilirsiniz:
# IP adresine göre başarısız deneme sayısını grupla
$startTime = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
} | ForEach-Object {
[PSCustomObject]@{
SourceIP = $_.Properties[19].Value
Username = $_.Properties[5].Value
Time = $_.TimeCreated
}
} | Group-Object SourceIP |
Sort-Object Count -Descending |
Select-Object -First 20 Name, Count |
Format-Table -AutoSize
Ben bunu bir müşteri sunucusunda çalıştırdığımda, tek bir Çin IP adresinden 7 günde 14.000’den fazla başarısız giriş denemesi geldiğini gördüm. Bunu görene kadar sistem sahibinin hiçbir fikri yoktu.
Hedef Alınan Kullanıcı Adlarını Bulma
Saldırganlar genellikle administrator, admin, root, user gibi tahmin edilebilir kullanıcı adlarını dener. Hangi hesapların hedef alındığını görmek için:
# En çok hedef alınan kullanıcı adlarını bul
$startTime = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
} | ForEach-Object {
$_.Properties[5].Value
} | Where-Object { $_ -ne "" -and $_ -ne "-" } |
Group-Object |
Sort-Object Count -Descending |
Select-Object -First 15 Name, Count |
Format-Table -AutoSize
Eğer mevcut olmayan kullanıcı adları hedef alınıyorsa, bu hesap numaralandırma (account enumeration) saldırısının göstergesidir. Eğer gerçek kullanıcı adlarınız hedef alınıyorsa, iç ağdan veya sosyal mühendislikle elde edilmiş bilgilerle saldırı yapılıyor olabilir.
Gerçek Dünya Senaryosu: RDP Brute Force Tespiti
Diyelim ki bir müşterinizin RDP portunu (3389) açık bırakmış ve şüpheli yavaşlamalar yaşanıyor. İşte bu durumu analiz etmek için kullanacağım yaklaşım:
# RDP üzerinden yapılan başarısız girişleri bul (LogonType 10)
$startTime = (Get-Date).AddDays(-3)
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
}
$rdpFailures = $events | ForEach-Object {
$logonType = $_.Properties[10].Value
if ($logonType -eq 10 -or $logonType -eq 3) {
[PSCustomObject]@{
Time = $_.TimeCreated
Username = $_.Properties[5].Value
SourceIP = $_.Properties[19].Value
LogonType = $logonType
}
}
} | Where-Object { $_ -ne $null }
Write-Host "Toplam RDP başarısız giriş: $($rdpFailures.Count)"
$rdpFailures | Group-Object SourceIP |
Sort-Object Count -Descending |
Select-Object -First 10 Name, Count
Bu script bana 3 günlük periyotta Logon Type 3 ve 10 ile yapılan denemeleri gösterir. Eğer tek bir IP’den saatte 100’den fazla deneme geliyorsa, bunu Windows Firewall ile anında engelleyebilirsiniz:
# Kötü niyetli IP'yi firewall ile engelle
$maliciousIP = "203.0.113.45"
New-NetFirewallRule -DisplayName "Block Brute Force - $maliciousIP" `
-Direction Inbound `
-Action Block `
-RemoteAddress $maliciousIP `
-Protocol TCP `
-LocalPort 3389 `
-Description "Otomatik engelleme - Brute force tespiti"
Write-Host "$maliciousIP adresi başarıyla engellendi."
Otomatik Uyarı Sistemi Kurma
Her gün manuel kontrol yapmak mümkün değil. Belirli bir eşiği aşan başarısız giriş denemelerinde otomatik e-posta uyarısı gönderen bir script hazırlayalım:
# Brute force uyarı scripti - Task Scheduler ile saatlik çalıştırın
param(
[int]$Threshold = 50,
[int]$TimeWindowMinutes = 30,
[string]$SmtpServer = "mail.sirketiniz.com",
[string]$AlertEmail = "[email protected]"
)
$startTime = (Get-Date).AddMinutes(-$TimeWindowMinutes)
$failedLogins = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
} -ErrorAction SilentlyContinue
if ($failedLogins.Count -gt $Threshold) {
$topAttackers = $failedLogins | ForEach-Object {
$_.Properties[19].Value
} | Group-Object | Sort-Object Count -Descending |
Select-Object -First 5
$body = "UYARI: Son $TimeWindowMinutes dakikada $($failedLogins.Count) başarısız giriş denemesi tespit edildi.`n`n"
$body += "En aktif kaynak IP'ler:`n"
foreach ($ip in $topAttackers) {
$body += " - $($ip.Name): $($ip.Count) deneme`n"
}
$body += "`nSunucu: $env:COMPUTERNAME`nZaman: $(Get-Date)"
Send-MailMessage -To $AlertEmail -From "[email protected]" `
-Subject "GUVENLIK UYARISI: Brute Force Saldirisi Tespit Edildi" `
-Body $body -SmtpServer $SmtpServer
Write-EventLog -LogName Application -Source "SecurityMonitor" `
-EventId 9001 -EntryType Warning -Message $body
}
Bu scripti Task Scheduler’a ekleyin ve her 30 dakikada bir çalışacak şekilde ayarlayın. Eşiğin (Threshold) altındaki normal başarısız giriş denemelerinde (şifremi unuttum durumları gibi) alarm üretmez, ama ciddi bir saldırı başladığında anında haberdar olursunuz.
Hesap Kilitleme Olaylarını Takip Etme
Başarısız girişlerin yanı sıra hesap kilitleme olayları da önemli. Özellikle domain ortamında bir hesabın sürekli kilitlenmesi, aktif bir saldırının işareti olabilir:
# Son 24 saatteki hesap kilitleme olaylarını bul
$startTime = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4740
StartTime = $startTime
} | Select-Object TimeCreated,
@{N='LockedAccount';E={$_.Properties[0].Value}},
@{N='CallerComputer';E={$_.Properties[1].Value}},
@{N='LoggedByDC';E={$_.Properties[4].Value}} |
Format-Table -AutoSize
Domain Controller üzerinde bu komutu çalıştırdığınızda, hangi bilgisayarın hangi hesabı kilitlediğini görebilirsiniz. Eğer kilitleme kaynağı bilinmeyen bir makine ya da farklı bir sunucuysa, orada bir problem var demektir.
Olay Günlüklerini Merkezi Sisteme Aktarma
Birden fazla Windows sunucusu yönetiyorsanız, her birini ayrı ayrı incelemek hem zaman kaybı hem de körlük demektir. Windows Event Forwarding (WEF) ile tüm sunucuların günlüklerini merkezi bir kolektör sunucusunda toplayabilirsiniz.
Kolektör sunucusunda:
# Windows Remote Management servisini başlat
winrm quickconfig -quiet
# Event Collector servisini başlat ve otomatik başlangıca al
wecutil qc /quiet
Set-Service -Name Wecsvc -StartupType Automatic
Start-Service Wecsvc
# Kolektör aboneliği oluştur
wecutil cs "C:SecuritySubscription.xml"
Kaynak sunucularda ise Group Policy üzerinden Computer Configuration > Administrative Templates > Windows Components > Event Forwarding altındaki ayarları yapılandırarak tüm güvenlik olaylarının kolektöre gönderilmesini sağlayabilirsiniz.
Daha profesyonel bir çözüm için açık kaynak Graylog veya ticari Splunk gibi SIEM araçlarına entegrasyon düşünebilirsiniz. Bu araçlar logları otomatik analiz eder, görsel dashboard sunar ve korelasyon kuralları ile çok daha sofistike tespitler yapabilir.
Güvenlik Günlüklerinin Boyutunu Ayarlama
Kritik bir nokta: Windows güvenlik günlüğünün varsayılan boyutu genellikle 20 MB ile sınırlıdır. Yoğun bir ortamda bu günlük birkaç saat içinde dolabilir ve eski olaylar silinerek üzerine yazılabilir. Adli analiz yapmanız gerektiğinde verilere ulaşamayabilirsiniz.
# Security günlük boyutunu 512 MB olarak ayarla
$logName = "Security"
$maxSize = 512MB
Limit-EventLog -LogName $logName -MaximumSize $maxSize
# Günlük dolduğunda eski olayları arşivle (üzerine yazma yerine)
$log = Get-WinEvent -ListLog $logName
$log.MaximumSizeInBytes = $maxSize
$log.LogMode = [System.Diagnostics.Eventing.Reader.EventLogMode]::AutoBackup
$log.SaveChanges()
Write-Host "Günlük boyutu $($maxSize/1MB) MB olarak ayarlandı."
Ayrıca günlük dosyalarını düzenli olarak uzak bir lokasyona veya NAS’a arşivlemek iyi bir pratik. Olası bir ihlal sonrasında forensik analiz yapabilmeniz için en az 90 günlük log tarihi tutmanızı öneririm.
Pratik Öneriler ve Alınabilecek Önlemler
Başarısız giriş denemelerini tespit etmek sadece başlangıç. Asıl amaç bu tespitlere dayanarak sisteminizi güçlendirmek:
- RDP portunu değiştirin: 3389 yerine standart dışı bir port kullanmak otomatik tarayıcıların büyük çoğunluğunu engeller
- Network Level Authentication (NLA) aktifleştirin: RDP oturumu başlamadan önce kimlik doğrulaması yapılmasını zorunlu kılar
- Hesap kilitleme politikası uygulayın: 5 başarısız denemeden sonra hesabı 15 dakika kilitleyin
- MFA kullanın: RDP erişimi için iki faktörlü kimlik doğrulama eklemek kaba kuvvet saldırılarını neredeyse imkansız kılar
- VPN arkasına alın: RDP’yi internet üzerine açmak yerine VPN bağlantısı gerektirin
- Just Enough Administration (JEA) uygulayın: Her kullanıcıya gerçekten ihtiyaç duyduğu kadar yetki verin
- Windows Defender Firewall coğrafi engelleme: Sadece kullandığınız ülkelerden gelen trafiğe izin verin
- Fail2Ban benzeri çözüm: Windows ortamı için IPBan aracı belirli sayıda başarısız girişten sonra IP’yi otomatik engeller
IPBan kurulumu için:
# IPBan'ı servis olarak yükle (yönetici PowerShell'den)
# Önce GitHub'dan son sürümü indirip çıkartın
cd "C:IPBan"
sc.exe create IPBan type=own start=auto binPath="C:IPBanDigitalRuby.IPBan.exe" DisplayName="IPBan"
sc.exe description IPBan "Otomatik IP engelleme servisi"
sc.exe start IPBan
Write-Host "IPBan servisi başlatıldı."
IPBan varsayılan olarak 5 başarısız girişten sonra kaynak IP’yi Windows Firewall’a ekleyerek engeller. Konfigürasyon dosyasından eşiği, engelleme süresini ve whitelist’i özelleştirebilirsiniz.
Sonuç
Windows Olay İzleyici, doğru kullanıldığında son derece güçlü bir güvenlik zekası kaynağı. Event ID 4625’i düzenli takip etmek, saldırıları erken safhalarda fark etmenizi ve gerekli önlemleri almanızı sağlar. Ancak reaktif yaklaşım yeterli değil; otomatik uyarılar kurun, günlük boyutlarını artırın, merkezi log yönetimine geçin ve tespitleri somut güvenlik iyileştirmelerine dönüştürün.
Çoğu güvenlik ihlalinin öncesinde sistemde görünür izler bıraktığını unutmayın. Olay günlüklerini kim okursa, o kazanır. Sisteminizi izlemeye bugün başlayın, yarına bırakmayın.
