Jump to content
Ganav

[TUT] Detectarea si prevenirea atacurilor de tip SYN flood pe statiile Linux(Ubuntu)

Recommended Posts

Posted (edited)

In acest tutorial se prezinta cateva mijloace prin care se poate limita impactul atacurilor de tip SYN flood. Un numar de utilitare este necesar apriori:

  • vnstat Acesta este un utilitar folosit in scopul monitorizarii latimi de banda(bandwith) utilizate.
  • htop Este o varianta detaliata a utilitarului top si permite monitorizarea tuturor resurselor sistemului(CPU,RAM, bandwith usage) la un nivel de granularitate mult mai ridicat
  • tcpdump este inclus in lista cu toate ca este incorporat in majoritatea distributiilor Linux. tcpdum permite monitorizarea traficului de retea, pe orice interfata intr-un mod usor de organizat de catre procesoarele de text(easy to grep)
  • rmmod Acesta permite detasarea(stergerea) unui modul din kernel-ul Linux. In trecut Linux folosea kernel-uri monolitice; adaugarea unei noi functionalitati necesita compilarea intregului kernel. In prezent kernel-ul are o structura modulara, fiecare modul poate fi compilat in parte si adaugat ulterior in kernel-ul existent. Se castiga astfel timp si eficienta in design software(dezvoltatorii nu mai trebuie sa fie familiarizati cu intreaga functionalitate a kernel-ului)
  • modprobe Acesta permite adaugarea si inlaturarea de module kernel
  • ethtool Acesta returneaza informatii privind interfetele de retea

Pentru instalarea utilitarelor rulam:


sudo sh -C "apt-get install vnstat;apt-get install htop;apt-get install tcpdump;apt-get install rmmod;apt-get install modprobe;apt-get install ethtool"

Acum putem implementa urmatoarele strategii de prevenire:

  1. Ce este un atac SYN flood? Moduri de detectare
  2. Activarea syncookie-urilor
  3. Folosirea de cozi implementate in hardware(hardware queues)
  4. Folosirea RPS (Received Packet Steering)
  5. iptables

1. Ce este un atac SYN flood? Moduri de dectare

Atacul SYN flood este o metoda denial-of-service(DoS) care afecteaza statiile care ruleaza procese(aplicatii/servicii/daemoni) TCP de tip server. Acesta are la baza starea de asteptare, implementata in protocolul TCP, in urma primirii unui pachet cu fanionul SYN setat, transmis catre un port aflat in stare de ascultare(LISTEN). Un atacator poate exploata acest lucru prin initierea consecutiva a unui numar ridicat de conexiuni incomplete, aflate in asteptare, astfel incat server-ul(tinta) nu mai poate initia alte legaturi valide.

Mai multe detalii pot fi gasite in RFC4987.

Atacul este relativ dificil de prevenit, unul din motivele pentru care are un ridicat grad de popularitate/raspandire. Motivele sunt, in mare, urmatoarele:

  • Se foloseste de pachete cu adrese IP sursa arbitrare, care nu pot fi blocate(putem bloca clienti legitimi) fiind specifice fiecarui pachet trimis
  • Consuma un numar redus din resursele atacatorului si un numar mare din cele ale victimei
  • Mecanismul de prevenire este relativ complex si necesita timp pentru intelegere si implementare

In timpul unui atac SYN, atacatorul deschide numeroase conexiuni catre server insa acestea nu sunt incheiate conform implementarii TCP. Starea fiecarei astfel de conexiuni va ramane in SYN_RECV(server-ul asteapta clientul sa termine conexiunea; sa primeasca un pachet cu fanioanele SYN/ACK setate si ulterior sa trimita un pachet cu fanionul ACK setat).

ddos_fig07.jpg

Putem numara conexiunile in asteptare ruland:

sudo netstat -anutp | grep SYN_RECV | wc -l

Daca numarul este mai mare ca si 40 sunt sanse destul de ridicate sa fim victima unui atac. Metoda de mai sus nu este totusi recomandata de a fi folosita in script-uri deoarece poate consuma resurse de procesare semnificative.

Putem monitoriza consumul latimii de banda folosind vnstat in felul urmator:

sudo vnstat -l -i eth0

htop poate fi, de asemenea, folosit pentru monitorizarea resurselor sistemului:

htop

Pentru a vedea itnreruperile in sistem apasam F2, navigam la "Display options" dupa care selectam "Display threads in a different color". Intreruperile vor fi afisate in roz.

Cu utilitarul tcpdump putem monitoriza toate pachetele receptionate:


sudo tcpdump -i eth0 -nn 'tcp port 80' and 'tcp[13] == 2' -c 250

Secventa de mai sus afiseaza primele 250 de pachete TCP care au portul destinatie 80 de pe interfata eth0. Un lucru important de retinut in privinta pachetelor este faptul ca acestea sunt receptionate la intervale de timp neregulate; daca am crea un grafic asociat traficului nu am observa numai valori maxime ci alternante neregulate intre valoarea maxima si o valoare mai mica ca si aceasta.

2. Activarea syncookie-urilor

syncookie-urile sunt un mod de a alege initial numerele de secventa TCP de catre server-ele TCP. Folosirea lor permite ca un server sa nu refuze conexiuni atunci cand coada SYN(SYN queue) este utilizata in intregime.

Server-ul percepe coada ca fiind extinsa. Acesta trimite inapoi clientului raspunsul SYN/ACK insa nu adauga o intrare in coada SYN. Daca server-ul receptioneaza un pachet ACK ulterior atunci acesta capabil sa reconstruiasca coada SYN pe baza informatiilor incluse in numarul de secventa TCP(TCP sequence number).

