Windows Event Log’u Merkezi Sunucuya Gönderme

Onlarca Windows sunucu yönetirken en çok hangi şeyden korkarsınız? Bence çoğunuzun cevabı aynı: “Bir şey oldu, log’lara bakmam lazım ama hangi sunucuya bağlanacağım?” Bu soruyu kendinize sormaya başladığınız an, merkezi log yönetimine geçme zamanınız gelmiş demektir. Ben bu ihtiyacı yaklaşık 15 sunuculu bir ortamda çok acı bir şekilde öğrendim. Bir güvenlik olayı sonrası 6 farklı sunucunun Event Viewer’ını teker teker karıştırmak zorunda kaldım. O geceden sonra Windows Event Forwarding (WEF) kurulumu benim için opsiyonel olmaktan çıktı.

Windows Event Forwarding Nedir ve Neden Önemlidir

Windows Event Forwarding, Microsoft’un kendi bünyesinde geliştirdiği, lisans gerektirmeyen ve Windows Server 2008 R2’den itibaren tüm modern Windows sistemlerinde hazır gelen bir log toplama mekanizmasıdır. WEF’in güzel yanı şu: ek bir agent kurmuyorsunuz, üçüncü parti bir yazılıma bağımlı olmuyorsunuz. WinRM (Windows Remote Management) üzerinden çalışıyor ve merkezi bir kolektör sunucu belirliyorsunuz.

Mimarisi çok basit aslında:

  • Collector (Toplayıcı Sunucu): Diğer sunuculardan log’ları alan merkezi nokta
  • Source (Kaynak Sunucular): Log’larını merkeze gönderen tüm Windows makineler
  • Subscription (Abonelik): Hangi log’ların, nereden, nasıl toplanacağını tanımlayan yapılandırma

İki farklı mod var:

  • Collector-Initiated (Toplayıcı Başlatmalı): Kolektör, kaynak sunuculara bağlanarak log çeker. Küçük ortamlar için uygundur ama kaynak sunuculara erişim yetkisi gerektirir.
  • Source-Initiated (Kaynak Başlatmalı): Kaynak sunucular kolektöre bağlanarak log gönderir. Büyük ortamlarda ve domain üyesi olmayan makineler için tercih edilir. Group Policy ile yönetmek çok daha kolaydır.

Gerçek dünya senaryolarında Source-Initiated modu çok daha yaygın ve yönetilebilir. Özellikle 50+ sunucu ortamlarında bunu kullanmazsanız yönetim kabusu yaşarsınız.

Ön Hazırlık ve Gereksinimler

Kuruluma geçmeden önce ortamınızı kontrol etmeniz gereken birkaç nokta var.

Kolektör sunucuda:

  • Windows Server 2012 R2 veya üzeri (2019/2022 önerilen)
  • Windows Event Collector servisi
  • WinRM aktif

Kaynak sunucularda:

  • WinRM aktif
  • Kolektör sunucuya network erişimi (TCP 5985/HTTP veya TCP 5986/HTTPS)
  • “Event Log Readers” grubuna Network Service hesabının eklenmesi

Domain ortamı için: Group Policy’den toplu konfigürasyon yapabilirsiniz, bu büyük avantaj.

Domain dışı (Workgroup) ortamlar için: Sertifika tabanlı kimlik doğrulama veya lokal hesaplarla da çalışabilir ama biraz daha karmaşık.

Kolektör Sunucuyu Yapılandırma

İlk adım kolektör sunucuyu hazırlamak. Bunu hem GUI’den hem de komut satırından yapabilirsiniz ama komut satırı daha güvenilir ve tekrarlanabilir.

Kolektör sunucuda PowerShell’i yönetici olarak açıp aşağıdaki komutları çalıştırın:

# Windows Event Collector servisini başlatın ve otomatik başlangıca alın
wecutil qc

# Servisi manuel olarak başlatmak isterseniz
sc config wecsvc start=auto
net start wecsvc

wecutil qc komutu size “The service startup mode will be changed to Delay-Start” gibi bir mesaj verecek ve onaylamanızı isteyecektir. “y” diyip geçin.

WinRM’i de etkinleştirmeniz gerekiyor:

# WinRM'i yapılandır ve başlat
winrm quickconfig

# HTTPS kullanmak istiyorsanız listener oluşturun
# Önce sertifikanızın thumbprint'ini bulun
Get-ChildItem Cert:LocalMachineMy

