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…
|