Windows Firewall Advanced Security ile Gelişmiş Kural Yönetimi

Windows ortamlarında güvenlik duvarı yönetimi, birçok sysadmin’in “zaten açık, çalışıyor” deyip geçtiği ama aslında içinde ciddi bir derinlik barındıran bir konu. Windows Firewall with Advanced Security (WFAS), basit GUI’nin çok ötesinde, granüler kural tanımlamaları, bağlantı güvenliği kuralları ve merkezi yönetim imkanı sunan güçlü bir araç. Bu yazıda hem GUI tarafını hem de PowerShell ile komut satırı yönetimini ele alacağız, gerçek dünya senaryolarıyla da pekiştireceğiz.

Windows Firewall Advanced Security Nedir ve Neden Önemlidir

Klasik Windows Güvenlik Duvarı sadece basit port açma/kapatma işleri için yeterliydi. Ama kurumsal ortamlarda işler bu kadar basit gitmiyor. Bir uygulama sunucunuzun sadece belirli IP bloklarından gelen trafiği kabul etmesini, belirli servislerin sadece domain profilde çalışmasını ya da IPsec ile şifrelenmiş bağlantılara izin vermenizi istiyorsunuz. İşte WFAS tam da bu senaryolar için var.

Windows Firewall with Advanced Security üç temel profil üzerinde çalışır:

  • Domain Profili: Makine domain’e bağlıyken aktif olan profil
  • Private Profil: Ev veya iç ağ olarak işaretlenmiş ağlarda kullanılan profil
  • Public Profil: Açık ağlarda (kafe, havalimanı vb.) devreye giren, en kısıtlayıcı profil

Bir kural yazarken hangi profil için yazdığınızı bilmek kritik. Çoğu kurumsal sysadmin sadece Domain profiline odaklanır ama laptop’lar VPN dışında çalışırken Public profil devreye giriyor, bu profili boş bırakmak ciddi güvenlik açıkları yaratabilir.

PowerShell ile Firewall Yönetimine Giriş

GUI her zaman pratik değil, özellikle onlarca sunucuyu yönetirken. PowerShell’deki NetSecurity modülü firewall yönetiminde temel aracınız olacak.

Önce mevcut durumu görelim:

# Firewall profillerinin durumunu kontrol et
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction

# Tüm aktif kuralları listele
Get-NetFirewallRule | Where-Object {$_.Enabled -eq 'True'} | Select-Object DisplayName, Direction, Action, Profile

Belirli bir port için kural sorgulamak istiyorsanız:

# 443 portuna ait kuralları bul
Get-NetFirewallRule | Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq '443'} | 
    ForEach-Object {
        $rule = $_ | Get-NetFirewallRule
        [PSCustomObject]@{
            RuleName = $rule.DisplayName
            Protocol = $_.Protocol
            LocalPort = $_.LocalPort
            Direction = $rule.Direction
            Action = $rule.Action
            Enabled = $rule.Enabled
        }
    }

Temel Kural Oluşturma Senaryoları

Senaryo 1: Web Sunucusu için Gelen Trafiği Kısıtlama

Diyelim ki bir IIS sunucunuz var ve sadece belirli bir IP aralığından gelen HTTP/HTTPS trafiğini kabul etmek istiyorsunuz. Örneğin kurumunuzun yük dengeleyicisi 10.10.1.0/24 bloğunda:

# Sadece load balancer subnet'inden gelen HTTP trafiğine izin ver
New-NetFirewallRule `
    -DisplayName "IIS - Load Balancer HTTP Inbound" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -RemoteAddress "10.10.1.0/24" `
    -Action Allow `
    -Profile Domain `
    -Description "LB subnetinden gelen HTTP isteklerine izin verir" `
    -Enabled True

# HTTPS için aynı işlemi yap
New-NetFirewallRule `
    -DisplayName "IIS - Load Balancer HTTPS Inbound" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 443 `
    -RemoteAddress "10.10.1.0/24" `
    -Action Allow `
    -Profile Domain `
    -Description "LB subnetinden gelen HTTPS isteklerine izin verir" `
    -Enabled True

# Diğer kaynaklardan gelen HTTP/HTTPS'i engelle
New-NetFirewallRule `
    -DisplayName "IIS - Block Direct HTTP Access" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort @(80, 443) `
    -Action Block `
    -Profile Domain `
    -Enabled True

Önemli not: Windows Firewall kurallarında öncelik sırası, daha spesifik “Allow” kuralları genel “Block” kurallarının önünde gelir. Bu nedenle yukarıdaki örnekte önce izin kuralı, sonra engelleme kuralı sırasıyla eklenmiştir.

Senaryo 2: Belirli Bir Uygulama için Program Bazlı Kural

Sadece port değil, belirli bir executable için kural oluşturmak çok daha güvenli bir yaklaşım. Mesela bir monitoring agent’ın sadece kendi portunda konuşmasını garanti altına almak:

# Sadece belirli executable'a izin ver
New-NetFirewallRule `
    -DisplayName "Monitoring Agent - Zabbix" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 10050 `
    -Program "C:Program FilesZabbix Agentzabbix_agentd.exe" `
    -Action Allow `
    -Profile Domain `
    -Enabled True

