Güvenlik Günlüklerini İzleme: Başarısız Oturum Açma (Event ID 4625) Saldırılarını Tespit Edip IP'yi Windows Firewall'da Engelleyen Script
Bir Windows sunucusunun RDP (Uzak Masaüstü - Port 3389) veya web servisleri internete açıksa, her gün dünyanın dört bir yanındaki botnet'lerden saniyede onlarca başarısız parola denemesi alır (Brute-Force / Password Spraying). Windows Güvenlik Olay Günlüğü (Security Event Log) açıldığında dakikada yüzlerce Event ID 4625 (An account failed to log on) kaydı aktığını görürsünüz. Bu saldırılar hem sunucu işlemcisini yorar hem de zayıf parolalı bir kullanıcı hesabı varsa içeri sızılmasına neden olur. Bu saldırganları tespit edip otomatik engelleyen otonom PowerShell savunma mekanizması.
1. Event ID 4625 Anatomisi
Bir Event ID 4625 kaydında saldırgan hakkında hayati bilgiler gizlidir:
- TargetUserName: Saldırganın girmeye çalıştığı hesap (örn:
Administrator,muhasebe,test). - IpAddress: Saldırganın gerçek dış IP adresi (örn:
185.220.101.5). - LogonType: 3 (Ağ oturumu) veya 10 (RDP oturumu).
- SubStatus:
0xC000006A(Kullanıcı adı doğru, şifre yanlış) veya0xC0000064(Böyle bir kullanıcı yok).
2. Fail2Ban Mantığıyla Çalışan Otonom PowerShell Savunucusu
Aşağıdaki betik son 15 dakikadaki Event ID 4625 loglarını tarar:
- Eğer aynı IP adresinden 5'ten fazla başarısız deneme gelmişse,
- O IP adresini anında Windows Defender Firewall'daki
Otomatik_Engellenen_Saldirganlarkuralına ekler!
# Güvenlik Duvarında Engelleme Kuralını Hazırlama
$RuleName = "Blacklist_BruteForce_AutoBlock"
$ExistingRule = Get-NetFirewallRule -DisplayName $RuleName -ErrorAction SilentlyContinue
if (-not $ExistingRule) {
New-NetFirewallRule -DisplayName $RuleName -Direction Inbound -Action Block -RemoteAddress "1.1.1.1"
}
# Son 15 dakikadaki Event ID 4625 kayıtlarını filtreleme
$StartTime = (Get-Date).AddMinutes(-15)
$Events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
} -ErrorAction SilentlyContinue
$FailedIPs = @()
foreach ($Event in $Events) {
$eventXML = [xml]$Event.ToXml()
$IP = ($eventXML.Event.EventData.Data | Where-Object {$_.Name -eq "IpAddress"}).'#text'
# Yerel IP'leri ve boş değerleri hariç tut
if ($IP -and $IP -ne "-" -and $IP -ne "127.0.0.1" -and $IP -notlike "10.*" -and $IP -notlike "192.168.*") {
$FailedIPs += $IP
}
}
# 5'ten fazla başarısız deneme yapan IP'leri yakalama
$Offenders = $FailedIPs | Group-Object | Where-Object {$_.Count -ge 5}
$CurrentBlockedIPs = (Get-NetFirewallRule -DisplayName $RuleName | Get-NetFirewallAddressFilter).RemoteAddress
foreach ($Offender in $Offenders) {
$BadIP = $Offender.Name
if ($CurrentBlockedIPs -notcontains $BadIP) {
Write-Warning "Saldırgan Tespit Edildi ve Engellendi: $BadIP ($($Offender.Count) Deneme)"
$CurrentBlockedIPs += $BadIP
Set-NetFirewallRule -DisplayName $RuleName -RemoteAddress $CurrentBlockedIPs
}
}
3. Windows Task Scheduler ile Olay Bazlı (Event-Triggered) Çalıştırma
Bu scripti her 15 dakikada bir çalıştırmak yerine, Event Viewer üzerinden bir Event Trigger bağlayarak her Event ID 4625 üretildiğinde anında tetikleyebilirsiniz.
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- Kendi IP'nizi Kilitleme Tehlikesi (Whitelisting): Şirket merkez ofisinin statik IP'sini veya VPN bloğunu asla engellememek için script içine katı bir Beyaz Liste (Whitelist) tanımlanmalıdır.
- RDP Portunu İnternete Açma Hatası: Hiçbir koşulda Windows RDP portunu (3389) doğrudan internete açmayın. Kullanıcılar sunucuya yalnızca SSL VPN veya Azure Virtual Network Gateway arkasından erişmelidir.
Mühendis Notu
Bir sunucuya günde 10.000 başarısız oturum isteği gelmesi, sisteminizin her an şifre kırıcı bir saldırıyla ele geçirilebileceğinin kanıtıdır. Bu basit script saldırganların IP'lerini 5. denemede çöpe atarak sunucunuzun güvenliğini ve performansını korur.
