Windows DNS Güvenlik Sertleştirme Rehberi

DNS sunucunuza bir sabah bakın, logları inceleyin. Yüksek ihtimalle zone transfer denemeleri, recursive query flood’ları veya cache poisoning girişimleri göreceksiniz. Windows DNS Server, kutudan çıktığı haliyle oldukça geniş bir saldırı yüzeyi sunuyor. Microsoft’un varsayılan konfigürasyonu “çalışsın” üzerine kurulu, “güvenli çalışsın” üzerine değil. Bu rehberde bir Windows DNS altyapısını nasıl sertleştireceğinizi, gerçek dünyada karşılaştığım sorunlar ve çözümleriyle birlikte anlatacağım.

Temel DNS Güvenlik Anlayışı

Windows DNS güvenliğine girmeden önce neyi koruduğumuzu netleştirmek lazım. DNS altyapınıza yapılan saldırılar üç ana kategoride toplanıyor:

  • Cache Poisoning: Sahte DNS yanıtlarını önbelleğinize enjekte etme girişimleri
  • Zone Transfer Abuse: Yetkisiz sunucuların tüm zone verisini çekmeye çalışması
  • Amplification/DDoS: DNS sunucunuzu bir amplifikatör olarak kullanma girişimleri
  • Reconnaissance: İç ağ topolojisini haritalamak için DNS sorgulama

Bunların hepsine karşı ayrı önlemler alacağız. Önce ortamınızı tanımanız gerekiyor.

DNS Sunucu Rolünü Denetleyin

Sertleştirmeye başlamadan önce sunucunuzun ne rolde çalıştığını netleştirin:

# Mevcut DNS konfigürasyonunu görüntüle
Get-DnsServer | Select-Object -ExpandProperty ServerSetting

# Forwarder listesini kontrol et
Get-DnsServerForwarder

# Tüm zone'ları listele
Get-DnsServerZone | Format-List ZoneName, ZoneType, IsDsIntegrated, IsReverseLookupZone

Bu çıktıya bakarak sunucunuzun sadece internal recursive resolver mı, authoritative server mı yoksa ikisi birden mi olduğunu anlayabilirsiniz. Bu ayrım son derece kritik çünkü authoritative bir sunucuda recursive query’e hiç gerek yok, tam tersi de geçerli.

Recursive Query Kontrolü

İnternete açık DNS sunucularında recursive query açık bırakmak, sunucunuzu bir amplifikatöre dönüştürür. Internal kullanıcılara servis veriyorsanız, recursive query’i sadece belirli subnet’lere kısıtlamak şart.

# Recursive query'i tamamen devre dışı bırak (sadece authoritative sunucular için)
Set-DnsServerRecursion -Enable $false

# Recursive query aktif kalacaksa timeout değerlerini düşür
Set-DnsServerRecursion -Enable $true `
    -AdditionalTimeout 4 `
    -RetryInterval 3 `
    -Timeout 8 `
    -SecureResponse $true

-SecureResponse $true parametresi burada kritik. Bu ayar aktif olduğunda DNS sunucunuz, yalnızca sorguladığı zone ile ilgili yanıtları kabul eder. Başka bir zone için gelen referans yanıtlarını görmezden gelir. Cache poisoning saldırılarına karşı birinci savunma hattınız bu.

Eğer ortamınızda hem internal hem de external sorgulara hizmet veriyorsanız, split-DNS mimarisine geçmenizi şiddetle tavsiye ederim. İki ayrı DNS sunucusu çok daha temiz bir güvenlik modeli sağlar.

Zone Transfer Güvenliği

Şu ana kadar gördüğüm en yaygın yanlış konfigürasyon zone transfer ayarları. Birçok organizasyonda zone transferi hâlâ “Any” olarak açık bırakılmış durumda. Bu, tüm DNS verinizin herhangi biri tarafından çekilebileceği anlamına geliyor.

