Doküman

DNSSec Anahtarları ile BIND DNS Sunucusunun Güvenliği Nasıl Sağlanır

DNS, Etki Alanı Adı Sistemi için bir kısaltmadır, bir IP adresini bir etki alanı adına çözen ve bunun tersini yapan bir internet hizmetidir. Genellikle, insanlar internet üzerinden sitelere, genellikle ezberlenmesi daha kolay olan alan adlarını kullanarak erişir, örneğin, computerforgeeks.com vb. Web sunucuları IP adreslerini kullanarak etkileşime girer, DNS artık tarayıcıların sayfaları yüklemesine izin vermek için adresleri çevirir. Bu, internet sayfalarıyla ilişkili IP adreslerinin ezberlenmesinin karmaşıklığını ortadan kaldırır.

BIND olarak kısaltılan Berkeley İnternet Adı Etki Alanı, ilk olarak 1980’lerde California Üniversitesi Berkeley’de yazılmış açık kaynaklı ve kapsamlı bir yazılımdır. DNS ile ilgili tüm hizmet işlevlerini aşağıdaki yeteneklerle sağlamak için kullanılır:

  • Yetkili DNS: DNS bölgelerini ve sunucunun yetkili kontrolü altındaki kayıtları birincil veya ikincil sunucu olarak yayınlamasına izin verir.
  • Bölünmüş DNS: DNS ad alanının birden çok görünümünü yayınlama yeteneği
  • Özyinelemeli DNS (önbellek çözümleyici): İstemci sistemler adına yetkili/diğer DNS sunucularından veri alabilir.
  • IPv6 desteği: IPv6 adreslerini adlar için yayınlayarak ve doğrudan IPv6 ağına katılarak IPv6’yı destekler
  • Veri çoğaltma: Verileri birincil sunuculardan ikincil sunuculara verimli ve zamanında kopyalayabilirsiniz.

Varsayılan olarak, DNS güvenli değildir ve internetin samimi ve güvenilir bir yer olduğu bir zamanda tasarlandığından, tasarımında güvenlik birincil bir husus değildi. Özyinelemeli bir çözümleyici, isteği yetkili bir DNS’ye gönderdiğinde, alınan yanıtın gerçekliğini doğrulamanın bir yolu yoktur. Çözümleyici yalnızca yanıtın aynı IP’den gelmesini sağlar. IP kolayca dövülebildiğinden veya sızdırılabildiğinden bu yeterince güvenli değildir. DNS çözümleyici, sorgularından birine herhangi bir sahte yanıt algılamak için tasarlanmamıştır.

BIND DNS’nin güvenliğini sağlamak, saldırganların DNS yanıtını değiştirmesini, yetkili DNS önbelleğini maskeleyip manipüle etmesini engellediği için önemlidir. DNSSEC olarak kısaltılan DNS Güvenlik Uzantıları, kişinin DNS yanıtlarının veri bütünlüğünü korumasına izin verir. Public Key Infrastructure(PKI) kullanarak bir bölgenin A, MX, CNAME vb. tüm DNS kayıtlarını imzalar.

DNSSEC, 8 yeni kaynak kaydı türü sunar:

  • DNSKEY (public key)
  • RRSIG (digital resource record signature)
  • DS (parent-child)
  • NSEC (proof of nonexistence)
  • NSEC3 (proof of nonexistence)
  • NSEC3PARAM (proof of nonexistence)
  • CDS (child-parent signaling)
  • CDNSKEY (child-parent signaling)

DNSSEC doğrulaması etkinleştirildiğinde, çözümleyici sorgusunda ek kaynak kayıtları ister. Yetkili DNS’den, yanıtla ilişkili bazı kanıtlarla yanıt vermesini ister. Yanıtlar alındığında, çözümleyici yanıtların gerçekliğini ve bütünlüğünü doğrulamak için bazı kriptografik kontroller gerçekleştirir. Bu işlem, bir anahtara ulaşılıp güvenilene kadar get-key, validate, ask-parent ve ebeveyni tarafından tekrarlanır. Kök anahtar olan DNSSEC tarafından yalnızca bir anahtara güvenilir.

Aşağıdaki resim, DNSSEC’nin çalışmasını göstermek için kullanılabilir.

DNSSec Anahtarları ile Güvenli BIND DNS Sunucusu

Bu kılavuzda, BIND DNS Sunucusunun DNSSec Anahtarları ile nasıl güvenli hale getirileceğini öğreneceğiz.

Adım 1: Bind DNS Sunucusunun Kurulumu

Bu kurulum, en son BIND sürümünü, muhtemelen 9.9’un üzerindeki herhangi bir sürümü gerektirir.

Kurulduktan sonra, sürümü şu komutla kontrol edin:

# named -V
BIND 9.16.23-RH (Extended Support Version) <id:fde3b1f>
.......
compiled by GCC 11.2.1 20220127 (Red Hat 11.2.1-9)
compiled with OpenSSL version: OpenSSL 3.0.1 14 Dec 2021
linked to OpenSSL version: OpenSSL 3.0.1 14 Dec 2021
compiled with libuv version: 1.42.0
linked to libuv version: 1.42.0
compiled with libxml2 version: 2.9.13
linked to libxml2 version: 20913
compiled with json-c version: 0.14
linked to json-c version: 0.14
compiled with zlib version: 1.2.11
linked to zlib version: 1.2.11
linked to maxminddb version: 1.5.2
compiled with protobuf-c version: 1.3.3
linked to protobuf-c version: 1.3.3
threads support is enabled

BIND, OpenSSL ile oluşturulmuşsa, DNSSEC’yi destekler. Sürüm DNSSEC’yi desteklemiyorsa, en son sürüme yükseltmeniz gerekir.

