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.
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 #.
127.0.0.1 | localhost | |
127.0.1.1 | proto01.lab.fi.muni.cz | |
10.0.0.1 | erigona.lab.fi..muni.cz | #vstupni brana do internetu |
147.251.48.3 | anxur.fi.muni.cz | #zaměstnanecký server |
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).
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.
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.