NFsec Logo

Serwer DNScache z djbdns

21/08/2009 w Bezpieczeństwo 1 komentarz.  (artykuł nr 133, ilość słów: 1083)

D

jbdns jest zestawem programów, który uważany jest za bardzo bezpieczny do obsługi usług DNS (posiadają bardzo wysoką odporność na ataki DNS Amplification oraz Cache Poisoing). Programy te – autorstwa Daniela Julius’a Bernstein’a (znanego wcześniej z autorstwa programu Qmail) powstały w odpowiedzi na wiele błędów, niedociągnięć i luk odkrytych w programie BIND.

Oprócz standardowych programów do obsługi zapytań DNS w skład zestawu wchodzą: tinydns (autorytatywny serwer DNS), dnscache (serwer cache’ujący wpisy DNS), axfrdns (serwer udostępniający strefy do transferu dla zapasowych serwerów DNS). Podana poniżej konfiguracja służy do uruchomienia serwera DNS przechowującego przez pewien czas odpowiedzi z innych serwerów (ang. caching) w celu przyśpieszenia odpowiedzi na zapytania DNS przez maszynę, na której uruchomiony został taki serwer DNS, jak i zapytania maszyn (np. z sieci lokalnej), którym owy serwer DNS został udostępniony. Do instalacji pakietu djbdns (wersja 1.05) wymagany jest zestaw narzędzi do zarządzania usługami – daemontools (wersja 0.76); Interfejs Programu Klient-Serwer Uniksa używający protokołu TCP (ang. UCSPI – UNIX Client-Server Program Interface w wersji 0.88) oraz otwarty port 53 UDP (TCP – jeśli planujemy transfer stref pomiędzy głównym, a zapasowymi serwerami DNS lub obsługę alternatywnych zapytań DNS) w zaporze sieciowej. Pierwszym krokiem jest instalacja zestawu daemontools. Ze względu na konieczność deklarowania extern int errno z uwzględnieniem pliku errno.h w systemach Linux (co według autora programów jest sprzeczne z standardem IEEE Std 1003.1-1990 (POSIX)) przed kompilacją każdego programu wymagane jest nałożenie odpowiednich patchy, które usuwają ten błąd. Ponadto w instalacji programów uwzględniono patche autorstwa: Balazs’a Nagy’a (możliwość rozwijania wielu stref niezależnie), Jonathan’a de Boyne’a Pollard’a (poprawa tinydns-data, dnscache, tinydns oraz axfrdns) oraz Lennert’a Buytenhek’a (poprawa wydajności dzięki funkcji mmap() w tinydns). Instalację zestawu zaczynamy od kolekcji programów zarządzających usługami sieciowymi:

mkdir -p /package
chmod 1755 /package
mv daemontools.tar.gz /package
cd /package
tar -zxvf daemontools.tar.gz
cd /package/admin/daemontools/src
patch < /djbdns/daemontools_errnopatch
cd ..
./package/install

Po poprawnej instalacji pakietu powinnyśmy zobaczyć odpalony w liście procesów program svscan służący do startowania i monitorowania usług (ps aux | grep svscan):

root    2604  0.0  0.0   1720   372 ?     S    17:04   0:00 svscan /service

Oraz wpis dodany do pliku /etc/inittab:

SV:123456:respawn:/command/svscanboot

Uruchamiający program svscan w katalogu /service. Kolejnym krokiem jest instalacja UCSPI-TCP:

tar -zxvf ucspi-tcp.tar.gz
cd ucspi-tcp
patch < /djbdns/ucspi-tcp_errnopatch
patch < /djbdns/ucspi-tcp-periplimitpatch
make
make setup check

Ostatecznie przechodzimy do instalacji rdzennych programów naszego serwera DNS (kolejność aplikowania patchy jest bardzo ważna, ponieważ zostały one tak ułożone i zmodyfikowane by nie zakłócały swojego, wzajemnego działania):

tar -zxvf djbdns.tar.gz
cd djbdns
patch < /djbdns/djbdns_errnopatch
lub: echo gcc -O2 -include /usr/include/errno.h > conf-cc
patch < /djbdns/djbdns_temppatch
patch < /djbdns/djbdns_mdnsdatapatch
patch < /djbdns/djbdns_datasepatch
patch < /djbdns/djbdns_cnamepatch
patch < /djbdns/djbdns_aliaspatch
patch < /djbdns/djbdns_fmmappatch
patch < /djbdns/djbdns_dnsnamexpatch
patch < /djbdns/djbdns_forwardpatch
patch < /djbdns/djbdns_spacepatch
make
make setup check

Poprawny proces instalacji powinien ukazać nam następujące komunikaty na wyjściu:

./install
./instcheck

Oraz zainstalować djbdns wraz z wszystkimi narzędziami do /usr/local/bin. Przed właściwą konfiguracją dnscache należy dodać odpowiednich użytkowników do systemu z prawami których będą odpalane poszczególne serwery:

useradd -s /sbin/nologin -d /dev/null tinydns
useradd -s /sbin/nologin -d /dev/null dnslog
useradd -s /sbin/nologin -d /etc/syncdns syncdns
useradd -s /sbin/nologin -d /dev/null dnscache
passwd -l tinydns dnslog syncdns dnscache

Na końcu należy zadbać o przeprowadzenie aktualizacji pliku /etc/dnsroots.global z rzeczywistym stanem głównych serwerów DNS:

mv /etc/dnsroots.global /etc/dnsroots.global.old
dnsip `dnsqr ns . | awk '/answer:/ { print $5; }' | sort` > /etc/dnsroots.global

Na tym etapie skonfigurujemy dnscache jako cachujący serwer nazw, który będzie odpowiadał na zapytania DNS upoważnionym hostom. Istnieją dwa typy serwerów cachujących: wewnętrzne i zewnętrzne. Wewnętrzny serwer nazw jest po prostu serwerem działającym na adresie lokalnego komputera – 127.0.0.1 lub odpowiadającej mu nazwie mnemonicznej – localhost i wykorzystywanym jedynie przez niego. Zewnętrzny serwer nazw jest ulokowany na publicznym adresie IP, do którego posiadają dostęp zewnętrzne maszyny wykorzystujące go do zapytań DNS. Poniżej zostaną przedstawione obydwa scenariusze konfiguracji wewnętrznego i zewnętrznego serwera DNS:

mkdir /var/lib/svscan
dnscache-conf dnscache dnslog /var/lib/svscan/dnscache 127.0.0.1
cd /var/lib/svscan/dnscache
dd if=/dev/random of=seed bs=128 count=1
ln -s /var/lib/svscan/dnscache /service

Po wydaniu powyższych poleceń nasz wewnętrzny serwer DNS powinien być gotowy, a polecenie: ps aux | grep dnscache powinno zwrócić wynik:

root     3048 0.0 0.0 1556   320 ?      S  20:07 0:00 supervise dnscache
dnscache 3050 0.0 0.1 2988  1588 ?      S  20:07 0:00 /usr/local/bin/dnscache
root     3057 0.0 0.0 2096   776 pts/0  R+ 20:09 0:00 grep dnscache

Aby skorzystać z naszego serwera DNS wystarczy dodać jego adres do pliku konfiguracyjnego obsługi nazw (resolver’a):

echo 'nameserver 127.0.0.1' > /etc/resolv.conf

Kilkoma poleceniami możemy sprawdzić działanie naszego serwera nazw:

dnsq a www.google.com 198.41.0.4
dnsip www.google.com
dnsmx google.com
ping www.google.com
tail -f /service/dnscache/log/main/current

Zewnętrzny serwer DNS, który będzie świadczył usługi dla naszej sieci LAN (np. 192.168.0.0) skonfigurujemy poprzez polecenia:

dnscache-conf dnscache dnslog /var/lib/svscan/dns2cache 192.168.0.1
cd /var/lib/svscan/dns2cache
dd if=/dev/random of=seed bs=128 count=1
touch /var/lib/svscan/dns2cache/root/ip/192.168.0
ln -s /var/lib/svscan/dns2cache /service

W powyższych poleceniach została użyta nazwa katalogu dns2cache, ze względu na fakt, iż dnscache jest już zajęta poprzez wewnętrzny serwer. Gdy planujemy operować tylko jednych serwerem, wówczas nazwa katalogu nie jest tak istotna. Polecenie tworzące pusty plik 192.168.0 dodaje uprawnione komputery znajdujące się w tej klasie sieci do korzystania z naszego serwera DNS. Standardowo pojemność pamięci cache ustawiona jest na 100000 bajtów – w przybliżeniu 1 MB. Po osiągnięciu tej granicy pamięć ta zostanie automatycznie wyczyszczona. Jeśli pragniemy zwiększyć ten limit np. do 10 MB, co powinno w zupełności wystarczyć dla małej firmy z dostępem do poczty i WWW poprzez łącze 512 KB/s należy wydać komendy:

echo 10000000 > /service/dnscache/env/CACHESIZE
echo 12000000 > /service/dnscache/env/DATALIMIT

Opcja DATALIMIT jest zabezpieczeniem “w razie wypadku”, gdyby w nieprzewidziany sposób pojawił się błąd powodujący niekontrolowany rozrost pamięci cache. Dlatego wielkość określana w tej opcji powinna być zawsze trochę większa od ustalonej wielkości pamięci cache. Po modyfikacji wielkości pamięci najlepiej ją wyczyścić poprzez polecenie:

svc -t /service/dnscache (resetuje pamięć wewnętrznego serwera DNS)
svc -t /service/dns2cache (resetuje pamięć zewnętrznego serwera DNS)

Bonus:Istnieje również możliwość przekazania wszystkich zapytań DNS do serwerów OpenDNS. Wówczas nasz serwer cacheDNS zapamięta wyniki pytań z serwerów OpenDNS w pamięci podręcznej. Na późniejsze pytania o ten sam adres IP, odpowiedzi będą już podawane z pamięci podręcznej bez potrzeby czekania aż odpowiedz przyjdzie z serwerów OpenDNS. By uzyskać następujący efekt należy wykonać polecenia:

echo 1 > /etc/dnscache/env/FORWARDONLY
echo 208.67.220.220 > /etc/dnscache/root/servers/@
echo 208.67.222.222 >> /etc/dnscache/root/servers/@
svc -t /service/dnscache

Przekazywanie zapytań DNS do serwerów OpenDNS dla zewnętrznego serwera DNS przeprowadza się w ten sam sposób.

Więcej informacji: DNS, djbDNS Home, djbDNS Rocks, Life With djbDNS, Tiny DNS OpenDNS

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , , ,

1 komentarz.

  1. W dystrybucji Debian Lenny instalacja serwera djbdns ogranicza się do wydania poleceń:

    apt-get install djbdns
    apt-get install dnscache-run