Sürümü şu komutla da kontrol edebilirsiniz:

dig -t txt -c chaos VERSION.BIND

Adım 1: BIND Master’da DNSSEC’yi etkinleştirin

Ana yapılandırmayı düzenleyin ve DNSSEC’yi etkinleştirin.

##On Debian/Ubuntu
sudo vim /etc/bind/named.conf.options

##On CentOS/Rocky Linux/Alma Linux
sudo vim /etc/named.conf

Yapılandırmada aşağıdaki satırların mevcut olduğundan emin olun;

.........
        dnssec-enable yes;
        dnssec-validation yes;
.......

2. Adım: ZSK ve KSK için anahtar çifti oluşturun

DNSSEC için anahtar çifti oluşturmak için root olarak BIND dizinine geçin

##On Debian/Ubuntu
sudo su -
cd /etc/bind

##On CentOS/Rocky Linux/Alma Linux
sudo su -
cd /var/named/

Yukarıdaki dizinin bölge dosyalarınızı içermesi gerektiğini unutmayın. Bölgeniz (zone) için Bölge İmzalama Anahtarını şu komutla oluşturun:

dnssec-keygen -a <ALGORITHM> -b <BITS> -n ZONE <ZONENAME>

Bu yazıda kullanılacak olan bilgiler:

  • zone isimleri:
    • computingforgeeks.local as the forward zone
    • 205.168.192.in-addr.arpa as the reverse zone.
  • Zone dosyaları
    • computingforgeeks.forward
    • computingforgeeks.reverse

So the ZSK Keys will be generated as shown:

##For the Foward Zone
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE computingforgeeks.local

##For the Reverse Zone
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE 205.168.192.in-addr.arpa

Bölgeleriniz için Anahtar İmzalama Anahtarını (KSK) oluşturun

##For the Foward Zone
dnssec-keygen -f KSK -a RSASHA256 -b 4096 -n ZONE computingforgeeks.local

##For the Reverse Zone
dnssec-keygen -f KSK -a RSASHA256 -b 4096 -n ZONE 205.168.192.in-addr.arpa

Oluşturulan anahtarları şu komutu kullanarak bölge dosyalarınıza ekleyin:

##For the Foward Zone
for key in `ls Kcomputingforgeeks.local*.key`
do
echo "\$INCLUDE $key">> computingforgeeks.forward
done

##For the Reverse Zone
for key in `ls K205.168.192.in-addr.arpa*.key`
do
echo "\$INCLUDE $key">> computingforgeeks.reverse
done

Anahtarlar için gerekli izinleri ayarlayın.

##On Debian/Ubuntu
chown root:bind Kcomputingforgeeks.*
chown root:bind K205.168.192.in-addr.arpa*

##On CentOS/Rocky Linux/Alma Linux
chown root:named Kcomputingforgeeks.*
chown root:named K205.168.192.in-addr.arpa*

3. Adım: Oluşturulan Anahtarları İmzalayın

Şimdi dnssec-signzone komutunu kullanarak bölge anahtarlarını aşağıdaki sözdizimi ile imzalayın:

dnssec-signzone -3 <salt> -A -N INCREMENT -o <zonename> -t <zonefilename>

örneğin benim Forward zone:

dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o computingforgeeks.local -t computingforgeeks.forward

Reverse Zone:

dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o 205.168.192.in-addr.arpa -t computingforgeeks.reverse

Örnek çıktı:

Bundan sonra forward.signed ve reverse.signed olarak yeni zone dosyalarınız olacaktır. Şimdi yeni imzalanan bölge dosyalarını yerleştirmek için aşağıdaki dosyayı düzenleyin;

##On Debian/Ubuntu
sudo vim /etc/bind/named.conf.local

##On CentOS/Rocky Linux/Alma Linux
sudo vim /etc/named.rfc1912.zones

Dosyada değişiklikleri yapın. Örneğin CentOS’ta;

.....
zone "computingforgeeks.local" IN {
        type master;
        file "computingforgeeks.forward.signed";
        allow-transfer { 2.2.2.2; };
        allow-update { none; };
};

zone "205.168.192.in-addr.arpa" IN {
        type master;
        file "computingforgeeks.reverse.signed";
        allow-transfer { 2.2.2.2; };
        allow-update { none; };
};

Gerekli izinleri ayarlayın:

##On Debian/Ubuntu
chown root:bind computingforgeeks.forward.signed
chown root:bind computingforgeeks.reverse.signed

##On CentOS/Rocky Linux/Alma Linux
chown root:named computingforgeeks.forward.signed
chown root:named computingforgeeks.reverse.signed

İşte bu! DNS’inizi güvence altına aldınız. Hizmeti yeniden başlatın;

##On Debian/Ubuntu
sudo systemctl restart bind9

##On CentOS/Rocky Linux/Alma Linux
sudo systemctl restart named.service

DNSSEC’yi localhost’tan BIND DNS üzerinde test edin

dig DNSKEY computingforgeeks.local +multiline

Örnek Çıktı:

RRSIG kayıtlarının kullanılabilirliğini kontrol edin

dig www.computingforgeeks.local. +noadditional +dnssec +multiline

Örnek Çıktı:

Yukarıdaki çıktıdan, AD (Authenticated Data) bit bayrağı seti ile doğrulanmış bir yanıt alıyoruz. Başlık NOERROR durumuna sahiptir. Doğrulanmayan bir yanıt, SERVFAIL olarak HEADER durumuna sahip olacaktır.

;; >>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 21978
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

Yazının orijinalini buradan okuyabilirsiniz.