# Ardından HTTPS listener ekleyin
winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="collector.domain.local";CertificateThumbprint="SERTIFIKA_THUMBPRINT"}

Kaynak Sunucularda WinRM Yapılandırması

Her kaynak sunucuda WinRM aktif olmalı ve kolektör sunucuya bağlantı izni verilmiş olmalı. Bunu Group Policy üzerinden yapmak hayatı çok kolaylaştırıyor.

Group Policy’siz (manuel) yapılandırma için kaynak sunucuda:

# WinRM'i aktif et
winrm quickconfig -quiet

# Kolektör sunucuyu trusted hosts listesine ekle (domain dışı ortamlar için)
winrm set winrm/config/client '@{TrustedHosts="collector.domain.local"}'

# Network Service hesabını Event Log Readers grubuna ekle
net localgroup "Event Log Readers" "NT AUTHORITYNetwork Service" /add

Domain ortamında Group Policy ile yapmak için:

Computer Configuration > Policies > Windows Settings > Security Settings > Restricted Groups altında “Event Log Readers” grubuna “Network Service” ekleyebilirsiniz.

Veya Computer Configuration > Policies > Administrative Templates > Windows Components > Windows Remote Management (WinRM) > WinRM Service altında “Allow remote server management through WinRM” politikasını etkinleştirin.

Subscription (Abonelik) Oluşturma

Abonelik oluştururken hangi log’ları toplayacağınızı belirleyen XML filtresi en kritik kısım. Çok geniş filtre yazarsanız kolektör sunucunuz çok hızlı dolabilir. Çok dar yazarsanız önemli olayları kaçırırsınız.

Önce bir XML filtre dosyası oluşturalım. Bu dosyayı C:Subscriptionssecurity_filter.xml olarak kaydedelim:

# Abonelik XML dosyası içeriği - PowerShell ile oluşturun
$xmlContent = @"
<QueryList>
  <Query Id="0">
    <Select Path="Security">
      *[System[(EventID=4624 or EventID=4625 or EventID=4648 or EventID=4720 or EventID=4722 or EventID=4723 or EventID=4724 or EventID=4728 or EventID=4732 or EventID=4756 or EventID=4767 or EventID=4771 or EventID=4776)]]
    </Select>
    <Select Path="System">
      *[System[(Level=1 or Level=2 or Level=3)]]
    </Select>
    <Select Path="Application">
      *[System[(Level=1 or Level=2)]]
    </Select>
  </Query>
</QueryList>
"@

$xmlContent | Out-File -FilePath "C:Subscriptionssecurity_filter.xml" -Encoding UTF8

Bu filtre güvenlik olaylarından en kritik olanları (başarılı/başarısız giriş, hesap yönetimi), sistem log’larından hata ve uyarıları, uygulama log’larından ise sadece kritik hataları topluyor. Ortamınıza göre bu EventID listesini genişletebilirsiniz.

Şimdi aboneliği oluşturalım:

# Source-Initiated abonelik için XML şablonu
$subscriptionXML = @"
<Subscription xmlns="http://schemas.microsoft.com/2006/03/windows/events/subscription">
  <SubscriptionId>SecurityLogs-AllServers</SubscriptionId>
  <SubscriptionType>SourceInitiated</SubscriptionType>
  <Description>Tum sunuculardan guvenlik ve sistem log toplama</Description>
  <Enabled>true</Enabled>
  <Uri>http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog</Uri>
  <ConfigurationMode>Custom</ConfigurationMode>
  <Delivery Mode="Push">
    <Batching>
      <MaxItems>20</MaxItems>
      <MaxLatencyTime>900000</MaxLatencyTime>
    </Delivery>
  </Delivery>
  <Query>
    <![CDATA[
      <QueryList>
        <Query Id="0">
          <Select Path="Security">*[System[(EventID=4624 or EventID=4625 or EventID=4648)]]</Select>
          <Select Path="System">*[System[(Level=1 or Level=2 or Level=3)]]</Select>
        </Query>
      </QueryList>
    ]]>
  </Query>
  <ReadExistingEvents>false</ReadExistingEvents>
  <TransportName>HTTP</TransportName>
  <ContentFormat>RenderedText</ContentFormat>
  <Locale Language="tr-TR"/>
  <LogFile>ForwardedEvents</ForwardedEvents>
  <AllowedSourceDomainComputers>O:NSG:NSD:(A;;GA;;;DC)(A;;GA;;;NS)</AllowedSourceDomainComputers>
</Subscription>
"@

