DNSSEC Nedir ve BIND ile Nasıl Etkinleştirilir

DNS sorgularınızın manipüle edildiğini hiç düşündünüz mü? Bir kullanıcı bank.com yazıyor, DNS sunucunuz cevap veriyor ama bu cevap gerçek mi? DNS protokolü 1980’lerde tasarlandığında güvenlik ikinci planda kalmıştı. İşte DNSSEC tam bu boşluğu doldurmak için geliştirildi ve bugün production ortamınızda muhtemelen hâlâ etkinleştirmediğiniz en önemli güvenlik katmanlarından biri.

DNSSEC Nedir?

DNSSEC (Domain Name System Security Extensions), DNS yanıtlarının bütünlüğünü ve kaynağının doğruluğunu kriptografik imzalar aracılığıyla garanti eden bir uzantı setidir. RFC 4033, 4034 ve 4035 ile standartlaştırılmıştır.

Temel sorun şu: Normal DNS’te bir resolver, aldığı yanıtın gerçekten yetkili nameserver’dan gelip gelmediğini doğrulayamaz. Araya giren biri DNS yanıtını değiştirebilir, siz de hiç fark etmezsiniz. Bu saldırı tipine DNS cache poisoning veya Kaminsky saldırısı denir.

DNSSEC bu sorunu şöyle çözer:

  • Kayıt imzalama: Her DNS kaydı, zone’un özel anahtarıyla imzalanır
  • Zincir güven: Üst zone (.com, .net vb.), alt zone’un anahtarını onaylar
  • Veri bütünlüğü: İmzalar, yanıtın değiştirilip değiştirilmediğini ortaya çıkarır
  • İnkar edilemezlik: Kaynak doğrulaması kriptografik olarak kanıtlanabilir

Şunu net söyleyelim: DNSSEC, DNS trafiğini şifrelemez. Yani sorgu içerikleri hâlâ okunabilir. DNSSEC sadece imzalama ve doğrulama yapar. Şifreleme istiyorsanız DNS over TLS (DoT) veya DNS over HTTPS (DoH) bakmalısınız.

DNSSEC’in Anahtar Bileşenleri

ZSK (Zone Signing Key): Zone içindeki kayıtları imzalar. Daha sık değiştirilen, daha kısa anahtardır.

KSK (Key Signing Key): ZSK’yı imzalar. Daha uzun ömürlü, daha güçlü bir anahtardır. DS kaydı olarak üst zone’a iletilir.

DS (Delegation Signer): Üst zone’da tutulan, alt zone’un KSK’sının özet değeridir. Güven zincirini oluşturur.

RRSIG: İmzalanmış kayıt seti. Her imzalı DNS kaydının yanında bir RRSIG kaydı bulunur.

NSEC / NSEC3: Var olmayan kayıtları kanıtlamak için kullanılır. “Bu isim zone’da yok” bilgisini kriptografik olarak doğrular.

DNSKEY: Zone’un genel anahtarını yayınlar. Resolver bu kayıt sayesinde imzaları doğrular.

BIND ile DNSSEC Kurulumu

Ortamımızı tanıyalım: Ubuntu 22.04 üzerinde BIND 9.18 kurulu, example.com zone’unu yönetiyoruz. Hedefimiz bu zone’u DNSSEC ile imzalamak.

Ön Gereksinimler

# BIND versiyonunu kontrol et
named -v
# BIND 9.16+ ile built-in DNSSEC araçları geliyor

# Gerekli paketleri yükle
apt install bind9 bind9utils bind9-dnsutils -y

# bind-tools'un kurulu olduğunu doğrula
which dnssec-keygen
which dnssec-signzone
which rndc

BIND 9.16 öncesinde manuel anahtar yönetimi yapmanız gerekirdi. 9.16 ve sonrasında inline signing ve auto-dnssec özellikleri işlerinizi çok kolaylaştırıyor.

Yöntem 1: Otomatik DNSSEC (Önerilen – BIND 9.16+)

BIND 9.16 ile gelen dnssec-policy direktifi, anahtar yönetimini ve zone imzalamayı tamamen otomatize eder. Bu yöntemi production’da kullanmanızı kesinlikle tavsiye ederim.

/etc/bind/named.conf.options dosyasına şunları ekleyin:

options {
    directory "/var/cache/bind";
    
    # DNSSEC doğrulamayı etkinleştir (resolver olarak)
    dnssec-validation auto;
    
    # Trust anchor otomatik güncelleme
    managed-keys-directory "/var/lib/bind";
    
    listen-on { any; };
    allow-recursion { 127.0.0.1; 192.168.1.0/24; };
};

Zone tanımını /etc/bind/named.conf.local içinde şöyle güncelleyin:

zone "example.com" {
    type master;
    file "/etc/bind/zones/example.com.db";
    
    # DNSSEC policy tanımla
    dnssec-policy default;
    
    # Inline signing - zone dosyasını değiştirmeden imzalama
    inline-signing yes;
    
    # İmzalanmış zone dosyasının çıktısı
    journal "/var/lib/bind/example.com.jnl";
};

Bu kadar. BIND, dnssec-policy default ile anahtarları otomatik oluşturur, zone’u imzalar ve key rollover’ları yönetir.

Servisi yeniden başlatın:

systemctl restart bind9

# Log'ları kontrol et
journalctl -u bind9 -f

# DNSSEC anahtarlarının oluşturulduğunu doğrula
ls -la /var/lib/bind/

Yöntem 2: Manuel DNSSEC Kurulumu

Bazen daha fazla kontrol istiyorsunuz ya da eski BIND versiyonuyla çalışıyorsunuz. Bu durumda manuel yöntemi kullanın.

Adım 1: Anahtarları oluştur

# Çalışma dizinini oluştur
mkdir -p /etc/bind/keys
cd /etc/bind/keys

# ZSK oluştur (Zone Signing Key) - 1024 bit RSA
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE example.com

# KSK oluştur (Key Signing Key) - 2048 bit RSA, -f KSK flagı önemli
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE -f KSK example.com

# Oluşturulan dosyaları gör
ls -la
# Kexample.com.+008+12345.key    <- Public key
# Kexample.com.+008+12345.private <- Private key (KORU!)

Algoritma seçimi önemli. Günümüzde şu seçenekler önerilir:

  • ECDSAP256SHA256: En iyi performans, modern standart
  • ECDSAP384SHA384: Daha yüksek güvenlik, biraz daha yavaş
  • RSASHA256: Eski sistemlerle uyumluluk için
# ECDSA ile modern anahtar üretimi
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.com
dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK example.com

Adım 2: Public key’leri zone dosyasına ekle

# Zone dosyasını kontrol et
cat /etc/bind/zones/example.com.db

# Public key'leri zone dosyasına dahil et
cat Kexample.com.*.key >> /etc/bind/zones/example.com.db

Adım 3: Zone’u imzala

cd /etc/bind/zones

# Zone dosyasını imzala (30 günlük geçerlilik)
dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) 
    -N INCREMENT 
    -o example.com 
    -t 
    -k /etc/bind/keys/Kexample.com.+013+KSK_ID.key 
    example.com.db 
    /etc/bind/keys/Kexample.com.+013+ZSK_ID.key

# Bu komut example.com.db.signed dosyasını oluşturur
ls -la example.com.db.signed

Adım 4: Zone konfigürasyonunu güncelle

# named.conf.local'i düzenle
zone "example.com" {
    type master;
    file "/etc/bind/zones/example.com.db.signed";
    allow-transfer { secondary_ip; };
};
# Konfigürasyonu doğrula ve servisi yeniden başlat
named-checkconf
named-checkzone example.com /etc/bind/zones/example.com.db.signed
systemctl reload bind9

DS Kaydını Üst Zone’a İletme

Zone’unuzu imzaladınız, ama güven zinciri henüz tam değil. Üst zone’un (registrar’ınızın) sizin zone’unuzun KSK’sından haberdar olması gerekiyor.

# DS kaydını görüntüle
cat /etc/bind/zones/dsset-example.com.

# Veya dnssec-dsfromkey ile üret
dnssec-dsfromkey /etc/bind/keys/Kexample.com.+013+KSK_ID.key

# Çıktı şuna benzer:
# example.com. IN DS 12345 13 2 ABCDEF1234...

Bu DS kaydını registrar panelinize girmeniz gerekiyor. GoDaddy, Namecheap, Google Domains gibi büyük registrar’ların hepsinde “DNSSEC” veya “DS Records” bölümü bulunur. Key Tag, Algorithm, Digest Type ve Digest değerlerini girin.

