Soluții - PC Magazine Romania, August 2003
Zidul
Răzvan Sandu
Motto:
Zărise parapetul și, dincolo de el, ghicise căscată în întuneric prăpastia.
Începu să tremure. Ar trebui să-i spun, mai am timp să-i spun... Dar îl orbiră
farurile mașinii răsărite pe neașteptate din întuneric, în fața lor, și fără
să-și dea seama ce face, se apropie mult de Ileana. [...] Știuse că, simțindu-l
foarte aproape de ea, Ileana va întoarce capul și-l va privi. Știuse că acea
ultimă, nesfârșită clipă îi va fi deajuns. - [Mircea Eliade - "Noaptea
de Sânziene"]
Afară aproape că s-a lăsat întunericul, dar eu sunt încă în biroul meu, răsturnat într-un fotoliu. În asemenea momente, sunt întotdeauna singur. Obosit, ridic privirea către fereastră. Aici, sus, la penultimul etaj al clădirii futuriste în care lucrez, suprafețele mari de sticlă oferă priveliștea calmă a terenurilor verzi și a pădurii ce mărginesc Bucureștiul. Acum, însă, aproape că nu mai percep plăcerea nopții fierbinți de iunie. De cel puțin o oră, nu-mi pot dezlipi ochii de pe jurnalele de sistem care defilează tăcut și continuu pe fundalul negru al monitorului și de pe LED-ul roșu al harddisk-ului, care nu s-a stins nici o clipă.
Dincolo de acest computer, care se luptă din greu să supraviețuiască, s-a dezlănțuit Iadul. Iadul oricărui administrator de rețea. Oameni rău-intenționați bat la porți, avertizări despre viruși vin în ritmul a câte douăzecișicinci de e-mail-uri pe minut. Este cumplit să știi că între camera familiară, plină de bâzâitul regulat al serverelor și infernul de afară nu există decât acest singur sistem Linux. O mașină mai veche, aproape dezmembrată, cu hard-disk-uri fragile și ventilatoare veșnic îmbâcsite de praf.
Între mine și lupta furibundă ce se dă în acest moment pe Internet nu există decât Zidul.
La începuturi
Prin anii ´70, când germenii a ceea ce este astăzi Internetul începuseră să apară, problemele de securitate erau mult mai mici. Pe de o parte, existau rețelele guvernamentale și militare, bazate, de cele mai multe ori, pe tehnologii proprietare și care, oricum, nu permiteau accesul fizic al intrușilor la conexiuni. Pe de altă parte, în mediul universitar se dezvoltau rețele de cercetare, "populate" cu profesori și studenți. Aceștia lucrau, de regulă, la proiecte avansate, care impuneau o colaborare cât mai strânsă și mai largă între persoane situate în universități diferite, cu calificări diferite… Securitatea informațiilor nu era, aici, un scop în sine - dimpotrivă, schimbul de informații trebuia facilitat cât mai mult posibil. În această perioadă de pionierat au apărut programe foarte utile, dar care sunt considerate astăzi "găuri" în securitatea sistemelor - un exemplu ar fi utilitarul UNIX finger.
Lucrurile nu au ieșit de tot din perioada "romantică" nici măcar odată cu folosirea aproape generalizată a protocolului TCP/IP, care a ridicat Internetul la scară cu adevărat globală. Abia după 1993, când numărul de persoane/mașini conectate a început să crească exponențial, într-o dezvoltare fără precedent, Internetul a devenit, cu cel mai propriu termen, o "junglă". Fenomenul se datorează, fără îndoială, apariției serviciului World Wide Web (WWW), care a adus cu sine "comercializarea" rețelei. Persoane de toate vârstele, naționalitățile, etniile, nivelele de educație au dat, pur și simplu, "buzna" în ciberspațiu, de multe ori fără să le fie prea clar de ce o fac. Unii, mulți, fără prea mari competențe în domeniul TI. Alții, cu intenții nu totdeauna curate …
Platformele Microsoft au fost, până la un moment dat, scutite de "neplăceri" grave de securitate. Și asta nu fiindcă designul ar fi fost neapărat mai bun - până la Windows 2000 nici nu se poate vorbi de o securitate reală. Ci pentru că
1. o implementare mai "serioasă" de TCP/IP a apărut abia odată cu Windows 95, până atunci calculatoarele fiind izolate sau legate doar în mici rețele locale și
2. majoritatea covârșitoare a mașinilor rulează aproape exclusiv software-client
(Windows 3.1/95/98/Me/2000 Professional/ XP), deci, 99%, nu oferă servicii în
rețea, ci doar primesc aceste servicii… 99%, zic, excepția la cele spuse
mai sus constituind-o "micile" implementări de servere Web și FTP
din versiunile de Windows amintite, pe care puțini utilizatori le instalează
și folosesc. Pe platformele Microsoft, principala amenințare o constituie, încă,
virușii și celelalte categorii de software distructiv (purtați, "bătrânește",
pe dischete ☺)…
Orice s-ar afirma, în toată această perioadă, "greul" Internetului s-a sprijinit pe umerii diverselor implementări de Unix (atât cele comerciale, de la AT&T, Sun, HP și IBM, cât și, de curând, ai "clonelor" free - Linux, NetBSD, FreeBSD, etc.). Gândește-te numai la portaluri uriașe, ca Google, Yahoo și altele de aceleași dimensiuni și întreabă-te ce tehnologii trebuie să stea în spatele acestor "mastodonți", cu încărcări de zeci de mii de utilizatori. Așa cum îți spuneam într-un articol precedent, chiar și situl Hotmail, aparținând Microsoft, a funcționat, până la un moment dat, pe mașini Sun care rulau Unix. Asta până când gigantul din Redmond a realizat că face contrareclamă propriilor produse server…
Reacția lumii Unix la amenințările sporite de securitate nu s-a lăsat așteptată (deși lucrurile nu sunt și nu vor fi niciodată perfecte). Mai întâi, s-au dezvoltat rapid protocoale cu grad sporit de siguranță (ssh în locul clasicului telnet, Kerberos, criptare cu chei asimetrice, parole shadow, etc.) Apoi, s-a acordat o mai mare atenție raportării, publicării, rezolvării în cod și corectării rapide a problemelor de securitate (vezi, ca exemplu, buletinele de securitate periodice ale Computer Emergency Response Team - CERT - la www.cert.org. Pentru Linux, cu ajutorul vastei comunități de programatori open-source din întreaga lume, soluțiile pentru problemele de securitate identificate apar, de obicei, în intervale de ordinul orelor.
Cum funcționează totul
Pentru aceia dintre voi care abia fac primii pași în domeniul rețelelor, voi încerca să explic, mai jos, conceptele principale pe care se bazează atacurile. Fiind o prezentare destinată începătorilor, rog profesioniștii să-mi ierte definițiile prea "libere", analogiile și simplificările făcute voit.
Orice rețea este alcătuită în scopul de a oferi servicii utilizatorilor săi. Aceste servicii pot fi diverse: stocarea de fișiere pe un harddisk aflat la distanță, partajarea unei imprimante, primirea și trimiterea de poștă electronică, transferul de fișiere între mașini, publicarea de pagini Web, etc. Ca majoritatea mașinilor Unix, PC-ul tău Linux este capabil să ofere o multitudine de servicii de rețea - din care, probabil, nu toate sunt active în momentul de față, unele nefiind necesare în toate cazurile. Pentru a-ți face o idee, afișează pe ecran fișierul /etc/services:
less /etc/services
Acest fișier este prea lung ca să-l pot reproduce aici, dar este suficient să știi că fiecare linie prezentă definește câte un serviciu. Probabil că te va speria complexitatea lui…
Principala noțiune ce stă în spatele alcătuirii rețelelor este aceea de arhitectură client/server. Prin definiție, în această arhitectură, un server este mașina (sau programul rulând pe ea) care oferă servicii altor mașini din rețea. Similar, un client este calculatorul (sau programul) care primește, folosește serviciul oferit. În multe cazuri, o aceeași mașină poate oferi și primi servicii în/din rețea, jucând rolul de server față de unele mașini și de client față de altele. Așa cum arătam mai sus, exemplificând pentru platformele Microsoft, mașinile rulând Windows NT, familia Windows 2000 Server sau familia Windows 2003 sunt, în esență, mașini-server, iar restul (Windows 95/98/Me/2000 Professional/XP) au rolul de client.
Pentru stabilirea "dialogului" între client și server se utilizează "limbaje" formalizate înțelese de ambele tipuri de mașini, care poartă denumirea de protocoale. Spre exemplu, protocolul Simple Mail Transfer Protocol (SMTP) este utilizat pentru trimiterea poștei eletronice, în timp ce protocolul Post Office Protocol-3 (POP3) este folosit pentru primirea ei ("descărcarea" mesajelor de pe serverul de poștă electronică pe mașina-client).
În fine, ultima noțiune analizată este aceea de port de rețea. Imaginează-ți mașina ta server, situată la adresa IP 192.168.1.1, ca pe un zid gros de beton care "apără" interiorul mașinii de restul rețelei. În acest zid sunt practicate găuri, numerotate - numite "porturi" - care servesc ca "puncte de întâlnire" între programele client (care încearcă conexiuni din exterior) și programele server. Dacă, de exemplu, un client va dori să acceseze serverul tău DNS de la adresa IP 192.168.1.1, va "întâlni" programul server corespondent (care rulează "în spatele" zidului) la portul numărul 53. De unde știe clientul cărui port să se adreseze? Dacă privești încă odată fișierul /etc/services, vei observa, în dreptul liniei serviciului domain, în coloana a doua, numărul 53. Acestea sunt numere de port/serviciu larg utilizate în Internet (well-known services).
Ce legătură pot avea toate acestea cu securitatea rețelei, de vreme ce se știe precis, despre fiecare program-server, la ce port "ascultă"? Noi nu trăim într-o lume perfectă, iar programele-server nu sunt, nici ele, perfecte. Din când în când, în fiecare asemenea program, se descoperă câte o vulnerabilitate - sau eroare (bug) - care, exploatată, permite unui client să se conecteze și să obțină acces cu drepturi de root pe mașina-server-țintă. Odată obținut accesul cu drepturi de root, cracker-ul are întreaga libertate de a controla această mașină…
Ce putem face? Măsurile sunt destul de puține și, conceptual, simple, dar aplicarea lor este o adevarată artă (există oameni și firme care câștigă milioane de dolari oferind consultanță în acest domeniu). Iată câteva:
• oprește toate programele-server care nu îți sunt cu adevărat necesare,
adică închide ("zidește" ☺) porturile acelor servicii
pe care știi că nu le vei folosi;
• descarcă de pe Internet corecțiile (patch) pentru toate vulnerabilitățile descoperite și instalează-le. Pentru aceasta trebuie să consulți periodic diverse surse de informare, cum ar fi buletinele CERT, ca să afli ce "găuri" de securitate au mai fost semnalate;
• îngrijește-te să ai, pe sistemul tău, un software rezonabil de nou. Vulnerabilitățile de securitate descoperite în programe sunt, aproape întotdeauna, automat corectate de autori în versiunile ce apar după descoperirea lor. Trebuie însă remarcat că un software mai nou nu este, neapărat, mai puțin afectat de erori decât unul vechi. Dacă ești programator, probabil că știi că orice versiune nouă de program corectează cam 100 de bug-uri vechi și introduce aproximativ 200 de bug-uri noi. ☺
• folosește parole bune. Nu contează ce versiune de software utilizezi și ce patch-uri au fost aplicate, dacă parola ta este de două litere și poate fi spartă într-un sfert de oră, folosind cine știe ce program gratuit din Internet. O parolă decentă are minimum 8 caractere, litere mari, mici, cifre și semne speciale amestecate și nu are nici o legătură cu numele tău, al soției, data nașterii, numărul mașinii, cuvinte din dicționar, etc.
• nu nota parolele, memorează-le! Și, mai ales, nu le lipi cu POST-IT pe monitor, alături de poza copilului sau a duduiței Playboy preferate ☺! Vorba regretatului Toma Caragiu, în rolul unui tovarăș însărcinat să pregătească Revelionul la uzină: "Lista surprizelor de Anul Nou va fi afișată la loc vizibil și fiecare invitat va semna de luare la cunoștință pentru fiecare surpriză în parte …" ☺. Te rog, atenție!
Aceia dintre voi care lucrează mai demult pe platforme Microsoft se vor declara
revoltați! Software-ul open-source, căruia îi tot lăudăm calitățile, pare a
fi … dezastruos, cel puțin din punct de vedere al securității ! Nu pot
să fac nici un comentariu. Acum vreun an, la ultimele atacuri virale serioase
cu Nimda sau Code Red, soluția a fost găsită în câteva ore sau zile, după ce
fuseseră afectate destule mașini, pe toate platformele. Din nefericire, raportul
de dimensiuni între cei 650 MB ai CD-ului meu cu Windows 2000 și cei 124 MB
ai ultimului Service Pack pentru el (al treilea) nu mă prea lasă să dorm. Cât
despre "fix-urile" de securitate de pe windowsupdate.microsoft.com
și primul Service Pack la Windows 95, care venea pe un număr de dischete aproape
egal cu al produsului însuși, îmi stăruie și azi în amintire… ☺
"We don´t need no education…"
Sunt un mare admirator al formației Pink Floyd - ați văzut vreodată filmul concertului de la Pompei ? - dar nu există un domeniu în care fraza de mai sus să fie mai puțin adevărată ca acela al TI-ului. Și al Unix-ului, în special. Acum, a venit momentul să discutăm despre Zid.
Un firewall (termen pe care nu știu dacă să-l traduc ca "parafoc", "antifoc" sau, dimpotrivă, "zid de foc") pare să desemneze, în limba engleză, un zid compact, fără ferestre, care împiedică răspândirea incendiului spre o anumită zonă a unei clădiri. În TI, noțiunea are o semnificație precisă: firewall-ul este programul (și mașina pe care rulează acesta) care separă o rețea locală privată de Internet, oferind acces numai anumitor persoane, servicii și programe, în cadru strict controlat. Imaginează-ți-l ca pe un "portar informatic" al rețelei tale.
Observă, te rog, că pseudo-definiția de mai sus nu spune nimic despre sensul în care circulă informația prin firewall. Dincolo de aplicația imediată (apărarea rețelei locale de eventualele atacuri ale persoanelor rău-voitoare din Internet), firewall-ul mai poate fi folosit și pentru scopuri cel puțin discutabile, cum ar fi:
• restrângerea dreptului angajaților unei companii de a accesa Internetul, limitând serviciile disponibile, tipul siturilor ce se pot vizita, orele de funcționare, stațiile de la care se poate face accesul, etc.
• scanarea informațiilor ce trec prin firewall, în ambele sensuri, căutându-se viruși, dar și cuvinte pornografice, informații confidențiale, informații ce țin de intimitatea persoanei (sexuală, de opinii politice), etc. - vezi www.epic.org
• restrângerea dreptului minorilor de a accesa anumite informații pe Internet (situri cu caracter violent, pornografic, rasist, etc.)
Este ușor de imaginat ce se poate realiza folosind "utilitare" de asemenea putere care încap pe mâna utilizatorilor neautorizați, administratorilor lipsiți de deontologie profesională, firmelor prea preocupate de "buna conduită" a angajaților sau diverselor "agenții" guvernamentale sau private susceptibile să încalce drepturile persoanei! Sau, de ce nu, chiar pe mâna părinților ☺ !
Sub termenul general de firewall se găsesc înglobate două concepte separate: filtrele de pachete (filtering firewall) și serverele proxy (proxy servers). În cele ce urmează, mă voi referi numai la primul tip, care realizează, în cele mai multe cazuri, protecția rețelelor LAN.
Ca în western-urile cu John Wayne - table, ținte, reguli…
Ai instalat un firewall pe sistemul tău ? (vreau să aud "nuuuuuuuuu"). Ba da, îl ai - este chiar kernel-ul Linux.
În rețea, informația circulă sub formă de pachete. Pentru a trimite prin rețea un fișier, acesta este "spart", la sursă, în pachete. Pe lângă informația strict utilă, "bucata" de fișier propriu-zisă, numită corpul pachetului (packet body), fiecăruia i se adaugă un antet (header). Fără a intra în amănunte, antetul specifică sursa de la care a pornit pachetul, destinația sa și alte informații (cum ar fi tipul de comunicație pe care pachetul îl stabilește, adică serviciul de rețea/portul/protocolul care îl utilizează).
Kernel-ul Linux conține, implicit, codul necesar pentru a face filtrarea de pachete, pe baza informațiilor existente în antetul acestora. Tot ceea ce este necesar este o "unealtă" cu ajutorul căreia să putem defini regulile în funcție de care se va face filtrarea. În versiunile mai vechi de Linux, aceste utilitare au fost, pe rând, ipfwadm și ipchains, iar în prezent utilitarul folosit este iptables - acesta este singurul la care mă voi referi, deși mai există încă în funcție mașini care folosesc vechile programe.
În kernel, regulile după care se face filtrarea pachetelor sunt grupate în tabele (tables). Kernelul posedă trei asemenea tabele predefinite și oferă posibilitatea de a se defini și altele:
• filter - tabela implicită folosită pentru filtrarea pachetelor;
• nat - tabela folosită pentru a aduce modificări pachetelor care creează o nouă conexiune;
• mangle - tabela folosită pentru a opera modificări speciale asupra pachetelor;
Fiecare dintre tabelele arătate conține, la rândul său, un număr de serii sau lanțuri de reguli de filtrare (chains).
Tabela filter, singura despre care vom vorbi aici, conține:
• INPUT - seria de reguli care se aplică pachetelor primite printr-o interfață de rețea
• OUTPUT - seria de reguli care se aplică pachetelor ce pleacă prin aceeași interfață de rețea ca și cea care le-a primit;
• FORWARD - seria de reguli ce se aplică pachetelor ce sosesc printr-o anumită interfață de rețea și pleacă prin alta.
Fiecare serie predefinită folosește o politică (policy), adică o acțiune implicită care se execută asupra pachetelor care au traversat toate regulile seriei fără a fi fost "capturate" de nici una dintre ele.
La rândul ei, fiecare regulă conține un criteriu de filtrare și o țintă. Ținta (target) reprezintă acțiunea care va fi executată asupra pachetului în cauză dacă acesta îndeplinește criteriul regulii. În caz contrar, este analizată regula următoare sau aplicată politica (dacă regula este ultima din serie).
Valorile predefinite ale țintelor sunt:
• ACCEPT - pachetul este acceptat să treacă prin filtru;
• DROP - pachetul este respins tacit;
• QUEUE - pachetul este trecut în spațiul-utilizator;
• RETURN - pachetul continuă cu regula următoare a seriei care a apelat seria curentă.
Comanda iptables permite manipularea tuturor acestor parametri pentru a introduce și extrage reguli din tabelele kernelului. Iată câteva exemple:
/sbin/iptables -A -s 192.168.0.1 -p
tcp —dport 22 -j ACCEPT
Comanda de mai sus poate fi citită: "adaugă (-A) o regulă prin care pachetele provenite de la adresa-sursă 192.168.0.1 (-s), cu protocolul tcp (-p) și destinate portului 22 (—dport 22) să fie acceptate (-j ACCEPT - fă un salt, jump, la ținta ACCEPT).
Sau:
/sbin/iptables -P INPUT DROP
stabilește politica seriei INPUT ca fiind DROP, deci pachetele vor fi, în mod implicit, respinse.
Sau încă:
/sbin/iptables -A FORWARD -p udp —sport
53 —dport 1024 -j ACCEPT
adaugă seriei FORWARD o regulă de acceptare a pachetelelor protocolului UDP ce au ca sursă portul 53, iar ca destinație portul 1024. Acest lucru se referă la traficul serviciului de nume (DNS).
Alte exemple de comenzi ar putea fi:
/sbin/iptables -F
care golește (flush) regulile din toate seriile sau:
/sbin/iptables -N ineth0
care definește o nouă serie, cu numele ineth0.
De remarcat că, în absența unei specificații explicite, toate operațiile cu serii și reguli de mai sus (adăugări, eliminări, etc.) se referă la tabela filter. Tabelele mangle și nat pot fi folosite ca în exemplul ce urmează:
/sbin/iptables -A PREROUTING
-t nat -d 192.168.0.1 -p tcp —dport 80 -j DNAT —to-destination 10.40.5.2
Arta creării regulilor de firewall este mult prea complexă pentru ca eu să o pot prezenta în detaliu aici. Mărturisesc, de altfel, că sunt departe de a fi un expert în firewall-uri și în securitate. Ceea ce urmăream era să te familiarizezi cu principalele concepte folosite în această tehnică, care să îți permită să citești documentația excelentă existentă pe Internet. Iată câteva adrese de unde îți sugerez să începi:
• netfilter.samba.org
(da, este situl proiectului Samba, iar codul filtrului de pachete mai este cunoscut
și ca netfilter)
• www.redhat.com/support/resources/networking/firewall.html (câteva indicații date pe situl Red Hat)
Încurajări
Nu-i așa că te simți complet demoralizat de complexitatea sarcinii de a crea un firewall? Nu ar trebui, dacă ești dispus să studiezi.
Ai putea începe prin a analiza configurația unui firewall creat de altcineva sau exemplele din documentație. Desigur, nu îți sugerez, pentru început, să testezi toate acestea pe mașina direct conectată la Internet în spatele căreia șeful tău ține toate fișierele cu politicile de prețuri - confidențiale ! - ale firmei. În cel mai bun caz, o configurație greșită de firewall poate bloca mai mult trafic decât este cu adevărat necesar, făcând imposibil accesul la unele servicii critice pentru companie. În cazul mai rău, poți oferi portițe de atac persoanelor rău intenționate din afară.
Ah, să nu uit ! Toată munca ta de firewalling este stocată în memoria RAM a computerului, adică se va pierde după repornirea acestuia. Ca să instruiești Linux-ul să încarce setul creat de reguli, la pornire, salvează-le, mai întâi, folosind comanda:
/sbin/service iptables save
(ca root)
Această comandă va apela scriptul /sbin/iptables-save, salvând regulile în fișierul /etc/sysconfig/iptables. Ele vor fi reîncărcate automat, după repornire, cu ajutorul scriptului /sbin/iptables-restore. Cele spuse mai sus sunt valabile pentru distribuțiile Red Hat recente - alte distribuții sau versiuni mai vechi pot avea alte comenzi pentru a obține același efect.
Și dacă tot am adus vorba despre micile facilitați Windows-like, pe care ni le oferă o distribuție "periată" ca Red Hat, îți voi semnala și faptul că există acolo două utilitare grafice care te pot ajuta să creezi o configurație de firewall de bază. Ele apar cu denumirile "Security Level" și "glokkit" (Gnome Lokkit) în menurile interfeței Gnome.
Nu te sfătuiesc, însă, să te bazezi mult pe ele, întrucât aceste utilitare nu sunt capabile să construiască decât un firewall absolut elementar.
S-a făcut noapte
Dacă ai căpătat puțină încredere în capacitatea ta de a crea un firewall eficient,
este cazul să mă ridic din fotoliul meu de la etajul trei și să plec acasă.
Fetița mea s-a culcat fără să apuc să-i spun povestea de seară - comanda date
îmi arată că e aproape 11. Atacul viral - de data asta, a fost virusul BugBear
- poate că va înceta, mâine, poimâine. Deocamdată, mail-urile continuă să vină,
în cantitați uriașe. Tot ceea ce putem face este să sperăm că firewall-ul și
serverul de mail vor rezista încărcării. Povestește-mi experiențele tale la
[email protected]...
Ieșind, sting lumina și închid, binișor, ușa după mine.
|