Zabezpečení BIND DNS serveru na Ubuntu (BIND DNS Hardening)

By | 29/12/2021

Last Updated on 29/12/2021 by administrator

Zabezpečení BIND DNS serveru na Ubuntu (BIND Security)

Konfigurace BIND DNS serveru byla popsána ve článku https://martinuvzivot.cz/konfigurace-bind-dns-serveru-na-ubuntu-20-04-configure-bind-ubuntu/. Tento článek popisuje základní zabezpečení BIND DNS aplikace.

1. Oddělit autoritativní a rekurzivní server

BIND pracuje defaultně v hybridním modu, a tak umožnuje byt zároveň autoritativní a rekurzivní server. Tyto dvě funkce se doporučují oddělit a mít tak autoritativní a rekurzivní server zvlášť viz. [3]. Neotvírat rekurzivní server do světa. [10]

Zda je autoritativní server zároveň rekurzivním se ověří příkazem:

dig +short test.openresolver.com TXT @<veřejná IP adresa Vašeho autoritativního serveru>

Pokud se zobrazí “open-resolver-detected”, je autoritativní server zároveň i rekurzivním. Pokud se nezobrazí nic, je vše v pořádku.

2. Ujistit se, že je nainstalována up-to-date verze BIND:

apt-get update
apt-get install bind9

3. Ujistit se, že BIND neběží pod rootem:

ps aux | grep bind | grep -v '^root'

Pokud tomu tak je změnit permissions a ownership:

chown -R root:bind /etc/bind
chown root:bind /etc/bind/named.conf*
chmod 640 /etc/bind/named.conf*

Ověření:

ls -la /etc/bind

4. Zabezpečení v souboru named.conf.options:

V souboru /etc/bind/named.conf.options je možné přidat následující řádky pod rubrikou “Options” [1][2]:

allow-recursion
  • povolí zasílání rekurzivních DNS dotazů (na kořenové DNS root servery či na forwardery)
  • defaultně je nastaven na “any”
  • níže příklad, který povoluje resolving pro samotný BIND server a pro subnet 192.168.0.0/24
allow-recursion { localhost; 192.168.0.0/24; };
allow-query
  • povolí překlad DNS dotazů v nakonfigurované zóně, nebo zónách tohoto serveru
  • defaultně je nastaven na “any”
  • níže příklad, který povoluje resolving pro samotný BIND server a pro subnet 192.168.0.0/24
allow-query { localhost; 192.168.0.0/24; };
allow-query-cache
  • povolí získání nacachovaných DNS dotazů
  • defaultně je nastaven na “any”
  • níže příklad, který povoluje resolving pro samotný BIND server a pro subnet 192.168.0.0/24
allow-query-cache { localhost; 192.168.0.0/24; };
allow-transfer
  • povolí přenášení zónových souborů
  • defaultně je nastaven na “any” [1]
  • níže příklad, kde se budou přenášet zónové soubory pouze na IP adresu 192.168.0.89
allow-transfer { 192.168.0.98; };
allow-update
  • zakáže dynamické DNS updaty
  • defaultně je nastaven na “none” [4]
allow-update { none; };
listen-on port 53
  • služba BIND bude poslouchat jen na specifických rozhraních
  • defaultně je nastaven na “any”
  • níže příklad, kdy služba BIND bude poslouchat na link-local a 192.168.0.99 IP adrese
listen-on port 53 { 127.0.0.1; 192.168.0.99; };
version, hostname a server-id
  • skryje verzi hostname a server-id BIND serveru
  • defaultně zobrazuje BIND verzi, hostname i server-id
  • skrytím útočník nebude prohledávat známe chyby v dané verzi BIND
version "version not currently available";
hostname "hostname not currently available";
server-id "server-id not currently available";
dnssec-validation
  • validuje odpověď z DNSSEC enabled zón [1]
  • od verze BIND 9.11-ESV je defaultně nastaven na “auto” [9]
  • pro nižší BIND verze je nutné explicitně zadat příkaz níže:
dnssec-validation auto;
empty-zones-enable
  • pokud rekurzivní dotaz obsahuje jednu z privátních IP adres podle RFC1918, nebude se posílat na veřejný DNS server (ty je stejně nedokážou zpracovat) [1]
  • defaultně je nastaven na “yes”
empty-zones-enable yes;
minimal-responses
  • obyčejně se BIND snaží být nápomocný a zasílá dodatečné informace v DNS odpovědích. To zvětšuje DNS zprávu, která pak může být využita v DDoS útocích (pokud je náš DNS server rekurzivní a je otevřený do internetu) [3]
  • defaultně je nastaven na “yes”
  • forma ochrany proti amplification a DDoS útokům
  • pokud je příkaz nastaven na “yes” vypne se zasílání dodatečných informací a sníží velikost zprávy DNS odpovědi a tak “victim” nebude tolik zahlcena
minimal-responses yes;
minimal-any
  • ochrana proti amplification a DDoS útokům
  • defaultně je nastaven na “no”
  • stejně jako u příkazu minimal-responses – pokud je příkaz nastaven na “yes” vypne se zasílání dodatečných informací a sníží velikost zprávy DNS odpovědi a tak “victim” nebude tolik zahlcena
    • z mé praxe byl příkaz vyzkoušen na verzi BIND 9.16.1, nicméně velikost DNS odpovědi nebyla snížena