# Belirli bir zone'da zone transfer'i sadece belirtilen sunuculara izin ver
Set-DnsServerPrimaryZone -Name "sirket.local" `
    -SecondaryServers "192.168.10.20","192.168.10.21" `
    -SecureSecondaries TransferToSecureServers

# Zone transfer'i tamamen kapat (single-server ortamlar için)
Set-DnsServerPrimaryZone -Name "sirket.local" `
    -SecondaryServers @() `
    -SecureSecondaries NoTransfer

TransferToSecureServers modunda sunucu, yalnızca zone’un NS kayıtlarında listelenen sunuculara transfer izni verir. Ekstra IP listesi belirtmenize gerek yok ama belirtirseniz o liste de kontrol edilir.

Active Directory Integrated zone kullanıyorsanız (kullanmanız gerekiyor, ilerleyen bölümde açıklayacağım) zone transfer zaten AD replikasyonu üzerinden yapılıyor ve bu mekanizma kendi güvenlik katmanlarına sahip. Yine de zone transfer ayarlarını kontrol edin, çakışma olabilir.

DNS Kayıtlarını AD Integrated Zone’a Taşıyın

Standart primary zone kullanıyorsanız ve ortamınızda Active Directory varsa, hemen AD Integrated Zone’a geçin. Bu geçiş;

  • Zone verilerini AD replikasyonuyla şifreli olarak taşır
  • DNSSEC entegrasyonunu kolaylaştırır
  • Zone transfer ihtiyacını ortadan kaldırır
  • Dinamik güncelleme güvenliğini artırır
# Mevcut primary zone'u AD integrated'a çevir
ConvertTo-DnsServerPrimaryZone -Name "sirket.local" `
    -ReplicationScope "Domain" `
    -PassThru

# Yeni AD integrated zone oluştur
Add-DnsServerPrimaryZone -Name "yeni.sirket.local" `
    -ReplicationScope "Forest" `
    -DynamicUpdate "Secure"

-DynamicUpdate "Secure" parametresine dikkat edin. Bu ayar sadece Kerberos ile kimlik doğrulaması yapılmış makinelerin DNS kaydı oluşturmasına izin verir. Bir makine domain’e üye değilse, DNS kaydı oluşturamaz. Ortamınızda domain dışı cihazlar varsa (yazıcılar, IoT cihazlar gibi) bunlar için statik kayıt oluşturmanız gerekecek.

DNS Sunucu Dinleme Arayüzlerini Sınırlandırın

Varsayılan kurulumda Windows DNS, sunucudaki tüm network interface’ler üzerinde dinliyor. Sunucunuzda birden fazla NIC varsa, DNS’in yalnızca gerekli arayüzde dinlemesini sağlayın.

# Mevcut dinleme adreslerini görüntüle
Get-DnsServer | Select-Object -ExpandProperty ServerSetting | `
    Select-Object ListeningIPAddress

# Belirli IP adresleri üzerinde dinle
Set-DnsServer -IPAddress "192.168.1.10","192.168.1.11"

Yönetim trafiği için ayrı bir NIC kullanıyorsanız, DNS servisini yönetim NIC’ine bağlamayın. Sadece kullanıcı segmentine bakan arayüzde dinleyin.

Cache Snooping’i Önleyin

Cache snooping, bir saldırganın DNS sunucunuzun önbelleğini sorgulayarak hangi domainlere erişildiğini anlamasını sağlar. Bu, iç ağda kullanılan servisleri ve iletişim kalıplarını açığa çıkarabilir.

# Maximum cache boyutunu sınırla
Set-DnsServerCache -MaxKBSize 10000

# Cache'in eski kayıtlardan temizlenmesini hızlandır
Set-DnsServerCache -StoreEmptyAuthenticationResponse $false

# Negative caching süresini optimize et
Set-DnsServerCache -MaxNegativeTtl "00:05:00" `
    -MaxTtl "1.00:00:00"