Önemli: DS kaydı üst zone’a eklendikten sonra TTL süresi kadar beklemeniz gerekebilir. Sabırlı olun.

DNSSEC Doğrulaması

Zone’unuzu imzaladıktan sonra her şeyin çalıştığını doğrulamanız şart.

# DNSKEY kayıtlarını sorgula
dig DNSKEY example.com @localhost

# RRSIG kayıtlarını gör
dig A example.com @localhost +dnssec

# DS kaydını üst zone'dan sorgula
dig DS example.com @8.8.8.8

# DNSSEC doğrulamasını test et (AD flag'i arama)
dig A example.com @8.8.8.8 +dnssec
# ;; flags: qr rd ra ad; -> AD (Authenticated Data) flag'i görmelisiniz

# Daha detaylı doğrulama
dig A example.com +dnssec +multi

# delv komutu ile zincir doğrulaması
delv @8.8.8.8 example.com A +rtrace

AD flag’i (Authenticated Data) resolver’ın DNSSEC doğrulamasını başarıyla tamamladığını gösterir. Bu flag’i görüyorsanız her şey yolunda demektir.

Online araçları da kullanabilirsiniz:

  • dnsviz.net – Görsel DNSSEC analizi, zincir sorunlarını harika gösteriyor
  • dnssec-analyzer.verisignlabs.com – Verisign’ın DNSSEC test aracı
  • zonemaster.net – Kapsamlı zone testleri

Key Rollover Yönetimi

Anahtarlarınızı düzenli olarak değiştirmeniz güvenlik açısından önemlidir. Bu işleme key rollover denir ve dikkatli yapılmazsa zone’unuzun erişilemez hale gelmesine yol açabilir.

Otomatik DNSSEC policy kullanıyorsanız BIND bunu sizin için yönetir. Manuel yönetimde şu adımları izleyin:

# Yeni ZSK üret
cd /etc/bind/keys
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.com

# Yeni anahtarı zone'a ekle AMA henüz aktif etme
# Zone dosyasına $INCLUDE ile ekle, önce yayılmasını bekle

# Bir TTL süresi sonra (genellikle 24-48 saat) zone'u yeni ZSK ile yeniden imzala
dnssec-signzone -o example.com -k KSK_dosyasi example.com.db YeniZSK EskiZSK

# Eski ZSK'yı bir TTL daha aktif tut, sonra kaldır

BIND’ın otomatik rollover için rndc komutları:

# Zone anahtarlarını listele
rndc dnssec -status example.com

# Manuel key rollover başlat
rndc dnssec -rollover -key KEY_ID example.com

# Zone'u yeniden imzala
rndc sign example.com

# DNSSEC durumunu kontrol et
rndc dnssec -status example.com

Yaygın Sorunlar ve Çözümleri

Sorun 1: İmza Süresi Dolmuş

# İmza tarihlerini kontrol et
dig A example.com @localhost +dnssec | grep RRSIG

# Log'larda "signature has expired" hatası görüyorsanız
journalctl -u bind9 | grep -i "expired|signature"

# Zone'u yeniden imzala
dnssec-signzone -e +2592000 -o example.com example.com.db ZSK KSK
# +2592000 = 30 gün ilerisi (saniye cinsinden)
systemctl reload bind9

Sorun 2: DS Kaydı Uyuşmazlığı

# Mevcut DS kaydını registrar'dan sorgula
dig DS example.com @8.8.8.8

# Yerel KSK'dan üretilen DS ile karşılaştır
dnssec-dsfromkey Kexample.com.+013+KSK_ID.key

# İki çıktı farklıysa registrar panelinden DS kaydını güncelle

Sorun 3: NSEC3 Tuz Problemi

# NSEC3 parametrelerini kontrol et
dig NSEC3PARAM example.com @localhost

# Zone'u yeni NSEC3 tuzu ile yeniden imzala
dnssec-signzone -3 $(openssl rand -hex 8) -o example.com example.com.db ZSK KSK

Sorun 4: Slave Zone’larda İmzalama

# Master'da inline signing etkinken slave konfigürasyonu
zone "example.com" {
    type slave;
    masters { master_ip; };
    file "/var/lib/bind/example.com.db";
    # Slave'de dnssec-policy TANIMLAMA, master halleder
};

İzleme ve Alarm Kurulumu

Production’da DNSSEC durumunu sürekli izlemeniz gerekir. İmzalar süresi dolmadan önce uyarı almanız kritik.

