Bind tips and tricks

Podstawowa konfiguracja serwera DNS wydaje się być sprawą prostą. Niestety, jeżeli chcemy wystawić publicznie nasz DNS trzeba nieco dokładniej przyjrzeć się jego ustawieniom aby nie paść m.in. ofiarą botów odpytujących DNSy w sieci.

Ten artykuł nie ma na celu pokazania zaawansowanej konfiguracji środowisk dla serwerów DNS zapobiegającym licznym znanym i mniej znanym exploitom oraz atakom flood czy DDOS. Pokazuje jedynie podstawowe ustawienia zabezpieczające serwer przed botami i prostymi atakami.

Na początek firewall.

Nim przejdziemy do konfiguracji samego serwera DNS dobrze przyjrzeć się konfiguracji firewalla na potrzeby zapytań po porcie 53. Poza samym umożliwieniem ruchu (co jest jakby oczywiste 😉 ) dobrze wykorzystać np. iptables do zabezpieczenia nas przed nadmiernym odpytywaniem DNS. W tym celu należy najpierw zdefiniować regułę zliczającą dostęp po porcie 53:

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --from 50 --algo bm --hex-string '|0000FF0001|' -m recent --set --name dnsanyquery

Reguła pokazana wyżej  zarejestruje wszystkie odpytania DNS typu ANY. Zastosowałem ją z dwóch powodów – po pierwsze zawiera ciekawą konfigurację rozpoznawania pakietów w oparciu o string (o czym jeszcze poniżej) a po drugie – boty masowo odpytujące serwery najczęściej korzystają właśnie z tego typy zapytań.

Opcjonalnie można zdefiniować interfejs wejścia czy algorytm wg którego będziemy odkodowywali string z wartości szesnastkowych. Wszystko wg ogólnych zasad konfiguracji iptables. Można też zrezygnować z rozpoznawania typu zapytania poprzez string i rozszerzyć regułę na cały ruch po porcie 53:

iptables -A INPUT -i eth0 -p udp --dport 53  -m recent --set --name dnsanyquery

Aby nasze zabezpieczenie zadziałało, do pierwszej reguły musimy dopisać kolejną, która będzie odpowiedzialna za zliczanie odwołań i blokowanie zapytań jeżeli limit zostanie przekroczony:

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --from 50 --algo bm --hex-string '|0000FF0001|' -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 5 -j DROP

Mechanizm ten łączy reguły po parametrze –name (w naszym przykładzie dnsanyquery) i sprawdza ilość wystąpień (–hitcount) w podanym czasie (–seconds) . Jeżeli sprawdzenie zwróci true reguła zostanie użyta, w tym przypadku z akcją DROP co zablokuje kolejne wywołania do następnego sprawdzenia (czyli 60 sekund wg konfiguracji reguły).

Zastosowanie takich reguł pozwoli nam obronić się przed bezmyślnymi botami, które zalewają serwer setkami odpytań w ciągu minuty.

Jeszcze trochę firewall.

Mając publiczny serwer DNS w naszej infrastrukturze watro bliżej zaprzyjaźnić się z regułami iptables pozwalającymi filtrować pakiety po ich zawartości.

Użycie ich pozwoli nam odfiltrować zapytania o konkretne domeny. Oczywiście, reguły takie trzeba dodawać ręcznie, co może być mozolną pracą, ale pozwoli nam uchronić się przed botami zalewającymi nas odpytaniami o konkretną domenę oraz wyłączyć odpytania o domeny z kryminalną zawartością (jeżeli takowe odfiltrujemy).

Reguły zawierające dopasowanie po zawartości pakietu zapisujemy w następujący sposób (tu przykład dla domeny test.com):

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --hex-string "|04|test|03|com" --algo bm -j DROP

Do sprawdzania czy pakiet zawiera wskazany przez nas ciąg używamy parametru –hex-string, w którym podajemy żądaną przez nas domenę. Zgodnie z DNS RFC 1035 w zapytaniach DNS jest ona reprezentowana przez etykiety oktetów rozdzielone liczbą oktetów w etykiecie. W praktyce oznacza to, że w domenie zastępujemy kropki liczbą znaków po kropce (do następnej kropki) zapisaną w formacie heksadecymalnym. Dodatkowo wartości heksadecymalne muszą być zamknięte pomiędzy znacznikami | .

Nazwę domeny możemy również podać od razu przekształconą do formatu hex (z literami zapisanymi szesnastkowo), gdzie również poszczególne etykiety poprzedzamy ich długością zapisaną heksadecymalnie.

Konfiguracja BIND.

Kiedy już przygotowaliśmy się na odpowiednie filtrowanie wejścia pakietów na serwera DNS możemy wprowadzić zmiany w konfiguracji samego BINDa.

Na początek warto przyjrzeć się opcji: rate-limit umieszczanej w sekcji options. Jej użycie pozwala ograniczyć ilość zapytań do serwera DNS na sekundę. Nie jest to oczywiście rozwiązanie tak skuteczne jak wspomniane wyżej reguły iptables bo zapytania i tak trafią do BINDa, nie zwróci on po prostu odpowiedzi, ale jest do dobre zabezpieczenie na chwilowy wzrost ruchu. Poza tym opcji tej można użyć z log-only , co pozwoli nam oszacować ile requestów przekracza limit i jaka jest skala ewentualnych problemów.

Przykładowe użycie rate-limit wygląda następująco:

rate-limit {
    responses-per-second 10;
    log-only yes;
};

Warto również zmienić domyślną wartość minimal-responses na yes. Zmiana ta spowoduje, że odpowiedzi na żądanie wysyłane będą tylko żądane dane bez dodatkowych informacji (typu delegacje czy odpowiedzi negatywne), co zmniejszy wolumen zwracanych danych i może wpłynąć na wydajność.

Podsumowując.

Konfiguracja BIND zawiera jeszcze kilka przydatnych i ciekawych opcji m.in. deny-answer-addresses umożliwiającą blokowanie odpowiedzi zawierających określone adresy IP czy deny-answer-aliases blokującą zapytanie zwracające CNAME / DNAME ze zdefiniowanej listy. Można także zdefiniować dyrektywę blackhole gdzie podajemy listę adresów IP (bądź zakresów adresów), którym nie będzie odpowiadał nasz serwer.

Wszystkie te opcje są niezwykle przydatne i bardzo usprawniają konfigurację oraz zabezpieczenie naszego serwera, należy jednak pamiętać, że aby zostały uruchomione zapytanie musi trafić do aplikacyjnego serwera DNS. Dla większości z tych opcji można zbudować ekwiwalenty w postaci reguł iptables co ma tę przewagę, że pozwala „wyciąć” niechciany ruch jeszcze przed dotarciem do BINDa i obciążeniem jego oraz maszyny.

Osobną kwestią jest przygotowanie odpowiedniego logowania działania dla naszego serwera BIND. Jest to jednak zagadnienie na tyle szerokie, że należałoby mu poświęcić osobny artykuł.

Podziel się:

Mikołaj Niedbała

I'm a Poland based IT administrator, linux administrator and IT engineer creating professional IT infrastructure solutions based on Linux and virtual environments.

One thought to “Bind tips and tricks”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *