Windows DNS’te DNSSEC Yapılandırması ve Yönetimi

Kurumsal ağlarda DNS güvenliği hâlâ en çok göz ardı edilen konulardan biri. Bir Active Directory ortamında DNS zehirlenmesi yaşadıktan sonra DNSSEC’i ciddiye almaya başlayan birçok sysadmin tanıdım. Bu yazıda Windows DNS sunucusunda DNSSEC yapılandırmasını, zone imzalamadan anahtar yönetimine kadar gerçek dünyada karşılaştığım senaryolarla aktaracağım.

DNSSEC Nedir ve Windows DNS’te Neden Önemlidir

DNSSEC (Domain Name System Security Extensions), DNS sorgularının bütünlüğünü ve özgünlüğünü kriptografik imzalar aracılığıyla doğrulayan bir protokol setidir. Temel olarak iki şeyi garanti eder: DNS yanıtının gerçekten o zone’un sahibinden geldiğini ve iletim sırasında değiştirilmediğini.

Windows Server 2012 ile birlikte Microsoft, DNSSEC desteğini ciddi ölçüde geliştirdi. Bugün Windows Server 2019 ve 2022 üzerinde hem inline zone signing hem de offline signing senaryolarını destekleyebiliyorsunuz. Active Directory entegre zone’larda DNSSEC kullanmak, özellikle DNS Kayıt Sahteciliği (DNS Spoofing) ve Ortadaki Adam (MITM) saldırılarına karşı güçlü bir savunma katmanı ekler.

Pratik bir not: İç ağ zone’larında bile DNSSEC işe yarar. “Zaten kimse dışarıdan sorgulayamıyor” mantığı, içeriden gelen saldırıları görmezden gelir. Bir iç kullanıcının veya kötü amaçlı yazılımın DNS yanıtlarını manipüle etmesi senaryosu düşündüğünüzden daha yaygın.

Ön Hazırlık ve Gereksinimler

DNSSEC yapılandırmasına başlamadan önce ortamınızı hazırlamanız gerekiyor. Windows DNS sunucunuzun rolünü ve zone türünü doğrulayın.

# DNS sunucu rolü ve zone listesini kontrol et
Get-WindowsFeature -Name DNS
Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsSigned, IsReverseLookupZone

Zone’unuzun Active Directory entegre mi yoksa dosya tabanlı mı olduğunu bilmek kritik. AD entegre zone’larda DNSSEC meta verileri, AD replikasyonuyla otomatik dağıtılır. Dosya tabanlı zone’larda ise imzalı zone dosyasını manuel olarak yönetmeniz gerekir.

Ortamınızda birden fazla DNS sunucusu varsa, tüm sunucuların zone verisini alabildiğini doğrulayın:

# Tüm DNS sunucularının zone transfer durumunu kontrol et
$ZoneName = "sirketiniz.local"
Get-DnsServerZoneTransferPolicy -ZoneName $ZoneName
Get-DnsServerZone -Name $ZoneName | Select-Object -ExpandProperty SecondaryServers

Önemli not: Windows Server 2008 veya daha eski bir sunucunuz zone’un secondary’siyse, DNSSEC imzalı zone’u anlayamaz. Önce tüm secondary sunucularınızı en az Server 2012’ye yükseltin.

Zone İmzalama: Adım Adım Yapılandırma

PowerShell ile Zone İmzalama

DNS Manager GUI’si kullanışlı olsa da, otomasyon ve tekrarlanabilirlik açısından PowerShell tercih etmelisiniz. Özellikle birden fazla zone’u imzalamanız gerektiğinde GUI ile uğraşmak zaman kaybı.

# DNSSEC zone imzalama - KSK ve ZSK parametreleriyle
$ZoneName = "sirketiniz.local"

Invoke-DnsServerZoneSign -ZoneName $ZoneName `
    -SignWithDefault `
    -Force

# İmzalama durumunu doğrula
Get-DnsServerZone -Name $ZoneName | Select-Object ZoneName, IsSigned

-SignWithDefault parametresi, Microsoft’un önerdiği varsayılan algoritma ve anahtar uzunluklarını kullanır. Bu, RSA/SHA-256 ile 2048-bit KSK (Key Signing Key) ve 1024-bit ZSK (Zone Signing Key) anlamına gelir. Çoğu kurumsal ortam için bu değerler yeterlidir.

Özel Parametre Setiyle İmzalama

Güvenlik politikalarınız daha güçlü kriptografi gerektiriyorsa veya belirli standartlara (örneğin FIPS 140-2) uyum sağlamanız gerekiyorsa, parametreleri özelleştirin:

