IPRO - PC Magazine Romania, Octombrie 2003
SOLUŢII PENTRU PROGRAMATORII ŞI DESIGNERII WEB
Securitatea Reţelei [1]
Alexandru Ioan Lazăr
Introducere în TCP/IP
25 decembrie 1994 nu i-a rezervat lui Tsutomu Shimomura un cadou prea plăcut. Server-ul firmei San Diego Supercomputers Center, la care Shimomura era specialist în securitate, fusese spart, şi date de mare importanţă fuseseră furate. Tehnica folosită de Kevin Mitnik - Marele K, cracker-ul responsabil pentru spargere - a arătat faptul că acesta cunoştea la perfecţie protocoalele TCP/IP. Tehnica a fost numită IP Spoofing, pentru că asta şi făcea: imita adresa IP a unei maşini în care serverul "avea încredere".
TC-cum?
TCP/IP este abrevierea numelui a două protocoale foarte importante: Transmission Control Protocol/Internet Protocol (Protocol de Control al Transmisiei/Protocol Internet). TCP/IP denumeşte însă, generic, o întreagă suită de protocoale. Cu excepţia platformelor DOS şi Macintosh foarte vechi, toate platformele au suport nativ pentru această suită de protocoale. Asta înseamnă independenţă faţă de platformă, ceea ce face din TCP/IP cea mai folosită metodă de a realiza o reţea.
Protocoalele acestei suite operează într-o stivă cu 5 nivele: Aplicaţie, Transport,
Reţea, Legătură de date şi Fizic (vezi Figura 1).

