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

By | 29/12/2021

Last Updated on 01/01/2023 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

Dobrovolný dar

Ahoj čtenáři, rád bych tě poprosil aby ses zamyslel, co je vše potřeba ke vzniku článku.
Jakožto amatérský softwarový kutil musím:

1) Nejdříve vše nastudovat v cizích jazycích.
2) Vše následně prakticky vyzkoušet.
3) Svoje poznatky a zkušenosti napsat do článku který si právě přečetl v jazyku kterému rozumíš.
4) Dát článku hlavu a patu a publikovat.

Každý článek zabere několik hodin práce, za kterou mi nikdo neplatí.
Prosím zvaž, kolik času jsem ti právě ušetřil.
Pokud ti to stojí aspoň za cenu jedné kávy, tak mi ji kup.
Předem moc děkuji.

Příspěvek tak můžeš provést zasláním libovolné částky na mé číslo účtu 1558701011/3030 Nebo můžeš dar poslat kliknutím na tento odkaz Podpořit tento WEB , který tě přesměruje na mou platební bránu Revolut.

Dar je také možné poslat ve formě Bitcoinu na BTC peněženku bc1qqdf5fp42a7srwwhh2rut8zr9x4jm5c8fqc9qw6

Veškeré peněžní prostředky budu také používat na zlepšení kvality své webové tvorby a na psaní nových technických návodů. Za každý dar předem děkuji.

Leave a Reply

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