DNS

Daniel Jakubík, jakubik (at) fi (dot) muni (dot) cz

Obsah

Stručný úvod

Přenosové protokoly Internetu TCP/IP identifikují jednotlivé uzly sítě pomocí takzvaných IP adres. V IPv4 je adresou 32bitové číslo, zapsané po jednotlivých bajtech, oddělené tečkami. S takovými to čísly se dobře pracuje počítačům, ale pro člověka není práce s nimi zrovna pohodlná. A protože člověk je tvor líný, snahy nahradit tyto numerické adresy lépe zapamatovatelným textem má svůj počátek již v sedmdesátých letech.

hosts.txt

Z počátku se překlad textových adres na číselné prováděl pomocí souboru hosts.txt, jehož aktuální verze se po síti distribuovaly pomocí služby FTP. Tento soubor pak musel být uložen na každém počítači připojeném k Internetu. Na počátku osmdesátých let se počet připojených počítačů přehoupl přes únosnou mez a musel se hledat jiný způsob překladu. Tak vznikla služba DNS která převzala tuto úlohu na sebe.

Ne všechny lokální sítě však využívají služeb DNS serveru. Ne vždy jej totiž potřebují. V malých sítích, která není připojena k Internetu, mohou i nadále mít uloženou vlastní tabulku jmen a odpovídajících IP adres počítačů. Taková tabulka se na unix like systémech ukládá do souboru /etc/hosts.

Tabulku tohoto typu můžete mít ve svém počítači uloženou i v případě že se ve Vaší síti nachází DNS server. Když se pokusíte vyhledat adresu nějakékoho počítače, prohledá se nejprve její obsah a až v případě neúspěchu se zašle dotaz DNS serveru.

Data jsou v souboru /etc/hosts se ukládají v jednoduchém tabulkovém formátu. V prvním sloupci je decimálně zapsaná IP adresa a ve druhém jsou uložena přidělená jména. Kromě toho je možné do souboru přidat libovolné komentáře, které jsou předsazeny znakem #.

Výsledná tabulka pak může vypadat nějak takto:
127.0.0.1localhost
127.0.1.1proto01.lab.fi.muni.cz
10.0.0.1erigona.lab.fi..muni.cz#vstupni brana do internetu
147.251.48.3anxur.fi.muni.cz#zaměstnanecký server


DNS. Jak funguje?

Domain Name System, známější pod svou zkratkou DNS, je internetový standard zahrnutý v TCP/IP. Slouží k překladu jmen objektů na IP adresy či jiné zdrojové záznamy (resource records). Jména objektů se označují jako doménová jména (domain name) a nejčastěji se jedná o jména hostitelů (hostname). Jsou to alfanumerické řetězce, které jsou lépe zapamatovatelné než IP adresy. Příkladem doménového jména je www.anxur.fi.muni.cz a k němu náleží IP adresa 147.251.48.3.

DNS nabízí i obrácený překlad, tedy překlad z IP adres na odpovídající hostname. K tomu se využívají tzv. PTR záznamy. Záznamy v DNS dnes existují nejen pro hostname, ale také pro řadu služeb. Nejpoužívanějším příkladem je MX záznam pro poštovní server. Díky tomu nemusíme znát ani jméno serveru ani jeho IP adresu, ale pouze doménu, pro kterou chceme poštovní server nalézt. To využívají ostatní poštovní servery, když chtějí doručit email (z emailové adresy zjistí doménu a k ní naleznou MX záznam, tedy cíl komunikace).

Protokol DNS využívá pro komunikaci porty TCP 53 a UDP 53. Definován je v RFC 1035 (a různé funkce v řadě dalších).

Doména
Pokud by se symbolická jména přidělovala z jediného jmenného prostoru, tento by byl velmi záhy vyčerpán, a musela by se začít používat i značně nesrozumitelná symbolická jména, což by vedlo k degradaci hlavní cíle systému DNS. Jediným řešením je vytvoření dostatečného počtu jmenných prostorů, ze kterých by bylo možné čerpat, a které by byly na vzájemně na sobě nezávislé. Právě to je podstata tzv. domén. Každá doména vlastně představuje jeden jmenný prostor ze kterého lze přidělovat bez ohledu na dění v jiných doménách. V rámci jednotlivých domén mohou být přidělováný další subdomeny. Tak vlastně vzniká doménový strom. Jeho kořenem je jednoduchá tečka, která se vlastní na domény nejvyšší úrovně (tj. org, com, cz, ..) a ty se následně dále dělí na domény nižších řádů.

DNS servery
Všechny domény jsou uloženy na kořenových serverech, což jsou DNS servery rozmístěné po celém světě. Každý z nich obsahuje kompletní tabulku všech domén do druhé úrovně. Primárním jmenným serverem domény je server, který ví o všech počítačích, jež se nacházejí v jeho doméně. Na druhé straně tento server zná pouze informace o své doméně.

Resolvery

Resolvery - programy, které získávají informace z nameserverů.

DNS má architekturu klient/server - server odpovídá za svou část adresního prostoru (tzv. zónu), popřípadě může fungovat jako cache. Každá doména vždy musí mít alespoň jeden primární DNS server, a dále může mít několik sekundárních serverů, jež mají za úkol tyhle informace číst z primárního DNS.