Fig. 1 - Stiva nivelelor de protocoale
Atunci când iniţiezi un transfer de date (de exemplu, când tastaţi www.pcmagazine.ro şi apăsaţi ENTER), protocoalele de la nivelul Aplicaţie iniţiază o cerere. La nivelul Transport, se ataşează un antet acestei cereri, iar datele ajung la nivelul Reţea. Acolo se adaugă adresele IP ale gazdei (maşina-ţintă) şi clientului, iar datele ajung mai departe la nivelul Legătură de date. La acest nivel se detectează orice erori care au apărut la transferul datelor între protocoalele superioare şi cel Fizic, care transmite informaţia printr-un mediu fizic.
Protocoalele la nivel de Aplicaţie sunt: ftp (portul 21), telnet (portul 23), smtp (portul 25), gopher (portul 70), finger (portul 79, vom discuta despre finger într-un număr viitor), http (portul 80) şi News - nntp (portul 119). Mai importante pentru noi - şi, din păcate, deseori necunoscute multor administratori - sunt cele de la nivelul Reţea - şi anume ARP, ICMP, IP şi TCP. Haide să aruncăm o privire asupra lor.
ARP
ARP (Address Resolution Protocol) este protocolul care se ocupă de convertirea adreselor internet (IP) în adrese fizice (Ethernet). Pentru a face acest lucru, o cerere ARP este difuzată în reţea. Cererea conţine adresa fizică a expeditorului - iar rezultatul este trimiterea adresei fizice a ţintei de către un ruter, prin determinarea adresei fizice a următorului hop al pachetului. Importanţa acestui protocol pentru securitate este faptul că menţine o zonă cache, pentru a scurta timpul necesar aflării adresei. Un cracker va putea folosi această zona cache pentru a afla unele adrese, dar cel mai important, această zonă cache conţine indicii pentru relaţiile de încredere. Din această cauză, un hacker cu experienţă va putea reconstrui o parte din topologia reţelei tale folosindu-se doar de cache-ul ARP. Poţi găsi o serie de detalii importante despre ARP consultând documentul RFC 826 de la www.rfc-editor.org.
ICMP
Arhitectura internetului implică o serie de probleme atunci când o maşină anume nu funcţionează. Dacă funcţionează, totul e bine. Dacă nu, intervine ICMP: Internet Control Message Protocol.
ICMP este protocolul responsabil cu determinarea eventualelor probleme datorate "căderii" unei maşini. Dacă sunteţi un împătimit al mIRC-ului, probabil că aţi ajuns la o relaţie plină de căldură cu acest protocol. Nu-i aşa că ai folosit comanda ping? Aşa trimiţi un pachet. Ţinta va răspunde - în cazul în care va primi pachetul. Dacă totul e în ordine, rezultatul este un pachet identic. Dacă nu, vei primi un pachet ICMP. Acesta conţine, în header-ul său, informaţiile de care are nevoie pentru a determina o eventuală problemă. Dacă ţinta nu poate fi "atinsă" se primeşte un cod specific, de tip 3. Dacă subreţeaua sau ţinta nu pot fi găsite, gateway-ul întoarce codul 0, respectiv 1. Dacă protocolul apelat nu poate fi găsit, ţinta întoarce cod 2. Dacă portul dorit nu poate fi apelat, ţinta va întoarce codul 3. În fine, dacă este nevoie de o fragmentare, sau dacă rutarea a eşuat, gateway-ul va întoarce codurile 4, respectiv 5. După cum vezi, pachetul include şi un "timp de viaţă". Erorile legate de acesta se încadrează în tipul 11. Dacă timpul de viaţă a expirat, gateway-ul va întoarce un codul 0. Dacă informaţia nu a putut fi reasamblată la timp, se va întoarce cod 1.
Protocolul ICMP este unul de mare importanţă, în primul rând pentru administratori. Ei îşi pot da seama dacă cineva a scos din uz o maşină în mod intenţionat - spre exemplu, dacă o maşină funcţionează perfect dar portul 80 (HTTPD) nu este accesibil, avem un indiciu al unui eventual atac.
IP
Protocolul IP este unul din cele mai importante, mai complexe şi, tocmai de aceea, mai puţin înţelese. Conform RFC 791 de pe www.rfc-editor.org IP "a fost construit pentru a fi folosit în sisteme interconectate prin reţele de comunicaţie. [...] Protocolul IP permite transmiterea de blocuri de date numite datagrame, de la un expeditor la un destinatar, unde atât expeditorul cât şi destinatarul sunt identificaţi printr-o adresă de lungime fixă. IP permite fragmentarea şi reasamblarea datagramelor foarte mari [...]." - RFC 791 Nu-i aşa că vă sună cunoscut? IP este abrevierea de la Internet Protocol şi, dacă vreţi aşa, reprezintă practic internetul.
IP este sufletul tuturor proceselor care rulează, pentru că IP este protocolul
care difuzează toate cererile şi răspunsurile celorlaltor protocoale. În figura
2 poţi observa ierarhia protocoalelor, iar în figura 3 structura generală a
unui pachet IP.

Fig. 2 - Ierarhia protocoalelor