-StoreEmptyAuthenticationResponse $false ile sunucu, “bu domain yok” yanıtlarını önbelleğe almayı bırakır. Bu hem güvenlik hem de DNS flood saldırılarına karşı koruma açısından önemli.

DNS Logging ve Denetim

Tehdit tespiti olmadan güvenlik eksik kalır. Windows DNS Server’ın debug logging özelliğini aktif edin, ama dikkatli olun: tüm trafiği loglamak yüksek I/O yaratır.

# DNS debug logging'i etkinleştir
Set-DnsServerDiagnostics -All $true

# Sadece kritik eventları logla (production için önerilen)
Set-DnsServerDiagnostics `
    -Queries $true `
    -Answers $true `
    -Notifications $true `
    -Update $true `
    -QuestionTransactions $true `
    -UnmatchedResponse $true `
    -SendPackets $false `
    -ReceivePackets $false `
    -TcpInformation $false `
    -UdpInformation $false `
    -LogFilePath "C:DNSLogsdns_debug.log" `
    -MaxMBFileSize 500 `
    -EnableLoggingToFile $true `
    -EnableLoggingForLocalLookupEvent $true `
    -EnableLoggingForPluginDllEvent $true

Log dosyasını sistem sürücüsüne değil, ayrı bir disk veya path’e yönlendirmenizi öneririm. Log dolunca sistem DNS’in durabileceğini unutmayın.

Windows Event Log tarafından da DNS olaylarını izleyebilirsiniz:

# DNS Server event loglarını görüntüle
Get-WinEvent -LogName "DNS Server" -MaxEvents 50 | `
    Where-Object {$_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning"} | `
    Format-List TimeCreated, Id, Message

Event ID 4013 (DNS yüklenemedi), 6702 (zone transfer failed), 4015 (AD DNS zone yüklenemedi) gibi event ID’leri izleme listenize ekleyin.

Response Rate Limiting (RRL) Konfigürasyonu

DNS amplification saldırılarına karşı en etkili önlem Response Rate Limiting. Windows Server 2016 ve üzeri bu özelliği native olarak destekliyor.

# RRL'i etkinleştir ve yapılandır
Set-DnsServerResponseRateLimiting `
    -ResponsesPerSec 5 `
    -ErrorsPerSec 5 `
    -WindowInSec 5 `
    -LeakRate 3 `
    -TruncateRate 2 `
    -MaximumResponsesPerWindow 20 `
    -Mode Enable

# RRL durumunu kontrol et
Get-DnsServerResponseRateLimiting

Parametreleri açıklayayım:

  • ResponsesPerSec: Aynı IP’ye saniyede gönderilecek maksimum yanıt sayısı
  • ErrorsPerSec: Saniyede gönderilecek maksimum hata yanıtı sayısı
  • LeakRate: Kaç yanıtta bir normal yanıt gönderileceği (meşru kullanıcıların tamamen bloke edilmemesi için)
  • TruncateRate: Kaç yanıtta bir truncated yanıt gönderileceği (TCP’ye yönlendirme)
  • WindowInSec: Sayım penceresi

RRL’i devreye almadan önce Mode LogOnly ile test modunda çalıştırın ve meşru kullanıcıların etkilenip etkilenmediğini gözlemleyin.

Socket Pool ve DNS Randomization

DNSSEC kullanmıyorsanız, source port randomization cache poisoning saldırılarını zorlaştıran önemli bir mekanizma.

# DNS Socket Pool boyutunu görüntüle ve artır
dnscmd /info /socketpoolsize

# Registry üzerinden socket pool boyutunu artır (varsayılan 2500)
$regPath = "HKLM:SYSTEMCurrentControlSetServicesDNSParameters"
Set-ItemProperty -Path $regPath -Name "SocketPoolSize" -Value 10000 -Type DWord

# Socket pool excluded ports listesini temizle
Set-ItemProperty -Path $regPath -Name "SocketPoolExcludedPortRanges" -Value "" -Type String

# Değişikliği uygulamak için DNS servisini yeniden başlat
Restart-Service DNS

Socket pool büyüdükçe saldırganın doğru port + doğru transaction ID kombinasyonunu tahmin etmesi zorlaşır. 10.000 soket boyutu makul bir değer, daha fazlasına genellikle gerek yok.

DNSSEC Konfigürasyonu

DNSSEC, DNS yanıtlarının kriptografik olarak imzalanmasını sağlar. Internal zone’lar için bile önemli, özellikle VPN kullanan veya zero-trust yaklaşımı benimseyen organizasyonlar için.

# Zone'a DNSSEC imzalama ekle
Invoke-DnsServerZoneSign -ZoneName "sirket.local" `
    -SignWithDefault $true `
    -Force

# KSK (Key Signing Key) ve ZSK (Zone Signing Key) parametrelerini özelleştir
$kskParam = New-DnsServerSigningScope -PassThru
Add-DnsServerSigningScope -ZoneName "sirket.local" `
    -SigningAlgorithm RsaSha256 `
    -KeyLength 2048

# DNSSEC durumunu kontrol et
Get-DnsServerZone -Name "sirket.local" | `
    Select-Object ZoneName, IsSigned, DnssecMode

DNSSEC’i production’a almadan önce dikkat etmeniz gereken bir kaç şey var. Key rollover süreçlerini planlamanız gerekiyor. KSK’nın süresi dolduğunda ve rollover zamanında yapılmadığında zone’unuz tüm DNSSEC-validating resolverlar tarafından “broken” olarak işaretlenecek ve sorgulara yanıt veremez hale geleceksiniz. Key rollover takvimini mutlaka belgelendirin ve calendar reminder ekleyin.

Güvenli Forwarder Konfigürasyonu

Forwarder olarak ISP DNS’i kullanmak hem gizlilik hem güvenlik açısından riskli. DNS-over-HTTPS veya DNS-over-TLS destekleyen forwarderlar tercih edin.

# Mevcut forwarderları temizle
Set-DnsServerForwarder -IPAddress @() -UseRootHint $false

# Güvenilir forwarder ekle (Cloudflare ve Google DNS over HTTPS destekli IP'ler)
Add-DnsServerForwarder -IPAddress "1.1.1.1","1.0.0.1","8.8.8.8","8.8.4.4" `
    -UseRootHint $true

# Forwarder timeout değerini optimize et
Set-DnsServerForwarder -Timeout 3 -EnableReordering $true

Internal zone’larınız için forwarder kullanmayın. Sadece external DNS çözümlemesi için forwarder devrede olsun. Bunu zone-level forward policy ile ayarlayabilirsiniz.

DNS Güvenlik Duvarı Kuralları

Windows Firewall üzerinde DNS trafiğini granüler olarak kontrol altına alın:

# Sadece yetkili network'lerden gelen DNS sorgularına izin ver
New-NetFirewallRule -DisplayName "DNS - Internal Clients Only" `
    -Direction Inbound `
    -Protocol UDP `
    -LocalPort 53 `
    -RemoteAddress "192.168.0.0/16","10.0.0.0/8" `
    -Action Allow `
    -Profile Domain,Private

New-NetFirewallRule -DisplayName "DNS TCP - Internal Only" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 53 `
    -RemoteAddress "192.168.0.0/16","10.0.0.0/8" `
    -Action Allow `
    -Profile Domain,Private

# Zone transfer portunu ayrıca kısıtla
New-NetFirewallRule -DisplayName "DNS Zone Transfer - Secondary Only" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 53 `
    -RemoteAddress "192.168.10.20","192.168.10.21" `
    -Action Allow `
    -Profile Domain

Firewall kurallarını GPO ile dağıtıyorsanız, “DNS Server” olarak atanmış makinelere apply edecek şekilde WMI filter ekleyin. Her sunucuya tek tek uygulamak hem zahmetli hem de hata prone.

Periyodik Güvenlik Kontrol Scripti

Tüm bu ayarları bir kez yapıp unutmak olmaz. Haftalık çalıştırabileceğiniz bir kontrol scripti:

# DNS Güvenlik Durum Raporu
function Get-DnsSecurityReport {
    $report = @{}
    
    # Recursive query durumu
    $recursion = Get-DnsServerRecursion
    $report["RecursionEnabled"] = $recursion.Enable
    $report["SecureResponse"] = $recursion.SecureResponse
    
    # RRL durumu
    $rrl = Get-DnsServerResponseRateLimiting
    $report["RRLMode"] = $rrl.Mode
    $report["ResponsesPerSec"] = $rrl.ResponsesPerSec
    
    # Zone transfer özeti
    $zones = Get-DnsServerZone | Where-Object {$_.ZoneType -eq "Primary"}
    foreach ($zone in $zones) {
        $report["Zone_$($zone.ZoneName)_Transfer"] = $zone.SecureSecondaries
        $report["Zone_$($zone.ZoneName)_DynUpdate"] = $zone.DynamicUpdate
    }
    
    # DNSSEC durumu
    $signedZones = Get-DnsServerZone | Where-Object {$_.IsSigned -eq $true}
    $report["SignedZoneCount"] = $signedZones.Count
    
    $report | Format-List
}

Get-DnsSecurityReport

Bu scripti Task Scheduler’a ekleyip çıktısını e-posta ile gönderecek şekilde yapılandırın. Drift detection için bir önceki haftanın çıktısıyla karşılaştıran bir versiyonunu da yazabilirsiniz.

Sık Karşılaşılan Sorunlar ve Çözümleri

RRL sonrası meşru kullanıcılar etkileniyor: LeakRate değerini artırın (5-7 arası). Aynı zamanda allowlist ekleyin:

Add-DnsServerResponseRateLimitingExceptionlist `
    -Name "InternalClients" `
    -ClientSubnet "EQ,192.168.0.0/16"

DNSSEC sonrası bazı sorgular başarısız oluyor: DNSSEC’i desteklemeyen forwarder kullanıyor olabilirsiniz. Forwarderlarınızın DNSSEC-aware olduğunu doğrulayın veya root hints’e geçin.

Zone transfer’ı kapattıktan sonra secondary DNS güncellenmiyor: AD Integrated Zone’a geçtiğinizde bu sorun zaten ortadan kalkıyor. Geçiş yapamıyorsanız, secondary sunucu IP’sini açıkça tanımladığınızdan emin olun.

Sonuç

Windows DNS sertleştirmesi tek seferlik bir iş değil, sürekli bakım gerektiren bir süreç. Anlattıklarımı öncelik sırasıyla özetleyeyim:

  • Zone transfer’ı kısıtlayın: En hızlı kazanım, en az riski var
  • Recursive query kontrolü: İnternete açık sunucularda şart
  • AD Integrated Zone’a geçin: Tüm ortam için tek doğru yol
  • RRL aktif edin: Amplification saldırılarına karşı temel koruma
  • Socket pool’u artırın: Basit ama etkili
  • DNSSEC ekleyin: Uzun vadeli yatırım, rollover süreçlerini planlayarak yapın
  • Logging’i yapılandırın: Tehdidi göremediğiniz şeye karşı koyamazsınız

Ortamınız büyüdükçe bu kontrollerin GPO, DSC veya bir configuration management aracı üzerinden merkezileştirilmesi şart olacak. Elle yapılan değişiklikler drift yaratır, drift güvenlik açığı yaratır. Otomasyon, güvenliğin sürdürülebilirliğini sağlayan temel unsurdur.

Bir yanıt yazın

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