Sistem/DevOps•8 dk okuma

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

Dışarıya açık RDP veya VPN portlarına yönelik parola deneme (Brute-Force) saldırılarını Windows Security Event Log'dan saniyeler içinde yakalayıp saldırganın IP'sini güvenlik duvarına engelleyen PowerShell savunma botu.

AE

Ahmet Ertekin

15 July 2023

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

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ış) veya 0xC0000064 (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_Saldirganlar kuralı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.