Fig. 3 - Structura pachetului IP
O datagramă prea mare poate fi spartă în pachete. Acestea conţin în header
adresa ip a ţintei. Procesul care găseşte o cale prin care pachetul poate ajunge
la destinaţia descrisă de adresă prin jungla Reţelei se numeşte rutare. Routerele
- cele care se ocupă cu rutarea - pot fi hardware (şi costă cam cât un calculator)
sau software, şi sunt necesare pentru ceea ce noi numim shared access - posibilitatea
unor calculatoare legate în reţea de a accesa internetul folosindu-se de o singură
conexiune.
Tot în header-ul unei datagrame (şi al unui pachet) se află şi informaţia care
permite fragmentarea unor datagrame în pachete şi reasamblarea pachetelor în
datagrame.
IP foloseşte patru lucruri-cheie pentru serviciile sale: ToS (Type of Service), TtL (Time to Live), opţiunile speciale şi checksum-ul.
ToS (Type of Service - Tipul Serviciului) este un set de parametri care caracterizează serviciile furnizate de subreţelele ce compun internetul. Folosind aceşti parametri, fiecare gateway poate determina parametrii specifici pentru transmiterea spre o anumită reţea, subreţeaua folosită pentru următorul hop al pachetului sau poate dezvălui unui router care este următorul gateway.
TtL (Time to Live - Timpul de Viaţă) este un amănunt interesant, care descongestionează serios reţeaua globală. Dacă după un anumit timp definit de acest TtL datagrama nu a ajuns la destinaţie, ea este distrusă şi gateway-ul întoarce o eroare ICMP.
Opţiunile speciale oferă unele funcţii care sunt necesare uneori, dar de obicei sunt dispensabile - opţiuni care se referă la numite time stamp-uri sau la rutările speciale. In fine, checksum-ul este folosit pentru ca ţinta să se poată asigura că datagrama a fost corect recepţionată şi transmisă. Dacă verificarea checksum-ului eşuează, datagrama este distrusă.
Există şi limite pentru protocolul IP. După rutarea unei datagrame, nu există siguranţa că aceasta ajuns (pentru asta s-au inventat ICMP şi TtL, imaginaţi-vă cum ar fi să navigaţi aşteptând la infinit să se încarce o pagină care nici nu există) sau va ajunge vreodată. Marea problemă este că IP nu poate verifica dacă există erori în date - singura metodă de protecţie împotriva pachetelor eronate este checksum-ul. De aceea, un cracker poate trimite orice îi trece prin cap într-o datagramă şi poate periclita o maşină.
IP este un protocol extrem de complex. Mi-ar fi imposibil să detaliez funcţionarea şi structura sa, chiar într-un articol consacrat. De aceea, vă invit să consultaţi documentul RFC 791 de pe www.rfc-editor.org care conţine tot ce trebuie ştiut despre acest protocol. Şi, în fine, trecem la ultimul protocol…
…TCP
Definiţia TCP din RFC 793 este ,,un protocol […] care funcţionează între
două gazde (hosts) într-o reţea de comunicaţie bazată pe pachete şi sisteme
formate din astfel de reţele interconectate. TCP diferă de celelalte protocoale
pentru că ai mereu siguranţa faptului că cererea TCP a ajuns - sau nu a ajuns
- la ţintă. De ce? Priveşte figura 4, care detaliază ceea ce se numeşte ,,înţelegere
în trei părţi", pornind un flux de date sigur - reliable data stream -
un circuit virtual specific.

Fig. 4 - Înţelegere în trei părţi
O maşină-gazdă (să-i spunem foo) deschide o sesiune spre o maşină-ţintă bar,
cerând o conexiune. Bar răspunde printr-o confirmare, şi aşteaptă un răspuns
din partea lui foo. Acesta din urmă trimite o confirmare, iar apoi fluxul de
date la nivelul celorlaltor protocoale poate începe. Dacă nu a primit nici un
răspuns din partea lui bar după un anume timp, foo va reiniţia cererea. De aceea,
transferul este sigur.
Cei care care au gene de hacker şi-au dat seama probabil că ceva neplăcut se poate întâmpla dacă foo nu va răspunde. Bar va aştepta… şi va aştepta… şi va aştepta… ☺ aceasta este o tehnică numită DoS (Denial of Service): foo poate lua la rând toate porturile lui bar, şi iniţiază cereri la care nu mai răspunde niciodată. După un timp, se va ajunge blocarea lui bar.
Um…asta e tot?
Vă plac şocurile? De fapt, există câteva sute de protocoale (personal, dau o bere cui le învaţă pe toate…eu n-am reuşit ☺). Puteţi găsi tot ce se poate şti despre standardele acestor protocoale consultând documentaţia RFC. Şi bineînţeles există sute de grupuri de discuţii legate de securitate - de acolo vei învăţa mai mult decât dintr-o mie de articole şi cărţi. Ei bine, atât pentru moment…
|