Trucuri de protecție a serverului web Apache împotriva atacurilor DOS

Apache, rămâne fără îndoială cel mai utilizat server web. Motivele sunt diverse, vine ca server web implicit pe majoritatea distribuțiilor de linux, este un sfotware suficient de matur, în general cine oferă suport pentru server web o face pentru apache, aplicațiile web sunt în general făcute să meargă cu apache.

De cele mai multe ori sysadmin-ul/utilizatorul/programatorul are nevoie de LAPM (Linux, Apache, PHP, MySQL). Ubuntu vine chiar și cu opțiunea de instalare implicită a unei suite de pachete ce vine să ne satisfacă nevoile. Însă atenție cu setările implicite!

DOS (Denial of Service) este unul dintre cele mai răspândite tipuri de atacuri dinspre internet ce se pot înâmpla serverului nostru WEB.  Ce se întâmplă de fapt, unul sau mai mulți clienți cer același site de nenumărate ori. Serverul WEB încearcă să-i servească “pe toți”, adică toate cererile, dar de cele mai multe ori hardware-ul nu ne ajută, prea multe activități concurente nu fac decât să îngreuneze servirea paginii web până când intervine „TIMEOUT”. Timeout înseamnă un timp de răspuns prea mare. De obicei browser-ul sau proxy-ul prin care ni se servește această pagină are setat un timp de răspuns maxim, adică dacă serverul web nu ne servește nimic în timp de… voi afișa un mesaj de eroare „TIMEOUT”.

Simplu test, pe un calculatoar oarecare instalați o aplicație web, să zicem wordpress, deschideți aplicația în browser. Într-o consolă urmăriți utilizarea resurselor de sistem (comanda top sau chiar htop).  Din browser țineți apăsat Ctrl+F5 (aică refresh la pagină de nenumărate ori) pentru vreo căteva zeci de secunde. Între timp comutați pe consolă să vedeți ce se întâmplă cu resursele sistemului.

Cum evităm toate astea? Nu pot să vă spun că există o soluție garantată 100% sau că există doar o soluție. E un domeniu poate la fel de vast ca și SEO-ul. În general trebuie să ajungem la un compromis între numărul de clienți „legitimi” pe care îi servim și limita de la care zicem „Gata!”. Iată câteva trucuri:

1. Limitarea numărului de conexiuni TCP noi inițiate către server. Se face din iptables. În general este o bună practică ca într-un firewall făcut cu iptables conexiunile TCP deja stabilite să treacă fără probleme și atunci vom lucra doar cu pachetele ce reprezintă conexiuni noi.  Creem un lanț nou numit SYN-FLOOD prin care lăsăm să treacă doar un anumit număr de pachete.

iptables -N SYN-FLOOD
iptables -A INPUT -m state --state NEW -j SYN-FLOOD
iptables -A SYN-FLOOD -m limit --limit 100/s --limit-burst 200 -j RETURN
iptables -A SYN-FLOOD -j DROP

Putem să facem și jurnalizarea din lanțul SYN-FLOOD.
2. Limitarea numărului maxim clienți posibili servibili de serverul web. De cele mai multe ori setările implicite sunt făcute pentru server web ce au hardware foarte performant ce permite acest număr de conexiuni însă nu acestea nu se aplică întotdeauna. De cele mai multe ori pe același server avem și pagini statice și imagini dar și pagini dinamice(de cele mai multe ori scrise în PHP). Din această cauză numărul maxim de clienți va trebui setat unpic mai mare decât numărul real de persoane/roboți ce vizirează site-ul. În funcție de MPM-ul utilizat la compilarea serverului web apache(implicit, dacă instalăm și PHP este prefork) avem diverse setări în apache.conf. Le găsim între <IfModule mpm_prefork_module>și </IfModule>. Putem folosi MPM worker dacă configurăm PHP prin intermediul lui mod_fastcgi dar asta este altă poveste(probabil într-un articol următor).

3. mod_evasive. Este modulul care verifică numărul de conexiuni la intervale destul de mici de la același client. Este practic cea mai bună metodă de protejare împotriva atacurilor DOS. În cazul în care clientul face prea multe cereri la intervale mici acesta  primește o pagină de eroare cu „403 Forbidden” în locul site-ului consumând astfel cu mult mai puține resurse hardware.

Cum se face:
Se instalează modulul folosind comanda:

apt-get  install libapache2-mod-evasive

Pentru configurarea parametrilor vom crea un fișier /etc/apache2/conf.d/evasive.conf ce conține:

    DOSHashTableSize    3097
    DOSPageCount        10
    DOSSiteCount        5
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10

Opțional mai avem

DOSEmailNotify	you@yourdomain.com
DOSSystemCommand	"su - someuser -c '/sbin/... %s ...'"
DOSLogDir		"/var/lock/mod_evasive"

DOSPageCount este parametrul care restricționează numărul maxim de cereri simultane pentru același URL, DOSSiteCount este parametrul ce restricționează numărul maxim de cereri de la același IP(utilizator) iar DOSBlockingPeriod este perioada de timp în secunde pentru care utilizatorul va primi pagina de eroare.

Pentru a primi notificări prin e-mail legat de încercările de atac asupra serverului folosiți parametrul DOSEmailNotify. Atenție însă mod_evasive încearcă să trimită e-mail folosind comanda /bin/mail care în Ubuntu și în alte distribuții este de fapt în /usr/bin/mail. Pentru a-l face funcțional vom face un symlink:

ln -s /usr/bin/mail /bin/mail

Din păcate domeniul este foarte vast și destul de puțin documentat, în general lucrurile se învață din practică, încercând și testând.

6 comentarii la “Trucuri de protecție a serverului web Apache împotriva atacurilor DOS

  1. Nici una dintre “metodele” astea n-are mare efect intr-un atac DOS de-adevaratelea, filtrarea pachetelor trebuind sa aiba loc inaite ca ele sa ajunga pe TCP stack, si nu din Apache.

    Protectia DOS e in general o problema de router si peering, nu de Apache, incercarile de protectie la asa un nivel de inalt au toate sansele sa se transforme mai degraba in probleme ele insele decat sa ajute la ceva.

  2. Solutii de bun simt pentru instalatii mici.

    Pentru instalatii mari ce ai enumerat mai sus nu prea are efect
    in schimb se insista pe sisteme de disponibilitate ridicata si failover,
    precum si hardware si software specializat la un alt nivel pentru
    detectarea si stoparea acestor atacuri, pentru ca sunt diverse
    si cateva setari in apache sau iptables sunt bune pentru un sistem
    dar pentru un datacenter asa ceva e frectie :)

  3. ce ma caiesc ca am ales porcaria asta de OpenSuse ;)

    ====
    zypper in libapache2-mod-evasive

    package ‘libapache2-mod-evasive’ not found
    ====

    Ce bine era cu YUM in Fedora … am instalat aproape orice, cu f putine exceptii din rpm-uri.

    Nici nu stiu daca sa’l incerc ca nu cumva sa’mi balaresca ceva, mai ales ca OS este pe 64bit … plus ca nu’s eu chiar guru, doar un fel de user oleac’ mai avansat.

    ideea este buna, ceva asemanator aveam pe unele siteuri dar la nivel de php, de’ti bloca accesul timp de K secunde dupa N incercari intr-un interval M

  4. Trebuie sa fie si site-ul optimizat, numarul de http requesturi sa fie cat mai mic prin folosirea “css sprites”, slow queries verificate la sange, un sistem de caching pt paginile care nu isi schimba des continutul, etc.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

*

Poți folosi aceste etichete HTML și atribute: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">