Publiczne rekurencyjne serwery DNS - reguły iptables

16

Na komputerach z systemem Linux obsługujemy rekurencyjne serwery DNS z dostępem publicznym. Byliśmy wykorzystywani do ataków polegających na wzmocnieniu DNS. Czy są jakieś zalecane iptablesreguły, które pomogłyby złagodzić te ataki?

Oczywistym rozwiązaniem jest po prostu ograniczenie wychodzących pakietów DNS do określonego poziomu ruchu. Miałem jednak nadzieję znaleźć coś bardziej sprytnego, aby atak po prostu zablokował ruch do adresu IP ofiary.

Szukałem porad i sugestii, ale wszystkie wydają się „nie uruchamiać publicznych serwerów rekurencyjnych”. Niestety powróciliśmy do sytuacji, w której rzeczy, które nie są łatwe do zmiany, ulegną zniszczeniu, jeśli tego nie zrobimy, a to z powodu decyzji podjętych ponad dziesięć lat temu, zanim te ataki były problemem.

David Schwartz
źródło
2
Osoby odradzające ci prowadzenie publicznego rekurencyjnego serwera nazw mają rację. Czy możesz wyjaśnić, dlaczego wydaje się to konieczne?
Alnitak,
1
@Alnitak: Rzeczy, które nie są łatwe do zmiany, ulegną zniszczeniu, jeśli nie zrobimy tego z powodu decyzji podjętych ponad dziesięć lat temu.
David Schwartz,
tak, widziałem to w pierwotnym pytaniu. Czy możesz wyjaśnić, dlaczego taka konfiguracja jest konieczna?
Alnitak,
2
@Alnitak: Ponieważ rzeczy, które nie są łatwe do zmiany, polegają na tym. Są to urządzenia z wypalonym oprogramowaniem i rozmieszczone na całym świecie, wiele w bezpiecznych obiektach, do których nawet nie mamy dostępu.
David Schwartz,
Czy Twoje systemy wbudowane obsługują rozpoznawanie nazw TCP zamiast UDP? Jeśli tak, jak łatwo byłoby wyłączyć UDP dla rozwiązania?
Mike Pennington,

Odpowiedzi:

9

Całe to cuchnie scenariuszem „nie mój problem”, który tak naprawdę nie jest twoją winą i powinien / powinien zostać rozwiązany w 100% przez podjęcie odpowiednich działań, niezależnie od tego, jak „trudne” lub „trudne”, i to kończy twoje otwórz serwer rekurencyjny .

Wycofaj to: powiedz klientom, że ten serwer odchodzi od X dnia. Po tym czasie muszą zainstalować łatkę (zakładając, że ją masz), aby uniemożliwić jej korzystanie z serwera DNS. Robi się to cały czas. Administratorzy, administratorzy sieci, pracownicy działu pomocy technicznej, programiści? My się go; ta rzecz związana z końcem życia zdarza się cały czas, ponieważ jest to standardowa procedura dla dostawcy / usługodawcy / partnera, która mówi nam, abyśmy przestali używać czegoś po dacie X. Nie zawsze nam się to podoba, ale to fakt życia w IT.

Mówisz, że nie masz tego problemu na bieżących urządzeniach, więc zakładam, że rozwiązałeś ten problem za pomocą aktualizacji oprogramowania układowego lub poprawki. Wiem, że powiedziałeś, że nie możesz dotknąć urządzenia, ale na pewno mogą? Chodzi mi o to, że jeśli zezwalają na to, aby te skrzynki zasadniczo dzwoniły do ​​ciebie, nie mogą być aż tak analne, jeśli chodzi o to, kto robi to z ich urządzeniami; możesz mieć odwrotną konfigurację proxy dla wszystkich, którzy wiedzą, więc dlaczego nie mieliby zainstalować łatki, która to naprawia, lub nakazać im korzystanie z własnych serwerów DNS . Z pewnością twoje urządzenie obsługuje DHCP; Nie mogę myśleć o urządzeniu sieciowym (nie ważne ile lat / wątły / nieparzysty) nie ma .