Když server obdrží od klienta dotaz, podívá se, co ví o dané doméně, a v případě, že doména nespadá do jeho kompetence, vrátí odkaz na server, který je blíže hledanému dotazu, a klient musí svůj dotaz zopakovat (dokud se nedostane k DNS serveru dané domény). Toto chování se nazývá iterativní. Jinou možností je chování rekurzivní, kdy se DNS server sám ujme zjišťování odpovědi a výsledek si zapamatuje, kdyby se dotaz opakoval (tj. poté funguje jako cache). Tyhle odpovědi jsou, na rozdíl od odpovědí od primárních nebo sekundárních DNS, považovány za neautoritativní.

Další úlohou je převod IP adresy na doménový název, pro kterou slouží doména in-addr.arpa. Jednotlivé sítě jsou poddoménami této domény, IP adresa se v opačném pořadí bajtů napíše před doménu in-addr.arpa a dotaz na tuto adresu vrátí její doménový název. Například zjištění doménového názvu pro adresu 147.251.48.1 je řešeno jako dotaz na adresu 1.48.251.147.in-addr.arpa.

Software

U většiny Linuxových distribucí je služba DNS poskytována serverem BIND (Berkeley Internet Name Domain server). Od verze 9.2.1 je BIND distribuován v jednom balíku. Instalace pak probíhá pomocí klasické trojice ./configure; make; make install;.

Bind obsahuje několik mechanismů pro zajištění bezpečnosti: umí běžet v chroot prostředí, umožňuje volbu uživatele a skupiny, pod kterými poběží. Tyto možnosti bychom měli v každém případě využít. V řadě standardních instalací linuxových distribucí těchto možností nebývalo využito, což pak vedlo ke snadnému kompromitování celého systému v případě úspěšného útoku.

Chroot prostředí v podstatě znamená, že určitá aplikace je uzamčena v určité vyhrazené části souborového systému, kterou považuje za kořenový adresář a mimo něj nevidí. V případě, že dojde k bezpečnostnímu incidentu, útočník může přistupovat pouze k datům v rámci adresářové struktury, která je přístupná v rámci daného prostředí chroot a možnost infiltrace ostatních částí systému je mizivá. Je samozřejmé, že aplikace přitom nesmí běžet s oprávněním uživatele či skupiny root. (Uživatel root může např. pomocí volání jádra mknod vytvořit potřebná speciální zařízení, přes která pak může přistupovat k diskům apod.)

Dejme tomu, že chceme name server provozovat v adresáři /bindroot a dále, že bind poběží pod za tímto účelem vytvořeným uživatelem dns ve skupině dns. Aby to mohlo fungovat, je potřeba aby v adresáři /bindroot byly obsažena veškerá data a adresářové struktury, které bind ke svému běhu potřebuje. Rovněž je třeba upravit přístupová práva tak, aby s daty mohl uživatel dns pracovat (t.j. např. nastavit rekurzívně v adresáři /bindroot/var/named, kde budou umístěna data týkající se jednotlivých zón, vlastníka na uživatele a skupinu dns, dále named potřebuje zapsat PID do souboru /bindroot/var/run/named.pid a pokud k logování nepoužijeme syslog, potřebuje práva k zápisu do adresáře, kde jsou logy umístěny).

/bindroot
|-- dev
| +-- null
|-- etc
| |-- group
| |-- localtime
| |-- named.conf
| +-- passwd
|-- usr
| +-- sbin
| |-- named
| +-- named-xfer
+-- var
|-- log
| |-- named.log
| +-- named_stats.log
|-- named
| |-- d.domena.cz
| |-- d.reverz-domena.cz
| |-- named.ca
| +-- secondary
| +-- d.domena2.cz
+-- run
|-- named.pid
+-- ndc

Na uživatelský účet bindu by také mělo být zakázáno přihlašování se jakýmkoliv způsobem.

Konfigurace BIND
Hlavní konfigurační soubor BINDu se jmenuje named.conf a nachází se v adresáři /etc (v chrootovaném prostředí to může být samozřejmě jinde). Jeho nejdůležitější parametry jsou options a zone:
options {...} - základní globální volby BINDu. Mezi nejdůležitější z nich patří:
  1. directory "cesta_k_adresáři" - určuje adresář ve kterém BIND bude hledat soubory s popisem jednotlivých zón
  2. auth-nxdomain {yes|no} - určuje, zda server může dát autoritativní odpověď o neexistenci domény
  3. forwarders {ip_adresa;ip_adresa} - specifikuje IP adresy DNS serverů, kterým se mají přeposílat dotazy. Za IP adresou může být ještě "port číslo_portu" které určuje port, na kterém vzdálený DNS server běží - například pro DNS server 123.4.56.7 kde server běží na síťovém portu 126 bychom zadali jako parametr "123.4.56.7 port 126".
  4. forward {only|first} - určuje, jestli má náš server pouze přeposílat dotazy DNS serverům definovaným ve forwarders (volba only), nebo se snažit hledat odpověď, pokud nadřazený DNS neodpoví (volba first)
  5. allow-query {ip_adresa[/podsíť];ip_adresa[/podsíť];...} - určuje stroje, které se mohou tohoto DNS serveru dotazovat
  6. allow-transfer {ip_adresa[/podsíť];ip_adresa[/podsíť];...} - určuje stroje, které mohou z tohoto serveru kopírovat informace o doménách

zone in {...} -určuje pravidla pro konkrétní zónu. Mezi nejdůležitější parametry patří:
  1. type {master|slave|hint|stub|forward} - určuje, v jakém režimu je server pro konkrétní zónu
  2. file "soubor" - definuje konfigurační soubor pro zónu

Více o nastavení bindu lze dočíst z manuálových stránek.

Literatura