#!/bin/bash
# dnssec-monitor.sh - Cron ile çalıştırın

ZONE="example.com"
NAMESERVER="localhost"
ALERT_EMAIL="[email protected]"
WARN_DAYS=7

# RRSIG expiry tarihini kontrol et
EXPIRY=$(dig RRSIG SOA $ZONE @$NAMESERVER +short | awk '{print $9}')

if [ -z "$EXPIRY" ]; then
    echo "HATA: DNSSEC imzası bulunamadı!" | mail -s "DNSSEC Alarm: $ZONE" $ALERT_EMAIL
    exit 1
fi

# Tarihi parse et
EXPIRY_DATE=$(echo $EXPIRY | sed 's/(....)(..)(..)(..)(..)(..)/1-2-3 4:5:6/')
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
NOW_EPOCH=$(date +%s)
DIFF_DAYS=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))

if [ $DIFF_DAYS -lt $WARN_DAYS ]; then
    echo "UYARI: $ZONE zone imzası $DIFF_DAYS gün içinde sona erecek!" 
        | mail -s "DNSSEC Uyarı: $ZONE" $ALERT_EMAIL
fi

echo "DNSSEC durumu: $ZONE - $DIFF_DAYS gün kaldı"
# Script'i çalıştırılabilir yap ve cron'a ekle
chmod +x /usr/local/bin/dnssec-monitor.sh

# Her gün sabah 8'de kontrol
echo "0 8 * * * root /usr/local/bin/dnssec-monitor.sh" >> /etc/crontab

Nagios veya Zabbix kullanıyorsanız check_dnssec eklentilerini kurun. Prometheus ortamında prometheus-bind-exporter DNSSEC metriklerini otomatik toplar.

Güvenlik Önerileri

DNSSEC kurulumunuzu sağlamlaştırmak için dikkat etmeniz gerekenler:

  • Private key dosyalarını koruyun: /etc/bind/keys/*.private dosyaları yalnızca bind kullanıcısı tarafından okunabilmeli. chmod 600 ve chown bind:bind uygulayın.
  • HSM kullanımı: Kurumsal ortamlarda anahtarları Hardware Security Module üzerinde saklayın. BIND, PKCS#11 arayüzü üzerinden HSM desteği sunar.
  • Algoritma güncelliği: MD5 ve SHA1 tabanlı algoritmalar kullanmayın. ECDSAP256SHA256 veya ED25519 tercih edin.
  • KSK ve ZSK’yı ayırın: KSK’yı çevrimdışı ortamda saklayın, yalnızca rollover sırasında kullanın.
  • Rollover planı yapın: ZSK için 90 gün, KSK için 1 yıl rollover döngüsü yaygın kabul görmüş pratiklerdir.
  • Test ortamı kurun: Production’da DNSSEC değişikliği yapmadan önce lab ortamında deneyin. Yanlış bir DS kaydı zone’unuzu tamamen erişilemez yapabilir.

Sonuç

DNSSEC kurulumu ilk bakışta karmaşık görünüyor ama BIND 9.16 sonrasında otomatik policy mekanizmasıyla işler çok kolaylaştı. dnssec-policy default satırını eklemek ve DS kaydını registrar’a iletmek çoğu durumda yeterli.

Kritik hatırlatmalar:

  • Zone imzalamak yetmez, DS kaydını registrar’a eklemeyi unutmayın
  • İmza sürelerini izleyin, dolmadan önce yenileyin
  • delv ve dnsviz.net ile düzenli doğrulama yapın
  • Private key dosyalarının güvenliğini asla ihmal etmeyin
  • Rollover sürecini belgelendirin, 2 yıl sonra kim yapacak?

DNSSEC devre dışı bir nameserver, DNS cache poisoning saldırılarına açık bir kapı bırakıyor. Kullanıcılarınızın trafiğini doğru sunucuya yönlendirme sorumluluğunuz var ve bu artık standart bir güvenlik gereksinimi haline geldi. Çoğu güvenlik uyumluluk çerçevesi (PCI DSS, ISO 27001) DNS güvenliği kapsamında DNSSEC’i değerlendiriyor.

Sorularınız olursa yorumlarda buluşalım. Zone’unuzu imzaladıktan sonra dnsviz.net‘teki o yeşil onay görselini görünce beni hatırlayın.

Yorum yapın