Pentru a verifica daca syncookies este activat rulam:

sysctl -n net.ipv4.tcp_syncookies

sau

cat /proc/sys/net/ipv4/tcp_syncookies

Pentru a activa syncookies executam:

sudo vim /etc/sysctl.conf

sau

sudo gedit /etc/sysctl.conf

dupa care adaugam linia:

net.ipv4.tcp_syncookies = 1

Salvam fisierul si rulam:

sysctl -p 

pentru a aplica modificarea.

3. Folosirea de cozi implementate in hardware(hardware queues)

Pentru a facilita prevenirea atacului SYN este recomandata imbunatatirea driver-ului NIC(Network Inerface Card). Cand un fragment de date ajunge prin cablu sau unde radio, in NIC, se executa o intrerupere sistem care comanda procesorului sa opreasca activitatea curenta si sa analizeze fragmentul(pachetul) receptionat. Insa, daca fiecare frame ar face acest lucru atunci orice transfer prin retea ar genera latente semnificative. Astfel, aceste intreruperi sunt structurate intr-o coada(queue, coada este o structura de tip LIFO, last-in-first-out. Cu alte cuvinte pachetele ajunse sunt stocate in spatele cozii iar cele care sunt de ja in coada sunt procesate incepand cu primul), care este livrata unitatii de procesare(CPU) deodata. Acest lucru are loc intre 200 si 1000 de ori pe secunda, in functie de cronometrul sistemului de operare. Cu cat acesta are o perioada mai redusa cu atat CPU-ul are mai mult de procesata(coada este transmisa mai rar si cu un nr. mai mare de elemente). Majoritatea calculatoarelor din prezent au mai multe unitati de procesare(Multicore CPUs). Deoarece, fiecare este un procesor in sine, trebuie sa distribuim numarul de intreruperi intr-un mod echilibrat intre acestea. Exista doua mijloace:

  • Folosirea cozilor hardware(hardware queues). NIC-urile moderne au numeroase cozi de intrerupere, intre 4-16. Pe Linux, acestea sunt dezactivate in mod implicit. Trebuiesc activate pentru a uzita intrega capacitate a unitatilor de procesare(CPU cores)
  • Cea de a doua metoda este prin RPS(Receive Packet Steering). Este un mecanism relativ nou care distribuie in mod automat intreruperile intre toate core-urile, neavand importanta prezenta cozilor hardware(acestea pot fi fie una singura fie un grup de cozi hardware). Aceasta metoda este recomandata doar daca numarul de cozi al NIC-ului este mai mic decat cel al core-urilor.

Aceasta sectiune trateaza cozile hardware, metoda RPS fiind dezvoltata in sectiunea urmatoare.

Primul pas consta in aflarea driver-ului de retea(NIC driver), a modelului NIC si a fabricantului:


sudo ethtool -i eth0

Acum trebuie sa instalam ultima versiune pentru respectivul NIC. Trebuiesc instalate ultimele driver-e; se gasesc in mod normal pe site-ul producatorului. Acestea trebuiesc, de regula compilate in diverse module. Acestea necesita codul sursa ale unor module kernel, care trebuiesc instalate apriori. Etapa aceasta depinde de hardware-ul fiecarei statii.

Acum cozile hardware trebuiesc configurate. Pentru aceasta trebuiesc consultate documentatia NIC-ului(acesta poate varia intr-o masura semnificativa de la o statie la alta). De exemplu, pentru un igb(Intel Driver) cu 8 cozi vom rula:


sudo rmmod igb
sudo modprobe igb QueuePairs=1,1,1,1 RSS=8,8,8,8 IntMode=3,3,3,3 InterruptThrottleRate=3000,3000,3000,3000

Acum trebuie sa distribuim intreruperile pe mai multe procesoare. Trebuie sa gasim care numere de intreruperi sunt folosite de NIC-ul nostru:

sudo cat /proc/interrupts | grep eth0

In exemplul de mai sus am folosit interfata eth0. Aici se pot observa toate numerele intreruperilor folosite de NIC si modul in care sarcina este distribuita. Retineti aceste numere. Trebuie modificat afinitatea SMP pentru a distribui respectivele intreruperi in mod secvential pe unitati de procesare. De exemplu, intreruperea 1 este executata pe core 1, intreruperea 2 pe core 2, s.a.m.d. Putem realiza acest lucru ruland:

sudo echo 1 > /proc/irq/xx/smp_affinity

Dupa testarea configuratiei o plasam in /etc/rc.local pentru a rula la fiecare bootare.

4. Folosirea RPS (Received Packet Steering)

Pentru a activa RPS rulam:

sudo echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

Trebuiesc selectate interfetele in uz, in situatia in care eth0 nu este folosita, si toate cozile pe care interfetele le suporta.

5. iptables

In cazul in care atacul nu se bazeaza pe IP-spoofing, adresa atacatorului fiind astfel cunoscuta putem apela la iptables pentru a bloca pachetele nedorite. Un exemplu de reguli iptables este ilustrat aici:

sudo iptables -A INPUT -p tcp -m state --state NEW -m recent --update --seconds 60 --hitcount 30 -j DROP
sudo iptables -A INPUT -p tcp -m state --state NEW -m recent --set -j ACCEPT

Regulile de mai sus limiteaza numarul de cereri SYN de la o singura adresa IP la 30 pe minut. Nu este recomandat sa folositi aceasta regula intrucat este posibil sa blocati un grup de utilizatori situati in spatele unui NAT(Network to Address Translation, un router).

Edited by Ganav
  • Upvote 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...