Jeśli nie możesz tego zrobić, następną rzeczą do zrobienia jest kontrolowanie, kto może uzyskać dostęp do twojego serwera rekurencyjnego : mówisz, że „trudno jest powiedzieć”, kto go używa i jak, ale nadszedł czas, aby się upewnić i zacząć ograniczać ruch, który niezgodne z prawem.

To są organizacje „quasi-wojskowe / rządowe”, prawda? Cóż, prawdopodobnie są częścią legalnego bloku sieciowego, którego są właścicielami; urządzenia te nie są routerami domowymi za dynamicznymi adresami IP. Dowiedzieć się. Skontaktuj się z nimi, wyjaśnij problem i zaoszczędź dużo pieniędzy, nie zmuszając do wymiany oprogramowania układowego lub produktu, jeśli tylko mogą potwierdzić adres blokady sieci / adres IP, którego urządzenie będzie używać do uzyskania dostępu do serwera DNS.

Odbywa się to cały czas: mam kilku klientów, którzy w ten sposób ograniczają dostęp do ekstranetu lub słuchaczy HL7 partnerom opieki zdrowotnej; to nie jest takie trudneaby zmusić ich do wypełnienia formularza i podania adresu IP i / lub blokady sieci, powinienem oczekiwać ruchu z: jeśli chcą uzyskać dostęp do ekstranetu, muszą podać adres IP lub podsieć. I rzadko jest to ruchomy cel, więc nie jest tak, że będziesz codziennie zalewany setkami żądań zmiany adresu IP: duże sieci szpitali kampusowych, które posiadają własne bloki sieciowe z setkami podsieci i tysiącami adresów IP hosta rutynowo dają mi garść adresów IP lub podsieci, których powinienem się spodziewać; znowu, nie są to użytkownicy laptopów błąkający się po całym kampusie, więc dlaczego miałbym oczekiwać pakietów źródłowych UDP z ciągle zmieniającego się adresu IP? Oczywiście zakładam, że jestem tutaj założeniem, ale założę się, że nie jest tak dużo, jak myślisz dla <100 urządzeń. Tak, będzie to długa lista ACL i tak,

Jeśli z jakiegoś powodu kanały komunikacji nie są otwarte (lub ktoś zbyt się boi lub nie może mieć trudności z skontaktowaniem się z tymi starszymi właścicielami urządzeń i zrobieniem tego poprawnie), musisz ustalić linię odniesienia normalnego użytkowania / aktywności, abyś mógł sformułować inna strategia, która pomoże (ale nie uniemożliwi) udział w atakach polegających na wzmocnieniu DNS.

Długotrwały tcpdumppowinien działać filtrowanie przychodzącego UDP 53 i pełne logowanie do aplikacji serwera DNS. Chciałbym również zacząć zbierać źródłowe adresy IP / bloki sieciowe / informacje geoIP (czy wszyscy twoi klienci w USA? Blokują wszystko inne), ponieważ, jak mówisz, nie dodajesz żadnych nowych urządzeń, po prostu przekazujesz dziedzictwo obsługa istniejących instalacji.

Pomoże to również zrozumieć, jakie typy rekordów są wymagane i dla jakich domen, przez kogo i jak często : aby wzmocnienie DNS działało zgodnie z przeznaczeniem, osoba atakująca musi mieć możliwość żądania dużego typu rekordu (1) do działająca domena (2).

  1. „duży typ rekordu”: czy twoje urządzenia potrzebują nawet rekordów TXT lub SOA, aby móc je rozwiązać za pomocą rekurencyjnego serwera DNS? Możesz określić, które typy rekordów są prawidłowe na serwerze DNS; Wierzę, że jest to możliwe dzięki BIND i być może Windows DNS, ale trzeba by było trochę kopać. Jeśli Twój serwer DNS odpowiada SERVFAILna dowolne rekordy TXT lub SOA, a przynajmniej ta odpowiedź jest rzędu wielkości (lub dwóch) mniejsza niż zamierzony ładunek. Oczywiście nadal jesteś „częścią problemu”, ponieważ sfałszowana ofiara nadal otrzymywałaby te SERVFAILodpowiedzi z twojego serwera, ale przynajmniej nie hamujesz ich i być może twój serwer DNS zostaje „usunięty” z zebranych list (y) z upływem czasu boty używają do „nie współpracowania”.

  2. „działająca domena”: możesz dodać do białej listy tylko te domeny, które są prawidłowe. Robię to w moich hartowanych konfiguracjach centrum danych, w których serwery potrzebują tylko Windows Update, Symantec itp. Do działania. Jednak łagodzisz tylko szkody, które wyrządzasz w tym momencie: ofiara nadal byłaby bombardowana przez serwer NXDOMAINlub SERVFAILodpowiadałaby na niego, ponieważ serwer nadal reagowałby na fałszywe źródłowe IP. Ponownie skrypt Bot może również automatycznie aktualizować swoją otwartą listę serwerów na podstawie wyników, więc może to spowodować usunięcie twojego serwera.

Użyłbym także pewnego rodzaju ograniczenia prędkości, jak sugerowali inni, albo na poziomie aplikacji (tj. Rozmiar wiadomości, żądania na klienta) albo na poziomie zapory ogniowej (zobacz inne odpowiedzi), ale znowu, masz zamiar musisz przeprowadzić analizę, aby upewnić się, że nie zabijasz legalnego ruchu.

System wykrywania włamań, który został dostrojony i / lub przeszkolony (ponownie, tutaj potrzebny jest poziom podstawowy), powinien również być w stanie wykrywać nienormalny ruch w czasie według źródła lub głośności, ale prawdopodobnie wymagałby regularnej opieki nad dziećmi / strojenia / monitorowania, aby zapobiec fałszywym pozytywom i / lub sprawdź, czy faktycznie zapobiega atakom.

Pod koniec dnia musisz się zastanowić, czy cały ten wysiłek jest tego wart, czy też powinieneś po prostu nalegać, aby zrobić właściwą rzecz, a to przede wszystkim eliminuje problem.

gravyface
źródło
1
Cóż, łatka nie jest możliwa. Nie mamy nawet działającego sprzętu do kompilacji dla niektórych platform. Co do netblocka, z którego oczekują ruchu, generalnie nie wiedzą. Nie jestem pewien, czy doceniasz to, jak niezwykłe jest środowisko, w którym znajdują się niektóre z tych urządzeń. Niektóre znajdują się w sieciach prywatnych, w których mają własny schemat DNS, i może nawet nie być nikogo w pobliżu, kto wiedziałby nawet, jak skonfigurowano system w górę. Zasadniczo musimy tylko działać do momentu zakończenia umowy.
David Schwartz,
W takim razie najlepsze, co możesz zrobić, to rozwiązać problem ograniczania stawek, chyba że zechcesz przeprowadzić analizę. Szczerze mówiąc, jeśli systemy te są statyczne / zaniedbane, istnieje prawdopodobieństwo, że ich ślad nie ulegnie zmianie i prawdopodobnie można uciec z listami ACL warstwy 3 według źródłowego adresu IP po zebraniu ich wszystkich.
gravyface,
1
Myślę o podejściu hybrydowym. Umieść adresy IP na białej liście, które możemy zidentyfikować (być może poddać je wysokiemu limitowi). Poddaj innym adresom IP dość niski limit. Okresowo kontroluj, czy jakieś adresy IP muszą znajdować się na białej liście lub zostać usunięte z białej listy.
David Schwartz,
@DavidSchwartz możesz nie potrzebować nawet wysokiego limitu. Ponownie, posiadanie linii bazowej legalnego ruchu bardzo by pomogło.
gravyface,
6

To zależy od rodzaju ograniczenia stawki, które chcesz zrobić.

Ograniczanie iptablesprędkości za pomocą jest bardziej przeznaczone do ograniczania przychodzących pakietów, ponieważ pakiety do limitu będą pasować do filtra i zostaną zastosowane określony cel (np ACCEPT.). Prawdopodobnie miałbyś kolejny cel na DROPpakiety, które nie są dopasowane przez filtr. I choć iptablesma QUEUEcel, po prostu przekazuje pakiet do przestrzeni użytkownika, gdzie należy dostarczyć własną aplikację kolejkującą. Możesz również oceniać limit pakietów wychodzących, ale niewiele osób naprawdę chce zacząć zmniejszać ruch wychodzący.

iptables obniżenie limitu stawki:

iptables -A INPUT -p udp --port 53 -m hashlimit --hashlimit 1/minute --hashlimit-burst 5 -j ACCEPT
iptables -A INPUT -p udp --port 53 -j DROP

Użycie hashlimitzamiast limitdaje ograniczenie stawki dla docelowego adresu IP. To znaczy, pięć pakietów do wersji hashlimit8.8.8.8, które osiągną limit, zapobiegną wysyłaniu pakietów do wersji 8.8.4.4, natomiast jeśli maksymalna wersja 8.8.8.8 jest maksymalna, nadal możesz osiągnąć wersję 8.8.4.4, co brzmi bardziej jak chcesz.

Jeśli nie chcesz, aby pakiety przekraczające limit były usuwane, to tak naprawdę chcesz tc. tcbędzie regulować przepływ, aby uzyskać przyjemny, stały strumień, a nie dużo dużego ruchu. Po stronie przychodzącej pakiety są dostarczane do aplikacji wolniej, ale wszystkie zostaną dostarczone w odpowiedniej kolejności. Na wychodzących pakietach opuści twoją aplikację tak szybko, jak to możliwe, ale zostanie umieszczony na przewodzie w spójnym strumieniu.

Nie korzystałem tcdużo, ale oto przykład ograniczenia ICMP, które prawdopodobnie można łatwo dostosować do DNS.

bahamat
źródło
1
Mój artykuł w języku francuskim na temat tej konfiguracji (używany do rzeczywistego otwartego resolvera): bortzmeyer.org/rate-limiting-dns-open-resolver.html
bortzmeyer
4

Oto jedna z rzeczy, które możesz zrobić, aby potencjalnie ograniczyć odpowiedzi na sfałszowane zapytania, ale zajmuje to trochę pracy:

Najpierw spójrz na swój dziennik kanału bezpieczeństwa i znajdź adres IP, który się fałszuje.

Następnie uruchom tcpdump używając tego źródłowego adresu IP (10.11.12.13) w następujący sposób:

tcpdump -n src 10.11.12.13 and udp dst port 53 -v -X -S

Otrzymasz coś takiego:

18: 37: 25.969485 IP (tos 0x0, tl 52, id 46403, przesunięcie 0, flagi [brak], proto: UDP (17), długość: 45) 10.11.12.13.51169> 01.02.03.04. Domena: 4215+ DOWOLNA ? . (17)
        0x0000: 4500 002d b543 0000 3411 b9d9 0A0B 0C0D E ..-. C..4 .......
        0x0010: 0102 0304 c7e1 0035 0019 0e89 1077 0100 ....... 5 ..... z ..
        0x0020: 0001 0000 0000 0000 0000 ff00 0100 ..............

Teraz część zabawy! Otwórz rfc1035 na http://tools.ietf.org/html/rfc1035 i przejdź do sekcji 4.1.1.

Czas przetłumaczyć wyniki tcpdump i wymyślić wzorzec, którego możemy użyć do stworzenia filtru poziomu pakietów.

Identyfikator nagłówka zaczyna się od 0x1C, więc mamy kilka flag w 0x1E, QDCOUNT w 0x20, ANCOUNT w 0x22, NSCOUNT w 0x24 i ARCOUNT w 0x26.

To pozostawia rzeczywiste pytanie o wartości 0x28, która w tym przypadku jest pusta (ROOT) dla NAZWY, 0xFF dla QTYPE = DOWOLNY i 0x01 dla QCLASS = IN.

Krótko mówiąc, stwierdziłem, że dodanie następujących reguł iptables blokuje ponad 95% sfałszowanych zapytań, które żądają DOWOLNYCH rekordów W ROOT:

iptables -A INPUT -p udp --dport domain -m u32 --u32 "0x28=0x0000ff00" -j DROP

Twój przebieg może się różnić ... mam nadzieję, że to pomoże.

Chris Bennett
źródło
3

Stosowanie tci kolejkowanie dyscyplin w systemie Linux dla portu wychodzącego 53 UDP:

IFACE=eth0    
tc qdisc  add dev ${IFACE} root handle 1: htb default 0
tc class  add dev ${IFACE} parent 1: classid 1:1 htb rate   10mbit burst 20m
tc qdisc  add dev ${IFACE} parent 1:1 handle 10: sfq perturb 1
tc filter add dev ${IFACE} protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:1

discUstawi Cię z ograniczeniem do 10 Mb dla dowolnego pakietu ze znakiem zapory ogniowej „1”. Oznaczenia zapory są wewnętrzne tylko dla zapory i nie modyfikują pakietu. Po prostu obsługa pakietu przez dyscyplinę kolejkowania. Oto jak używać iptablesoznaczeń zapory ogniowej:

iptables -A PREROUTING -o eth0 -p udp --sport 53 -t mangle -j MARK --set-mark 1
iptables -A PREROUTING -o eth0 -p udp --dport 53 -t mangle -j MARK --set-mark 1

Zmień według własnych upodobań, aby wykluczyć zaufane podsieci i / lub miejsca docelowe. -o eth0Ogranicza tylko do kształtowania pakietów wychodzących. Mam nadzieję że to pomoże.

Vince Berk
źródło
DNS używa UDP i TCP ...
Patrick Mevzek,
1

Spróbuję stworzyć listę wszystkich klientów, którzy polegają na twoich zewnętrznie zwróconych resolverach. Zacznij od około jednego dnia śladów pakietów na polach DNS. Następnie zacznij tworzyć reguły iptables, aby zezwolić na rozpoznawany i autoryzowany ruch. Domyślnie będzie to ostatecznie spadek ruchu do 53 / tcp i 53 / udp. Jeśli to coś zepsuje, dostosuj swoje zasady.

dmourati
źródło
1

w zależności od „pozycji” sieci, w której się znajdujesz [mając wiele kanałów bgp lub będąc na „końcu” Internetu - jako sieć pośrednicząca] możesz wypróbować coś takiego jak uRPF, aby zapobiec fałszowaniu adresu źródłowego.

inne źródło informacji.

pQd
źródło
Możesz użyć tylko uRPF, aby powstrzymać własnych klientów przed fałszowaniem. Więc jedyny sposób, w jaki uRPF zrobiłby mi coś dobrego, to jeśli zmusiłbym wszystkich do korzystania z niego. Nie martwię się atakami przeprowadzanymi przez moich własnych klientów. Martwię się atakami z Internetu. Nie ma możliwości uruchomienia uRPF na połączeniu innym niż klient. Albo routing asymetryczny jest normą (jeśli masz więcej niż jedno prawdziwe łącze), albo każda trasa wskazuje to połączenie (jeśli masz tylko jedno prawdziwe łącze).
David Schwartz,
@DavidSchwartz postanowiłem usunąć moją odpowiedź. Rozumiem, że nie jest to bardzo pomocne w twoim przypadku, ale może być przydatne dla innych. ciekawy przypadek btw - ciekawi mnie inne odpowiedzi.
pQd,
1

Czy te urządzenia są nadal objęte umową serwisową? Jeśli tak, skontaktuj się z klientami. Poinformuj ich, że w ostatnim dziesięcioleciu Internet ewoluował nieco, a aby nadal rozpoznawać nazwy tych urządzeń, musisz znać adres IP SRC, aby oczekiwać zapytań. Ustaw datę ~ 6 miesięcy w przyszłości, kiedy nie będziesz już w stanie obsługiwać nieznanych klientów i trzymaj się tego. Jest to dość powszechne w branży. Jeśli te urządzenia nie są już objęte umową serwisową ... brzmi jak decyzja biznesowa. Jak długo Twoja firma zamierza wydawać zasoby na starożytny produkt, który nie generuje już przychodów?