# Giden bağlantı için de kural ekle (Zabbix passive check senaryosunda gereksiz ama active için lazım)
New-NetFirewallRule `
    -DisplayName "Monitoring Agent - Zabbix Outbound" `
    -Direction Outbound `
    -Protocol TCP `
    -RemotePort 10051 `
    -Program "C:Program FilesZabbix Agentzabbix_agentd.exe" `
    -Action Allow `
    -Profile Domain `
    -Enabled True

Mevcut Kuralları Yönetme ve Güncelleme

Kural oluşturdunuz ama artık değiştirmeniz gerekiyor. Set-NetFirewallRule bu iş için:

# Mevcut kuralı bul ve remote address'i güncelle
Set-NetFirewallRule `
    -DisplayName "IIS - Load Balancer HTTP Inbound" `
    -RemoteAddress @("10.10.1.0/24", "10.10.2.0/24")

# Birden fazla kuralı aynı anda devre dışı bırak (örnek: maintenance penceresi)
Get-NetFirewallRule -DisplayName "IIS*" | Set-NetFirewallRule -Enabled False

# Kuralı tamamen sil
Remove-NetFirewallRule -DisplayName "IIS - Block Direct HTTP Access"

# Kural grubuna göre toplu işlem
Get-NetFirewallRule -Group "Remote Desktop" | 
    Set-NetFirewallRule -Profile Domain -Enabled True

Kural Dışa/İçe Aktarma

Bir sunucuda hazırladığınız kuralları diğer sunuculara taşımak için export/import kullanabilirsiniz. Bu özellikle yeni sunucu kurulumlarında hayat kurtarır:

# Tüm firewall konfigürasyonunu dışa aktar
netsh advfirewall export "C:Backupfirewall_config.wfw"

# Başka bir sunucuya aktar
netsh advfirewall import "C:Backupfirewall_config.wfw"

# Sadece belirli kuralları PowerShell ile aktar (daha granüler kontrol)
$rules = Get-NetFirewallRule -DisplayName "IIS*"
$rules | Export-Clixml -Path "C:Backupiis_firewall_rules.xml"

Gelişmiş Özellikler: Bağlantı Güvenliği Kuralları

WFAS’ın en az bilinen ama en güçlü özelliklerinden biri bağlantı güvenliği kuralları (Connection Security Rules). Bu kurallar IPsec’i devreye sokarak iki nokta arasındaki trafiği şifrelemenizi ve kimlik doğrulamanızı sağlar.

Gerçek Dünya Senaryosu: Sunucular Arası Şifreli İletişim

Veritabanı sunucusu ile uygulama sunucusu arasındaki SQL trafiğini şifrelemek istiyorsunuz ama SSL sertifikaları ayarlamak istemiyorsunuz. IPsec bağlantı güvenliği kuralı bu durumda ideal:

# Uygulama sunucusunda (10.10.5.10) çalıştırın
# DB sunucusuna (10.10.5.20) giden trafiği şifrele ve doğrula
New-NetIPsecRule `
    -DisplayName "AppServer to DBServer - Encrypted SQL" `
    -InboundSecurity Require `
    -OutboundSecurity Require `
    -RemoteAddress "10.10.5.20" `
    -Protocol TCP `
    -LocalPort Any `
    -RemotePort 1433 `
    -KeyModule IKEv2 `
    -AuthenticationMethod MachineCertificate

# Aynı kuralı DB sunucusunda da oluşturun (10.10.5.20)
New-NetIPsecRule `
    -DisplayName "DBServer from AppServer - Encrypted SQL" `
    -InboundSecurity Require `
    -OutboundSecurity Require `
    -RemoteAddress "10.10.5.10" `
    -Protocol TCP `
    -LocalPort 1433 `
    -RemotePort Any `
    -KeyModule IKEv2 `
    -AuthenticationMethod MachineCertificate

Bu kural sayesinde 1433 portuna gelen/giden tüm trafik IPsec ile şifrelenir ve sadece sertifika doğrulamasından geçen makineler bağlanabilir.

Group Policy ile Merkezi Firewall Yönetimi

Onlarca, yüzlerce Windows sunucunuzu tek tek yapılandırmak yerine Group Policy Object (GPO) kullanmak çok daha ölçeklenebilir. GPO ile merkezi firewall politikası dağıtmak şöyle yapılır:

GPO yolu: Computer Configuration > Windows Settings > Security Settings > Windows Defender Firewall with Advanced Security

PowerShell üzerinden domain genelinde bir audit yapmak için:

# Tüm domain sunucularda belirli bir kuralın varlığını kontrol et
$computers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} | Select-Object -ExpandProperty Name

foreach ($computer in $computers) {
    try {
        $rule = Invoke-Command -ComputerName $computer -ScriptBlock {
            Get-NetFirewallRule -DisplayName "IIS - Load Balancer HTTP Inbound" -ErrorAction SilentlyContinue
        }
        
        if ($rule) {
            Write-Host "$computer : Kural mevcut - $($rule.Enabled)" -ForegroundColor Green
        } else {
            Write-Host "$computer : Kural BULUNAMADI" -ForegroundColor Red
        }
    } catch {
        Write-Host "$computer : Bağlantı hatası" -ForegroundColor Yellow
    }
}

Firewall Loglarını Analiz Etme

Firewall kuralları oluşturdunuz, ama ne kadar etkili? Log analizi olmadan kör uçuyorsunuz demektir. Önce loglama aktif edilmeli:

# Domain profili için loglama ayarları
Set-NetFirewallProfile -Profile Domain `
    -LogFileName "C:WindowsSystem32LogFilesFirewallpfirewall.log" `
    -LogMaxSizeKilobytes 32767 `
    -LogBlocked True `
    -LogAllowed True

# Log dosyasını PowerShell ile analiz et
$logPath = "C:WindowsSystem32LogFilesFirewallpfirewall.log"

# Son 1 saatte engellenen bağlantıları listele
$oneHourAgo = (Get-Date).AddHours(-1)

Get-Content $logPath | Where-Object {$_ -match "DROP"} | ForEach-Object {
    $fields = $_ -split " "
    if ($fields.Count -gt 5) {
        [PSCustomObject]@{
            DateTime = "$($fields[0]) $($fields[1])"
            Action = $fields[2]
            Protocol = $fields[3]
            SourceIP = $fields[4]
            DestIP = $fields[5]
            SourcePort = $fields[6]
            DestPort = $fields[7]
        }
    }
} | Where-Object {$_.DateTime -gt $oneHourAgo} | 
    Group-Object SourceIP | 
    Sort-Object Count -Descending | 
    Select-Object Count, Name | 
    Format-Table -AutoSize

Bu komut, son bir saatte en çok engelleme yiyen kaynak IP’leri gösterir. Eğer bir IP sürekli engelleme alıyorsa ya yanlış yapılandırma var ya da potansiyel bir saldırı söz konusu.

Güvenlik Açığı Tespiti ve Hardening

Varsayılan Windows kurulumunda açık olan bazı kurallar gereksiz saldırı yüzeyi yaratır. Bunları temizlemek iyi bir hardening adımıdır:

# Gereksiz veya tehlikeli varsayılan kuralları devre dışı bırak
$rulesToDisable = @(
    "File and Printer Sharing*",
    "Network Discovery*",
    "Remote Assistance*"
)

foreach ($rulePattern in $rulesToDisable) {
    $rules = Get-NetFirewallRule -DisplayName $rulePattern -ErrorAction SilentlyContinue
    if ($rules) {
        $rules | Set-NetFirewallRule -Enabled False
        Write-Host "$rulePattern devre dışı bırakıldı" -ForegroundColor Yellow
    }
}

# Sadece gerçekten ihtiyaç duyulan RDP'ye izin ver (sadece jump server'dan)
$existingRDP = Get-NetFirewallRule -DisplayName "Remote Desktop*" -ErrorAction SilentlyContinue
if ($existingRDP) {
    $existingRDP | Set-NetFirewallRule -Enabled False
}

New-NetFirewallRule `
    -DisplayName "RDP - Jump Server Only" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 3389 `
    -RemoteAddress "10.10.0.5" `
    -Action Allow `
    -Profile Domain `
    -Enabled True

Troubleshooting: Firewall Kuralları Neden Çalışmıyor

Kural yazdınız ama trafik hala geçiyor ya da bloklanıyor. Klasik sorunlar ve çözümleri:

Problem 1: Kural doğru profil için değil

Sunucu Domain’e bağlı olmasına rağmen kural Public profil için tanımlanmış olabilir. Profil kontrolü:

# Aktif ağ profili nedir?
Get-NetConnectionProfile | Select-Object InterfaceAlias, NetworkCategory, IPv4Connectivity

# Kuralı doğru profile ata
Set-NetFirewallRule -DisplayName "IIS - Load Balancer HTTP Inbound" -Profile Domain, Private

Problem 2: Kurallar çakışıyor

Windows Firewall öncelik sırası kafanızı karıştırabilir. Genel kural şu:

  • Block kuralı, Allow kuralına göre önceliklidir (IPsec bypass haricinde)
  • Daha spesifik kural, genel kuralı ezmez, her ikisi de değerlendirilir

Hangi kuralın eşleştiğini anlamak için firewall diagnostics:

# netsh ile mevcut tüm inbound kuralları göster ve filtrele
netsh advfirewall firewall show rule name=all dir=in verbose | 
    Select-String -Pattern "Rule Name|Enabled|Action|LocalPort" -Context 0,1

Problem 3: Windows Defender Firewall servisi durmuş

# Servis durumunu kontrol et
Get-Service -Name "mpssvc" | Select-Object Name, Status, StartType

# Başlat ve otomatik yap
Set-Service -Name "mpssvc" -StartupType Automatic
Start-Service -Name "mpssvc"

Otomatizasyon: Yeni Sunucu Kurulumunda Firewall Baseline

Her yeni sunucu kurulumunda uygulanacak temel firewall kurallarını bir script haline getirmek tutarlılık sağlar:

# baseline_firewall.ps1
param(
    [string]$ServerRole = "Generic",
    [string]$ManagementSubnet = "10.10.0.0/24",
    [string]$MonitoringServer = "10.10.0.10"
)

Write-Host "Firewall baseline uygulanıyor - Rol: $ServerRole" -ForegroundColor Cyan

# Tüm profillerde default deny inbound
Set-NetFirewallProfile -Profile Domain,Private,Public -DefaultInboundAction Block -DefaultOutboundAction Allow

# Temel yönetim kuralları
New-NetFirewallRule -DisplayName "MGMT - RDP Inbound" -Direction Inbound `
    -Protocol TCP -LocalPort 3389 -RemoteAddress $ManagementSubnet `
    -Action Allow -Profile Domain -Enabled True

New-NetFirewallRule -DisplayName "MGMT - WinRM Inbound" -Direction Inbound `
    -Protocol TCP -LocalPort @(5985,5986) -RemoteAddress $ManagementSubnet `
    -Action Allow -Profile Domain -Enabled True

# Monitoring
New-NetFirewallRule -DisplayName "MON - Zabbix Agent Inbound" -Direction Inbound `
    -Protocol TCP -LocalPort 10050 -RemoteAddress $MonitoringServer `
    -Action Allow -Profile Domain -Enabled True

# Rol bazlı kurallar
switch ($ServerRole) {
    "WebServer" {
        New-NetFirewallRule -DisplayName "WEB - HTTP Inbound" -Direction Inbound `
            -Protocol TCP -LocalPort 80 -Action Allow -Profile Domain -Enabled True
        New-NetFirewallRule -DisplayName "WEB - HTTPS Inbound" -Direction Inbound `
            -Protocol TCP -LocalPort 443 -Action Allow -Profile Domain -Enabled True
    }
    "SQLServer" {
        New-NetFirewallRule -DisplayName "SQL - SQL Server Inbound" -Direction Inbound `
            -Protocol TCP -LocalPort 1433 -RemoteAddress $ManagementSubnet `
            -Action Allow -Profile Domain -Enabled True
    }
}

Write-Host "Baseline başarıyla uygulandı." -ForegroundColor Green

Bu scripti çalıştırmak için:

# Web sunucusu için
.baseline_firewall.ps1 -ServerRole "WebServer" -ManagementSubnet "10.10.0.0/24"

# SQL sunucusu için
.baseline_firewall.ps1 -ServerRole "SQLServer" -ManagementSubnet "10.10.5.0/24"

Sonuç

Windows Firewall with Advanced Security, doğru kullanıldığında kurumsal ortamda ciddi bir güvenlik katmanı oluşturuyor. En sık yapılan hata, varsayılan kuralları olduğu gibi bırakıp üstüne yeni kurallar yığmak. Bu zamanla yönetilmesi imkansız, anlaşılmaz bir kural listesi yaratıyor.

İyi bir firewall yönetimi için şu prensipleri benimseyin:

  • Default Deny Inbound yaklaşımını temel alın, sadece gereken portları açın
  • Kural açıklamalarını detaylı yazın, altı ay sonra kim yazdı ne amaçla sorusunu cevaplayabilin
  • Tüm kuralları script olarak belgelendirin, GPO veya Ansible/PowerShell DSC ile deploy edin
  • Log analizini rutin haline getirin, engellenen trafik size önemli bilgiler veriyor
  • Sunucu rolüne göre standart baseline kuralları oluşturun ve tutarlı uygulayın
  • Değişiklikleri test ortamında deneyin, üretimde direkt uygulamak sizi zor durumda bırakabilir

Firewall yönetimi tek seferlik bir iş değil, sürekli güncellenmesi gereken yaşayan bir konfigürasyon. Uygulamalar değiştikçe, ağ topolojisi evriştikçe kurallarınızı da gözden geçirmeyi alışkanlık haline getirin.

Bir yanıt yazın

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