Authoritative DNS Sunucusu Olarak Knot DNS
Knot DNS, Çekya'nın .cz TLD kayıt otoritesi CZ.NIC tarafından geliştirilen ve tamamen C dilinde yazılmış yüksek performanslı bir authoritative DNS sunucusudur. Recursion yapmaz; yalnızca kendisinde tanımlı zone'lardan yanıt verir. Recursion işi ayrı bir proje olan Knot Resolver'a bırakılmıştır. Bu ayrım onu primary ya da secondary sunucu olarak ideal kılar. Yüksek QPS alan ortamlarda, sık güncellenen ve imzalı zone'larda BIND'in zorlandığı yerlerde rahat çalışır. DNSSEC imzalama motoru yerleşiktir, ek bir imzalama aracı kurulmaz.
Kurulum
Debian tabanlı sistemlerde paket yöneticisi üzerinden kurulum tek komutla tamamlanır:
sudo apt-get update
sudo apt-get install knot knot-dnsutils
Paket knot kullanıcısı ve grubuyla birlikte gelir, servis knot.service adıyla systemd altında çalışır. knot-dnsutils ise kdig gibi sorgu araçlarını verir. RHEL türevlerinde EPEL deposu eklendikten sonra dnf install knot ile aynı kurulum yapılır. Güncel sürümlerde master/slave yerine primary/secondary terimleri geçer; konfigürasyondaki karşılıkları master ifadesidir ve eski terimle geriye dönük uyumludur. Kurulum bitince konfigürasyon dosyası düzenlenir.
Temel Konfigürasyon
Ana konfigürasyon dosyası
/etc/knot/knot.conf yolundadır. Basitleştirilmiş YAML formatı kullanır; girintiye duyarlıdır, sekme yerine boşluk gerekir. Dosya bölümlerden oluşur: server, database, log, key, remote, acl, policy, template, zone. En az server ve zone bölümleri tanımlanmalıdır.
server:
listen: 0.0.0.0@53
listen: ::@53
user: knot:knot
database:
storage: /var/lib/knot
log:
- target: syslog
any: info
remote:
- id: secondary
address: 192.0.2.10@53
acl:
- id: acl_transfer
address: 10.0.0.0/8
action: transfer
zone:
- domain: example.com
storage: /var/lib/knot/zones
file: example.com.zone
notify: secondary
acl: acl_transfer
Bu yapılandırma sunucunun tüm IPv4 ve IPv6 arayüzlerinde 53. porttan dinlemesini sağlar. Buradaki nesne ilişkisine dikkat etmek gerekir: adres bilgisini taşıyan yer remote bölümüdür, zone altındaki notify ise yalnızca o tanımın kimliğine referans verir. Transfer yetkisi de acl bölümünde adres ve action çiftiyle tanımlanır; zone bu acl kimliğini referans alır. Yani notify: secondary satırı bir IP listesi değildir, remote tanımının id'sidir. ACL'deki action transfer dışında update veya notify da olabilir. Üretimde transfer yetkisi mutlaka daraltılmalıdır. Zone dosyası
/var/lib/knot/zones/ dizininde
example.com.zone adıyla bulunmalıdır.
Zone Dosyası Yapısı
Standart BIND uyumlu zone dosyası formatı kullanılır. SOA kaydı zorunludur ve birincil sunucu bilgisi ile serial numarası içerir. Serial artırılmadığında secondary sunucular değişiklikleri almaz. A, AAAA, CNAME, MX, TXT ve NS kayıtları zone dosyasına eklenir.
$ORIGIN example.com.
$TTL 3600
@ IN SOA ns1.example.com. admin.example.com. (
2024011501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
@ IN A 203.0.113.10
ns1 IN A 203.0.113.11
ns2 IN A 203.0.113.12
www IN A 203.0.113.10
mail IN A 203.0.113.20
@ IN MX 10 mail.example.com.
Zone dosyası yazıldıktan sonra
knotc zone-check example.com ile sözdizimi kontrol edilir, sonra konfigürasyon yeniden yüklenir:
sudo knotc reload
DNSSEC Kurulumu
Knot DNS iki imzalama moduna sahiptir: otomatik anahtar yönetimi ve manuel anahtar yönetimi. Otomatik modda algoritma, anahtar boyutu ve anahtar ömrü bir policy bölümünde tanımlanır; policy zone'a ya da template'e bağlanır. Anahtarları Knot kendisi üretir, KSK/ZSK yaşam döngüsünü de kendisi yönetir.
policy:
- id: dnssec-default
algorithm: ECDSAP256SHA256
ksk-lifetime: 365d
zsk-lifetime: 90d
template:
- id: default
storage: /var/lib/knot/zones
dnssec-signing: on
dnssec-policy: dnssec-default
dnssec-signing: on parametresi zone'un otomatik olarak imzalanacağı anlamına gelir.
ksk-lifetime ve
zsk-lifetime değerleri anahtar ömürlerini belirtir; birim sonepleriyle gün bazında yazılırlar. KSK'yı yılda bir, ZSK'yı üç ayda bir döndürmek güvenlik ve operasyonel yük arasında yaygın bir denge olarak geçer.
İki anahtar tipinin işi farklıdır: ZSK zone içindeki kayıtları imzalar, KSK ise DNSKEY kayıtlarını imzalar ve güven zincirinin üst zone'a bağlanan ucudur. ECDSAP256SHA256, RSA'ya göre çok daha kısa anahtar ve imzayla eşdeğer güvenlik sağlar; 256 bitlik anahtar boyu bu algoritma için standarttır.
Manuel moda geçmek isteyenler policy'yi manual yaparak anahtarları kendisi üretir. Sözdizimi name=value biçimindedir:
sudo keymgr example.com. generate algorithm=ECDSAP256SHA256 size=256 ksk=true zsk=true
Tek anahtarla her iki işi yapan Single-Type Signing kullanmak en kestirme yol. Anahtarlar dosya olarak değil,
/var/lib/knot/keys/ altındaki LMDB tabanlı KASP veritabanında saklanır. keymgr ile knotc işlemlerini aynı anda çalıştırmamak gerekir; KASP veritabanı kilitlenebilir.
DS kaydı zincirin üst halkasıdır: KSK genel anahtarının özeti DS formatında üst zone'a iletilir. Knot bunu çıktı olarak verir:
sudo keymgr example.com. ds
Çıktıdaki key tag, algoritma numarası, digest tipi ve özet registrar arayüzüne girilir. DS üst zone'a eklenmeden zone doğrulayıcı resolverlar için görünmez; tam tersi, yanlış DS kalırsa domain SERVFAIL ile cevap verir hale gelir.
Doğrulama
İmzalamanın yapılıp yapılmadığı sorgu araçlarıyla test edilir:
dig +dnssec example.com. A @localhost
kdig @127.0.0.1 example.com SOA +dnssec
Yanıtta RRSIG kaydının bulunması imzanın üretildiğini gösterir. DNSKEY sorgusunda 256 flag'li ZSK ve 257 flag'li KSK görülmelidir. Bir resolverdan SERVFAIL gelirse
dig +cd ile doğrulama devre dışı bırakılıp kaydın kendisine bakılır; cevap geliyorsa sorun DNSSEC tarafındadır. ldns paketindeki drill aracı zinciri kökten itibaren takip eder:
drill -S example.com
-S parametresi güven zincirini root'a kadar kovalar ve kopan halkayı gösterir. Knot tarafında ise
knotc zone-status tüm zone'ların durumunu,
knotc zone-sign example.com ise yeniden imzalamayı tetikler. Loglar syslog'a, systemd altında journal'a gider;
journalctl -u knot ile izlenir.
Güvenlik Önlemleri
Authoritative sunucularda birkaç temel katman iş görür. ACL tanımları transfer ve update işlemlerini yalnızca yetkili adreslere açar; normal sorgular her zaman serbesttir, kısıtlanması gereken şey transfer'dır. Recursion zaten yoktur, kapatılacak bir şey kalmaz. Response rate limiting mod-rrl modülüyle etkinleştirilir, amplification saldırılarına karşı anlamlıdır. Zone transfer'ları TSIG anahtarıyla imzalamak IP kısıtının üstüne ikinci bir katman ekler; anahtar
keymgr -t ile üretilir.
Değişiklik dayanıklılığı için template'te
journal-content: all ve
zonefile-sync ayarları kullanılabilir; değişiklikler LMDB journal'da tutulup zone dosyasına senkronize edilir. Yüksek performans, düşük kaynak tüketimi ve yerleşik DNSSEC desteği bir arada isteniyorsa Knot DNS authoritative taraf için güçlü bir seçimdir; konfigürasyon dili de BIND'in named.conf'undan okunabilirdir.