# Özel kriptografi parametreleriyle zone imzalama
$ZoneName = "guvenli.sirketiniz.local"
$KskParam = New-DnsServerSigningScope -KeyType KeySigningKey `
    -CryptoAlgorithm RsaSha256 `
    -KeyLength 4096 `
    -DnsKeyRecordTtl 3600 `
    -InitialRolloverOffset (New-TimeSpan -Hours 3) `
    -RolloverPeriod (New-TimeSpan -Days 365)

$ZskParam = New-DnsServerSigningScope -KeyType ZoneSigningKey `
    -CryptoAlgorithm RsaSha256 `
    -KeyLength 2048 `
    -DnsKeyRecordTtl 3600 `
    -RolloverPeriod (New-TimeSpan -Days 90)

Add-DnsServerSigningKey -ZoneName $ZoneName -KeyType KeySigningKey `
    -CryptoAlgorithm RsaSha256 -KeyLength 4096
    
Add-DnsServerSigningKey -ZoneName $ZoneName -KeyType ZoneSigningKey `
    -CryptoAlgorithm RsaSha256 -KeyLength 2048

İmzalama Durumunu Doğrulama

Zone’u imzaladıktan sonra DNSSEC kayıtlarının oluştuğunu kontrol edin:

# DNSSEC kayıtlarını listele
Resolve-DnsName -Name $ZoneName -Type DNSKEY -Server localhost
Resolve-DnsName -Name $ZoneName -Type DS -Server localhost

# RRSIG kayıtlarının varlığını kontrol et
$TestRecord = "fileserver." + $ZoneName
Resolve-DnsName -Name $TestRecord -Type A -Server localhost -DnssecOk

Anahtar Yönetimi ve Rollover Stratejisi

DNSSEC’in en can sıkıcı tarafı anahtar yönetimidir. Yanlış yapılandırılmış bir rollover, zone’unuzu tamamen erişilemez hâle getirebilir. Bunu zor yoldan öğrenen sysadminlerin acı deneyimlerine tanıklık ettim.

Mevcut Anahtarları Listeleme

# Zone için tüm imzalama anahtarlarını görüntüle
$ZoneName = "sirketiniz.local"
Get-DnsServerSigningKey -ZoneName $ZoneName | 
    Select-Object KeyTag, KeyType, CryptoAlgorithm, KeyLength, 
                  RolloverStatus, SignatureInceptionOffset,
                  RolloverPeriod, NextRollover

Bu çıktıda dikkat etmeniz gereken alan RolloverStatus. Standby durumundaki bir anahtar, rollover sürecinin başladığı anlamına gelir. Active durumundaki anahtar ise şu an kullanımda olan anahtardır.

ZSK Rollover Sürecini Yönetmek

ZSK rollover’ı KSK rollover’a göre daha az risklidir çünkü ZSK değişikliklerinin üst zone’a bildirilmesi gerekmez. Yine de dikkatli olmak gerekiyor:

# ZSK rollover başlat
$ZoneName = "sirketiniz.local"
$ZskKeyTag = (Get-DnsServerSigningKey -ZoneName $ZoneName | 
              Where-Object {$_.KeyType -eq "ZoneSigningKey" -and 
                             $_.RolloverStatus -eq "Active"}).KeyTag

Invoke-DnsServerZoneKeyRollover -ZoneName $ZoneName -KeyTag $ZskKeyTag -Force

# Rollover durumunu izle
Watch-DnsServerZoneKeyRollover -ZoneName $ZoneName -KeyTag $ZskKeyTag

Watch-DnsServerZoneKeyRollover cmdlet’i, rollover tamamlanana kadar süreci izler. Production ortamında bu komutu bir maintenance window sırasında çalıştırmanızı kesinlikle öneririm.

Trust Anchor Yönetimi

İç zone’larınızda DNSSEC kullandığınızda, istemcilerin zone’u doğrulayabilmesi için Trust Anchor dağıtımı yapmanız gerekir. Windows ortamlarında bunu Group Policy üzerinden yapabilirsiniz.

Group Policy ile Trust Anchor Dağıtımı

Önce Trust Anchor’ı export edin:

# Trust Anchor'ı dışa aktar
$ZoneName = "sirketiniz.local"
$TrustAnchor = Get-DnsServerTrustAnchor -Name $ZoneName

# DS kaydını görüntüle
$TrustAnchor | Select-Object TrustAnchorName, TrustAnchorState, 
                              TrustAnchorData | Format-List

Group Policy üzerinden dağıtım için Name Resolution Policy Table (NRPT) kullanacaksınız. Bu, DNS istemcilerine hangi zone için DNSSEC doğrulaması yapması gerektiğini söyler.

# NRPT kuralı oluştur - Tüm istemciler bu zone için DNSSEC doğrulaması yapsın
$GPOName = "DNSSEC_Policy"
$ZoneName = "sirketiniz.local"

# GPO oluştururken bu PowerShell ile NRPT kuralını ekle
Add-DnsClientNrptRule -Namespace ".$ZoneName" `
    -NameServers "192.168.1.10","192.168.1.11" `
    -DnsSecEnable `
    -DnsSecQueryIPsecRequired $false `
    -DnsSecValidationRequired $true

NRPT kuralını Group Policy Management Console’dan da yapılandırabilirsiniz: Computer Configuration > Windows Settings > Name Resolution Policy.

Gerçek Dünya Senaryosu: Zone Transfer ile DNSSEC

Bir müşteri ortamında şu durumla karşılaştım: Primary DNS sunucu imzalı zone’u secondary’lere transfer ediyordu ama secondary sunuculardaki istemciler DNSSEC doğrulaması yapamıyordu. Sorun, secondary sunucuların SecureSecondaries ayarında yatıyordu.

# Primary sunucuda zone transfer güvenliğini yapılandır
$PrimaryServer = "dns01.sirketiniz.local"
$ZoneName = "sirketiniz.local"
$SecondaryIP = "192.168.1.11"

# Secondary sunuculara güvenli transfer izni ver
Set-DnsServerPrimaryZone -Name $ZoneName `
    -SecureSecondaries TransferToSecureServers `
    -SecondaryServers $SecondaryIP

# Zone'un imzalı olarak transfer edildiğini doğrula
Test-DnsServer -IPAddress $SecondaryIP -ZoneName $ZoneName -Context DnsServer

Secondary sunucuda da zone’un doğru alındığını kontrol edin:

# Secondary sunucuda imzalı zone durumunu kontrol et
Invoke-Command -ComputerName "dns02.sirketiniz.local" -ScriptBlock {
    Get-DnsServerZone -Name "sirketiniz.local" | 
        Select-Object ZoneName, ZoneType, IsSigned, LastZoneTransfer
}

DNSSEC Doğrulama Sorunlarını Gidermek

DNSSEC sorunları genellikle sessiz sedasız yaşanır: istemciler DNS cevabı alamaz ama neden alamadıklarını bilemezler. İşte temel debug adımları:

# DNSSEC doğrulama hatalarını DNS debug log ile yakala
Set-DnsServerDiagnostics -All $true
# ... test işlemleri ...

# DNS Event Log'u filtrele
Get-WinEvent -FilterHashtable @{
    LogName = 'Microsoft-Windows-DNS-Server/Audit'
    Id = 2501, 2502, 2503  # DNSSEC ilgili event ID'ler
    StartTime = (Get-Date).AddHours(-1)
} | Select-Object TimeCreated, Id, Message | Format-List

Sık karşılaşılan bir sorun: Sistem saati senkronizasyon problemi. DNSSEC imzalarının geçerlilik süresi vardır ve istemci saati sunucu saatinden 5 dakikadan fazla sapıyorsa doğrulama başarısız olur.

# NTP senkronizasyonunu kontrol et ve zorla
w32tm /query /status
w32tm /resync /force

# DNSSEC imza geçerliliğini manuel kontrol
$ZoneName = "sirketiniz.local"
Resolve-DnsName -Name $ZoneName -Type RRSIG -Server "192.168.1.10" -DnssecOk |
    Select-Object Name, TypeCovered, Algorithm, 
                  @{N="Inception";E={[datetime]::FromFileTime($_.SignatureInception)}},
                  @{N="Expiry";E={[datetime]::FromFileTime($_.SignatureExpiration)}}

İzleme ve Otomasyon

Production ortamında DNSSEC durumunu düzenli izlemelisiniz. Key rollover başarısız olursa, zone erişilemez hâle gelebilir. Şu basit script’i Task Scheduler ile günlük çalıştırıyorum:

# DNSSEC sağlık kontrolü scripti
$Zones = Get-DnsServerZone | Where-Object {$_.IsSigned -eq $true}
$Uyarilar = @()

foreach ($Zone in $Zones) {
    $Keys = Get-DnsServerSigningKey -ZoneName $Zone.ZoneName
    
    foreach ($Key in $Keys) {
        # Rollover tarihi 7 günden az kaldıysa uyar
        if ($Key.NextRollover -lt (Get-Date).AddDays(7)) {
            $Uyarilar += "UYARI: $($Zone.ZoneName) zone'undaki $($Key.KeyType) " +
                          "anahtarı (Tag: $($Key.KeyTag)) rollover'a yakın. " +
                          "Tarih: $($Key.NextRollover)"
        }
        
        # Başarısız rollover durumunu kontrol et
        if ($Key.RolloverStatus -eq "Failed") {
            $Uyarilar += "KRITIK: $($Zone.ZoneName) zone'unda rollover başarısız! " +
                          "KeyTag: $($Key.KeyTag)"
        }
    }
}

if ($Uyarilar.Count -gt 0) {
    $Mesaj = $Uyarilar -join "`n"
    Send-MailMessage -To "[email protected]" `
                     -From "[email protected]" `
                     -Subject "DNSSEC Uyarisi" `
                     -Body $Mesaj `
                     -SmtpServer "mail.sirketiniz.local"
    Write-EventLog -LogName Application -Source "DNSSEC-Monitor" `
                   -EventId 1001 -EntryType Warning -Message $Mesaj
}

Yaygın Hatalar ve Bunlardan Kaçınma Yolları

Rollover Period’u çok kısa tutmak: ZSK rollover’ı için 30 günün altına inmeyin. Bazı yöneticiler “daha güvenli olur” düşüncesiyle çok kısa period’lar ayarlıyor. Bu, zone’u sürekli imzalama yüküne sokar ve bir şeyler ters gittiğinde müdahale sürenizi daraltır.

KSK ve ZSK’yı aynı makine üzerinde tutmak: Mümkünse KSK’yı HSM (Hardware Security Module) üzerinde saklayın. Windows Server 2016 ve sonrasında CNG (Cryptography Next Generation) API aracılığıyla donanım destekli anahtar depolama kullanabilirsiniz.

Trust Anchor güncellemelerini takip etmemek: KSK rollover yaptığınızda, üst zone’daki DS kaydını güncellemeniz gerekir. İç zone’lar için bu NRPT politikası güncellemesi anlamına gelir. Bunu unutursanız istemciler doğrulama yapamaz.

Zone imzalandı diye DNS performansını göz ardı etmek: DNSSEC, yanıt boyutlarını önemli ölçüde artırır. UDP fragmantasyon sorunları yaşamamak için DNS sunucunuzun EDNS0 buffer boyutunu ayarlayın:

# EDNS0 buffer boyutunu artır
Set-DnsServer -ComputerName "dns01.sirketiniz.local" `
    -RoundRobin $true
    