Brzmią jak wyspecjalizowane urządzenia, czy są one tak wyspecjalizowane, że można rozsądnie przewidzieć, w których domenach można spodziewać się wiarygodnych zapytań? bind obsługuje widoki, utwórz widok publiczny, który rekursuje tylko dla tych domen.

Wykorzystaj to jako okazję do nauki, jeśli jeszcze tego nie zrobiłeś, przestań wypuszczać produkty tam, gdzie nie masz możliwości naprawienia błędów. To jest właśnie błąd. Taki, który z pewnością sprawi EOL temu urządzeniu przedwcześnie, wcześniej czy później.

Jason Preston
źródło
1
Czytanie innych odpowiedzi. Mówisz, że tak naprawdę nie możesz nawet opracować łatki, ponieważ nie masz już sprzętu do jej przetestowania. W takim razie, jak ważne są którekolwiek z twoich obecnych umów wsparcia? Co byś zrobił, gdyby jedno z tych „obsługiwanych” urządzeń uległo awarii sprzętu? Zrób to samo tutaj.
Jason Preston
Nie obsługujemy sprzętu. Nie wolno nam nawet dotykać sprzętu. Jeśli sprzęt ulegnie awarii, zostanie zniszczony i wymieniony. Wspieramy zdalną infrastrukturę i musimy to robić na podstawie umowy do 2015 r. (Nie chodzi o to, że nie mamy sprzętu do testowania, ale o to, że nie możemy przeprowadzić testów. Wszelkie zmiany wymagają zatwierdzenia, które jest nie jest już możliwe, ponieważ wygasł standard zatwierdzania. Witamy w kontaktach z rządami.)
David Schwartz,
1

Gdzieś z nanog, to:

iptables -A INPUT -p udp --dport 53 -m hashlimit \
--hashlimit-name DNS --hashlimit-above 20/second --hashlimit-mode srcip \
--hashlimit-burst 100 --hashlimit-srcmask 28 -j DROP 

To nie jest idealne. Lepiej byłoby pozwolić na mniejszą liczbę pakietów na sekundę i mieć większy impuls.

Jan
źródło
-1

Oto rozwiązanie, którego użyłem kilka razy przeciwko atakom DDOS, nie jest idealne, ale pomogło mi. Rozwiązanie polega na tym, że cron wywołuje skrypt, który jest wywoływany co N minut (np. 1,2,3 itd.) I blokuje adresy IP, które tworzą liczbę połączeń większych niż podane w skrypcie:

#!/bin/sh

PORT_TO_CHECK="53"
CONNECTION_LIMIT="20"
IPTABLES="/sbin/iptables"

netstat -an > /tmp/netstat.tmp
Buf_var1=`cat /tmp/netstat.tmp | grep -v "LISTEN"| grep ":$PORT_TO_CHECK\ " | grep -v "0.0.0.0" | awk '{print $5}' | grep -v ":$PORT_TO_CHECK$" | sed -e 's/^::ffff://g' -e 's/:.*$//g' | sort | uniq`
i=0
banned_flag=0
for conn in `for i in $Buf_var1; do echo -n "$i "; cat /tmp/netstat.tmp | grep -c $i;done | grep -v "=\ 0"`;do
[ $i = 0 ] && connip=$conn && i=1
[ $i = 2 ] && {
connum=$conn
[ $connum -ge $CONNECTION_LIMIT ] && {
[ "$var_test" = "" ] && {
$IPTABLES -I INPUT -s $connip -j DROP
banned_flag=1
}
}
}
[ $banned_flag = 1 ] && i=0
[ $i = 1 ] && i=2
done
rm -f /tmp/netstat.tmp
Wrak logiki
źródło
3
Nie sądzę, żeby to zadziałało: DNS to żądanie / odpowiedź przez UDP i nie pozostawiaj otwartych połączeń.
bortzmeyer