$subscriptionXML | Out-File -FilePath "C:Subscriptionssubscription.xml" -Encoding UTF8

# Aboneliği oluştur
wecutil cs "C:Subscriptionssubscription.xml"

Aboneliği oluşturduktan sonra durumunu kontrol edin:

# Tüm abonelikleri listele
wecutil es

# Belirli bir aboneliğin detaylarını gör
wecutil gs SecurityLogs-AllServers

# Abonelik çalışma durumunu kontrol et
wecutil gr SecurityLogs-AllServers

Group Policy ile Kaynak Sunucuları Otomatik Yapılandırma

Ortamınızda 10’dan fazla sunucu varsa GPO kullanmak neredeyse zorunlu. Her sunucuya tek tek girmek hem zaman kaybı hem de hata riski.

Computer Configuration > Policies > Administrative Templates > Windows Components > Event Forwarding altında “Configure the target Subscription Manager” politikasını etkinleştirip şu değeri girin:

# GPO'da kullanacağınız Subscription Manager değeri (HTTP için)
Server=http://collector.domain.local:5985/wsman/SubscriptionManager/WEC,Refresh=60

# HTTPS için
Server=https://collector.domain.local:5986/wsman/SubscriptionManager/WEC,Refresh=60,IssuerCA=SERTIFIKA_THUMBPRINT

Buradaki Refresh=60 değeri, kaynak sunucunun kolektörü her 60 saniyede bir kontrol ettiği anlamına gelir. Üretim ortamı için 300-600 saniye daha mantıklı olabilir.

GPO uygulandıktan sonra kaynak sunucularda politikayı hemen tetiklemek için:

# Kaynak sunucuda çalıştırın
gpupdate /force

# WinRM servisini yeniden başlatın
Restart-Service WinRM

Forwarded Events Log’larını Yönetme

Kolektör sunucuda toplanan log’lar varsayılan olarak “Forwarded Events” kanalına yazılır. Bu kanalın boyutunu ve davranışını düzenlemeniz şart, aksi takdirde eski log’lar silinmeye başlar.

# Forwarded Events kanalının mevcut boyutunu kontrol et
wevtutil gl ForwardedEvents

# Log boyutunu 4 GB'a çıkar (maximum log size bytes cinsinden)
wevtutil sl ForwardedEvents /ms:4294967296

# Log'ların üzerine yazılması yerine arşivlenmesini sağla
wevtutil sl ForwardedEvents /rt:true /ab:true

# Log'u belirli bir dizine arşivle
wevtutil al ForwardedEvents "C:EventLogsArchive"

Arşivleme için otomatik bir PowerShell scripti hazırlamak iyi bir fikir:

# Log arşivleme scripti - Görev Zamanlayıcı'ya ekleyin
$archivePath = "D:EventLogArchive"
$date = Get-Date -Format "yyyy-MM-dd"
$archiveFile = "$archivePathForwardedEvents_$date.evtx"

# Dizin yoksa oluştur
if (-not (Test-Path $archivePath)) {
    New-Item -ItemType Directory -Path $archivePath -Force
}

# Mevcut log'u arşivle ve temizle
wevtutil epl ForwardedEvents $archiveFile
wevtutil cl ForwardedEvents

# 90 günden eski arşivleri temizle
Get-ChildItem -Path $archivePath -Filter "*.evtx" | 
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | 
    Remove-Item -Force

Write-EventLog -LogName Application -Source "EventLogArchiver" -EventId 1000 -EntryType Information -Message "ForwardedEvents basariyla arsivlendi: $archiveFile"

Sorun Giderme

WEF kurulumu bazen ilk seferinde tam olarak çalışmayabilir. En sık karşılaştığım sorunlar ve çözümleri:

Kaynak sunucu kolektöre bağlanamıyor:

# Kolektör sunucudan kaynak sunucuya bağlantıyı test edin
Test-NetConnection -ComputerName source-server -Port 5985

# WinRM bağlantısını test edin
Test-WSMan -ComputerName source-server

# Firewall kurallarını kontrol edin
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*Remote*" -and $_.Enabled -eq "True"}

# WinRM için firewall kuralı ekleyin (kaynak sunucuda)
netsh advfirewall firewall add rule name="WinRM HTTP" dir=in action=allow protocol=TCP localport=5985

Abonelik çalışıyor ama log gelmiyor:

# Abonelik çalışma zamanı hatalarını kontrol edin
wecutil gr SecurityLogs-AllServers

# Microsoft-Windows-Eventlog-ForwardingPlugin/Operational kanalını kontrol edin
# (Kaynak sunucuda çalıştırın)
Get-WinEvent -LogName "Microsoft-Windows-Eventlog-ForwardingPlugin/Operational" -MaxEvents 20 | 
    Format-List TimeCreated, Id, LevelDisplayName, Message

# Event Log okuma yetkilerini doğrulayın
$acl = Get-Acl "HKLM:SYSTEMCurrentControlSetServicesEventLogSecurity"
$acl.Access | Format-Table IdentityReference, AccessControlType, RegistryRights

Performans sorunları yaşıyorsanız:

Kolektör sunucu çok fazla kaynak sunucudan log toplarken CPU ve memory kullanımı artabilir. Aboneliği birden fazla aboneliğe bölmek ve farklı kolektör sunucular kullanmak bu sorunu çözer. Microsoft’un önerisi bir kolektör sunucu için maksimum 2000-3000 kaynak sunucu, yani gerçekçi senaryolarda 500-1000 sunucu üstüne çıkmamak daha sağlıklı.

ELK Stack veya Splunk ile Entegrasyon

WEF ile topladığınız log’ları Forwarded Events kanalında bırakmak yeterli değil, bir log analiz platformuyla entegre etmek asıl değeri ortaya çıkarıyor. Winlogbeat kullanarak ELK Stack’e göndermek en yaygın yöntem:

# Winlogbeat yapılandırması (winlogbeat.yml)
winlogbeat.event_logs:
  - name: ForwardedEvents
    tags: [forwarded]
    processors:
      - script:
          lang: javascript
          id: security
          file: ${path.home}/module/security/config/winlogbeat-security.js

output.elasticsearch:
  hosts: ["elasticsearch.domain.local:9200"]
  index: "winlogbeat-%{[agent.version]}-%{+yyyy.MM.dd}"

# Winlogbeat'i servis olarak kur ve başlat
.winlogbeat.exe install
Start-Service winlogbeat

Splunk kullanıyorsanız Splunk Universal Forwarder aynı şekilde Forwarded Events kanalını okuyabilir. Yapılandırması daha da basit.

Güvenlik Önerileri

Merkezi log sistemini kurarken güvenliği de göz ardı etmeyin:

  • HTTPS kullanın: Üretim ortamında HTTP yerine mutlaka HTTPS/5986 kullanın. Log trafiği şifrelenmeden geçerse ortadaki adam saldırılarına açık olursunuz.
  • Log’ları salt okunur tut: Kolektör sunucuya erişimi kısıtlayın. Log’ların değiştirilmesi forensic değerlerini sıfırlar.
  • Kolektör sunucuyu izole edin: Kolektör sunucu üzerinde başka servis çalıştırmayın.
  • Log erişim yetkilerini gözden geçirin: Herkes ForwardedEvents kanalını okuyabilmemeli.
  • İki kopyada saklayın: Log’ları hem kolektör üzerinde hem de ayrı bir storage’a taşıyın.
# ForwardedEvents kanalına erişim yetkilerini kısıtlayın
$sddl = "O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x1;;;S-1-5-32-573)"
wevtutil sl ForwardedEvents /ca:$sddl

Sonuç

Windows Event Forwarding kurulumu ilk bakışta karmaşık görünebilir ama adım adım gittiğinizde birkaç saatte tamamlanabilir bir iş. Yatırım yaptığınız sürenin karşılığını ilk ciddi olayda fazlasıyla alırsınız.

Özetlemek gerekirse önce kolektör sunucuyu hazırlayın, WinRM ve WEC servislerini aktif edin. Ardından GPO ile tüm kaynak sunucuları kolektöre yönlendirin. İhtiyacınıza özel bir filtre XML’i hazırlayıp aboneliği oluşturun. Son adım olarak da toplanan log’ları ELK, Splunk veya SIEM sisteminize besleyin.

Kendi deneyimimden bir tavsiye: başlangıçta sadece güvenlik log’larından kritik EventID’leri toplayın. Zamanla nelere ihtiyaç duyduğunuzu öğrendikçe filtrenizi genişletirsiniz. Hemen her şeyi toplamaya çalışmak hem depolama sorununa hem de log’ların içinde kaybolmanıza neden olur. İyi tasarlanmış bir WEF altyapısı, hem güvenlik olaylarına hızlı müdahale etmenizi sağlar hem de uyumluluk gereksinimlerini karşılamanıza yardımcı olur.

Bir yanıt yazın

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