# DNS sunucu maksimum UDP paket boyutunu kontrol et
Get-DnsServerCache | Select-Object MaxKBSize
Get-DnsServer | Select-Object -ExpandProperty ServerSetting | 
    Select-Object MaximumUdpPacketSize, EnableEDnsProbes

Zone Güvenlik Politikasını Kayıt Altına Almak

Kurumsal ortamlarda yapılandırma belgesi hayati önem taşır. İmzalama konfigürasyonunuzu düzenli olarak export edin:

# DNSSEC yapılandırmasını belgele
$ZoneName = "sirketiniz.local"
$Rapor = [PSCustomObject]@{
    ZoneAdi      = $ZoneName
    ImzalanmisMi = (Get-DnsServerZone -Name $ZoneName).IsSigned
    Anahtarlar   = Get-DnsServerSigningKey -ZoneName $ZoneName
    TrustAnchor  = Get-DnsServerTrustAnchor -Name $ZoneName
    Zaman        = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}

$Rapor | ConvertTo-Json -Depth 5 | 
    Out-File "C:DNSRaporDNSSEC_$ZoneName_$(Get-Date -Format 'yyyyMMdd').json"

Sonuç

Windows DNS’te DNSSEC kurulumu ilk bakışta karmaşık görünebilir ama sistematik bir yaklaşımla yönetilebilir. Zone imzalamanın kendisi birkaç PowerShell komutuyla tamamlanıyor; asıl zorluk anahtar yaşam döngüsü yönetimi ve istemci tarafı doğrulama yapılandırmasında.

Pratik tavsiyem şu: Önce bir test zone’u üzerinde tüm süreci, rollover dahil, uçtan uca deneyin. Prodüksiyona geçmeden önce özellikle zone transfer, Trust Anchor dağıtımı ve izleme scriptlerinin doğru çalıştığını doğrulayın. DNSSEC bir kez kurulduğunda süregelen bir bakım gerektirir, “kur ve unut” bir teknoloji değildir.

DNS güvenliğine yapılan bu yatırım, özellikle iç saldırı senaryolarına karşı sizi anlamlı ölçüde koruyor. Birkaç saatlik kurulum ve düzenli bakım, potansiyel bir DNS zehirlenmesi olayının yol açacağı hasarla kıyaslandığında son derece makul bir maliyet.

Bir yanıt yazın

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