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