minimal-any yes;
rate-limit
  • omezí počet DNS dotazů
  • od verze BIND 9.9.4 je možné použít příkaz
  • defaultně vyplý [6]
  • ochrana proti amplification a DDoS útokům [5]
  • příkaz je doporučeno používat jen pro autoritativní servery [5]
  • je doporučovaný místo použití paketového filtru [8]
  • zde příklad, kdy BIND odpoví maximálně na 10 DNS dotazů za sekundu
rate-limit {responses-per-second 10; };

Příklad Zabezpečení BIND DNS serveru pro autoritativní server:

  • není zároveň rekurzivním a je otevřený do internetu [6].
options {
//snižuje riziko DNS amplification útoků
recursion no;

allow-query-cache { none; }

// zamezí přenášení zónových souborů
allow-transfer { none; };

// umocnění ochrany proti amplification a DDoS útokům 
// omezení počtu DNS dotazů na 15/sec
rate-limit {responses-per-second 15; };
// vypnutí dodatečných informací v DNS odpovědích
minimal-responses yes;
minimal-any yes;

// skrytí verze, hostname a server-id
version "version not currently available"; 
hostname "hostname not currently available"; 
server-id "server-id not currently available";

};

Pozn. pokud je nastaveno recursion no;, nastaví se defaultně “allow-query-cache { none; }”; viz. [7] a je ignorováno vše v příkazu allow-recursion

Příklad Zabezpečení BIND DNS serveru pro rekurzivní server:

acl "acl_trusted_clients" { localhost; 192.168.0.0/24; };

options {

// ochrana proti IP spoofingu
allow-recursion { acl_trusted_clients; };
allow-query-cache { acl_trusted_clients; };

// zamezí přenášení zónových souborů
allow-transfer { none; };

// vypnutí dodatečných informací v DNS odpovědích
minimal-responses yes;
minimal-any yes;

// skrytí verze, hostname a server-id
version "version not currently available"; 
hostname "hostname not currently available"; 
server-id "server-id not currently available";

};

Restart služby BIND:

service bind9 restart

Alternativně restart pomocí:

systemctl restart bind9

Ověření nakonfigurovaných parametrů v named.conf.options souboru:

Bude předpokládáno, že nakonfigurovaný BIND server běží pod IP adresou 192.168.0.99

Ověření allow-recursion:

Dig:

dig @192.168.0.99 google.com +short

Výpis výše by měl ukázat IP adresu nebo IP adresy překladu.

Nslookup:

nslookup google.com 192.168.0.99

Výpis výše by měl ukázat IP adresu nebo IP adresy překladu.

Ověření allow-query:

Dig:

dig @192.168.0.99 <domenove jmeno v zonovem souboru> +short

Výpis výše by měl ukázat IP adresu nebo IP adresy překladu.

Nslookup:

nslookup <domenove jmeno v zonovem souboru> 192.168.0.99

Výpis výše by měl ukázat IP adresu nebo IP adresy překladu.

Ověření allow-transfer:

Dig:

dig axfr @192.168.0.99 <jmeno zony>

Pokud se zobrazí Transfer failed, je přenášení zónových souborů zakázáno

Nslookup:

nslookup
> server 192.168.0.99
> set type=any
> ls -d <jmeno zony>

Pokud se zobrazí The DNS server refused to transfer the zone <jméno zóny> to your computer, je přenášení zónových souborů zakázáno

Ověření, že BIND poslouchá na specifických rozhraních:

sudo lsof -P -i -n | grep named

Ověření skrytí version, hostname a server-id BIND serveru:

Dig:

dig +short @192.168.0.99 version.bind txt CH
dig +short @192.168.0.99 id.server txt CH
dig +short @192.168.0.99 hostname.bind txt CH

Nslookup:

nslookup -q=txt -class=CHAOS version.bind 192.168.0.99
nslookup -q=txt -class=CHAOS id.server 192.168.0.99
nslookup -q=txt -class=CHAOS hostname.bind 192.168.0.99

Ověření dnssec-validation:

sudo rndc validation check

Výpis příkazu výše by měl ukázat DNSSEC validation is enabled (view _default).

dig soa . @192.168.0.99 +adflag

Výpis příkazu výše by měl ukázat ad flag – flags: qr rd ra ad;

Ověření minimal-responses:

dig @192.168.0.99 ns google.com | grep rcvd

Výpis příkazu výše by měl ukázat velikost DNS odpovědi.

Ověření minimal-any:

dig @192.168.0.99 google.com any | grep rcvd

Výpis příkazu výše by měl ukázat velikost DNS odpovědi.

TIP:

Všechny bezpečnostní chyby BIND lze najít zde: https://kb.isc.org/docs/aa-00913

Verze bind:

named -v

Zdroje:

[1] https://github.com/mesche/bind-dns-server-basic-config/blob/master/named.conf.options

[2] https://security-24-7.com/hardening-guide-for-bind9-debian-platform/

[3] https://www.slideshare.net/MenandMice/a-secure-bind-9-best-practices

[4] https://2mysite.net/docs/Pro_DNS_and_BIND/ch7/xfer.html

[5] https://kb.isc.org/docs/aa-00994

[6] https://bind9.readthedocs.io/en/latest/configuration.html

[7] http://www.zytrax.com/books/dns/ch7/queries.html#allow-query-cache

[8] https://kb.isc.org/docs/bind-best-practices-authoritative

[9] https://bind9.readthedocs.io/en/latest/dnssec-guide.html

[10] https://ondřej.caletka.cz/dl/slidy/20151214-CESNET-Sprava_a_zabezpeceni_DNS.pdf

Leave a Reply

Your email address will not be published. Required fields are marked *