Kompiuteriniu tinklu saugumas
Kompiuterinių tinklų saugumas darosi aktuali problema vis platesniam žmonių ratui. Kuo labiau plinta Internetas, kuo daugiau žmonių ir ištisų kompanijų prisijungia prie jo, tuo aktualesnė darosi vietinio kompiuterių tinklo apsauga, jei jis prijungtas prie Interneto.
Informacija šiais laikais yra viena iš brangiausių prekių. Įsilaužimai pasinaudojant Internetu jau realybė. Paprastai išskiriamos dvi įsilaužimų klases:
• Nelegalus priėjimas prie duomenų.
• Serviso sutrukdymas.
Viena saugumo spraga dažniausiai sudaro sąlygas įvykdyti tik vieną iš šių įsilaužimų. Serviso sutrukdymas paprastai laikomas mažesne problema nei nelegalus priėjimas prie duomenų. TTačiau spragų, leidžiančių sutrukdyti serviso darbą, randama daugiau.
Įsilaužimas sukelia ne tik tiesioginius nuostolius įsibrovėliui nelegaliai priėjus prie duomenų. Daug gali kainuoti duomenų auditas – ar nepakeisti, nesugadinti, neištrinti duomenys. Taip pat – ar įsilaužėliai nepaliko sau „atsarginio įėjimo“ ateičiai.
Įsilaužimai galimi dėl dviejų priežasčių:
• Serverio konfigūravimo ir priežiūros klaidos.
• Klaidos serverio programose.
Pirmosios problemos sprendimas priklauso praktiškai tik nuo sistemos administratoriaus. Antroji – nuo visos grupės programų, bibliotekų bei operacinės sistemos branduolio. Interneto serviso vartotojas bendrauja su taikomaja programa, kuri savo rruožtu kviečia funkcijas iš įvairių bibliotekų bei kreipiasi į branduolį.
Interneto servisas – tai interneto serveryje dirbanti programa, kuri pagal nustatytą protokolą, bendraudama TCP/IP protokolu (naudodama jį duomenų su klientu apsikeitimui), pateikia ir gauna iš kliento duomenis. Kaip Interneto servisų pavyzdžius ggalima pateikti: WWW serveris (naudojamas tam, kad pateikti vartotojui įvairialypę informaciją: tekstą, iliustracijas, audio/video medžiagą.); FTP serveris (naudojamas failų perdavimui ir priėmimui); pašto (SMTP) serveris (elektroninio pašto transportas). Interneto serveris savo ruožtu tai kompiuteris, kuris yra prijungtas prie Interneto. Jame dirbančiais Interneto servisais gali pasinaudoti vartotojai iš Interneto.
Kai įsilaužimai gali įvykti dėl klaidų programose, sprendimai kaip išvengti klaidos pasekmių (galimo įsilaužimo) gali būti dvejopi:
• Ištaisyti klaidą.
• Bandyti taikyti prevencines priemones, kurie apribotų galimybes potencialiam įsilaužėliui iš Interneto pasinaudoti šia klaida.
Pirmas variantas aišku yra tiesioginis problemos sprendimas. Tai yra saugumo spraga užtaisoma ten, kur ji ir atsirado. Tačiau interneto serverio bendro saugumo požiūriu šis būdas turi keletą trūkumų:
• Klaida pataisoma tik po jos suradimo.
• Dažnai laisvai prieinamuose informacijos šaltiniuose pirmiausia paskelbiama aapie surastą klaidą, o jos ištaisymas pateikiamas vėliau.
• Reikia atidžiai sekti daug informacijos šaltinių.
• Bet kuriuo atveju tarp klaidos pataisymo paskelbimo ir to momento, kada ji ištaisoma mūsų serveryje praeina laiko tarpas, kuriuo gali pasinaudoti įsilaužėliai.
Nors visų lygių TCP/IP protokolų šeimos protokolai standartizuoti, tačiau standartuose apibrėžta pakankamai plati veiksmų aibė. Vidutinio serverio normaliam darbui pakanka gerokai mažiau. Konkrečiam serveriui su ribotų servisų skaičiumi – dar mažiau.
Daug protokolų buvo sukurta, kai Internetas buvo žymiai mažesnis ir daugiau akademinis. Dėl tto kai kurios tais laikais, saugesniame, mažesniame ir ne plačiai prieinamame, tinkle, standartizuotos galimybės šiais laikais jau laikomos saugumo spragomis.
Žinodami serverio struktūra mes galime žymiai sumažinti potencialių įsilaužėlių veiksmų laisvę, nepažeisdami serverio funkcionalumo. Apriboti veiksmų laisvę galima visuose trijuose viršutiniuose (interneto, transportinis, programų) sluoksniuose. Apsaugos priemonių viename sluoksnyje nepakanka, nes tuomet dažnai tokią apsaugą galima apeiti pasinaudojant kitų sluoksnių teikiamais servisais.
Interneto sluoksnis. Informacijos vienetas šiame sluoksnyje – IP paketas. Paketus filtruoti galima pagal šaltinio bei tikslo adresus. Taip pat reikia išmesti IP paketus, kuriuose įjungta vėliavėlė „source routing“. Pastarasis atvejis yra puikus pavyzdys to, kaip standartizuota naudinga galimybė nesaugioje aplinkoje (šiuolaikinis Internetas) tampa saugumo spraga.
Neribojant serverio funkcionalumo galima taikyti tokius apribojimus:
• Nepriimti IP paketų iš Interneto su tam tikrais šaltinio adresais. Tai šaltinio adresai, kurie normaliomis sąlygomis negali ateiti iš Interneto. Tokia adresai yra: adresai iš mūsų vidinio tinklo, adresai iš adresų erdvės skirtos vidiniams tinklams (10.0.0.0, 192.168.0.0). Tokius paketus gali atsiųsti įsilaužėliai, bandydami įsilaužti, pasinaudodami interneto servisais, prieinamais tik vidinio tinklo vartotojams arba bandydami nuslėpti tikrają savo buvimo vietą.
• Neišleisti paketų į Internetą su vidinio tinklo tikslo adresais. Atsargumo priemonė prieš tai, kad kokia nors vidinė informacija netyčia nenuteketų už vidinio tinklo ribų.
• Neišleisti paketų į Internetą su šaltinio aadresais ne iš savo tinklo. Čia daugiau vidinės drausmės užtikrinimui. Taip sistemos administratorius gali užtikrinti, kad vidinio tinklo vartotojai nebandys laužyti svetimų sistemų IP paketais su padirbtais šaltinio adresais.
Transportinis sluoksnis. Šiame sluoksnyje apribojimai vykdomi pagal TCP bei UDP paketų šaltinio arba dažniausiai pagal tikslo portus. Jeigu neužsiimti kruopščiu tikslo portų atrinkinėjimu, tai galima bent uždrausti kreipinius į portus, naudojamus kreipiniams į potencialiai pavojingus servisus. Tai būtų servisai, per kuriuos įsilaužus būtų galima padaryti daug žalos (telnet 23/TCP portas, login 513/TCP portas) ir servisai su silpnu saugumo mechanizmu (tftp 69/UDP portas).
Programų sluoksnis. Jeigu interneto sluoksnyje praktiškai naudojamas tik vienas protokolas (IP), transportiniame sluoksnyje – du (TCP, UDP), tai programų sluoksnyje protokolų yra daug. Ir paprasto bei universalaus metodo kaip apriboti veiksmų laisvę universaliai, o ne atskirai konfigūruojant kiekvieną servisą, turbūt nėra. Tačiau ir čia galima apriboti prisijungimus pagal servisą ir pagal šaltinio adresą.
TCP/IP protokolų šeima vis plačiau naudojama šiuolaikiniuose tinkluose. TCP/IP populiarėjimą galima paaiškinti tuo, kad tai pakankamai valdoma ir universali protokolų šeima. Šiuos protokolus galima naudoti tiek lokaliuose, tiek globaliuose tinkluose.
Dar vienas TCP/IP populiarumo šaltinis – Internetas. Internetas tai pasaulinis tinklų junginys, metatinklas, naudojantis IP protokolą tam, kad sujungti įvairius fizinius tinklus į vieną loginį tinklą. Iš vienos ppusės, tai pigus transportas, galintis sujungti nutolusius tinklus. Iš kitos – Internetu gali pasinaudoti (ir naudojasi) įvairūs įsilaužėliai, kurie gali pavogti jūsų duomenis arba sutrukdyti kompiuterių darbą.
TCP/IP tai plačiai naudojama protokolų šeima, pavadinta pagal du šiai šeimai priklausančius protokolus. TCP/IP yra keturių sluoksnių protokolų šeima. Kiekvienas loginis sluoksnis atspindi tam tikrą duomenų perdavimo funkciją. Sluoksnis neapibrėžia konkretaus protokolo. Jis tik nusako to sluoksnio protokolų atliekamą funkciją. TCP/IP sudaro šie sluoksniai:
• Tinklo sluoksnis (Network Access Layer).
• Interneto sluoksnis (Internet Layer).
• Transportinis sluoksnis (Transport Layer).
• Programų sluoksnis (Application Layer).
Jeigu kalbama apie pavyzdžiui IP paketą, tai reiškia, kad mūsų nedomina į kokį pirmo sluoksnio paketą jis buvo „įvilktas“. Nesvarbu ar tai buvo Ethernet, PPP ar Frame Relay. Taip pat nedomina duomenų lauko struktūra. Nesvarbu ar ten yra TCP ar UDP paketas.
• IP paketas Iš techninių laukų darbe naudojami šaltinio ir tikslo adresai.
• TCP paketas Arba praktiškai analogiškai – UDP paketas. Naudojami šaltinio ir tikslo portai.
Norint maksimaliai apsaugoti tinklo kompiuterius nuo įsilaužėlių iš Interneto, reikia kaip galima labiau atskirti vidinį tinklą nuo Interneto. Vienas iš veiksmingesnių metodų – ugnies siena. Tačiau vien ugnies siena visiškai neapsisaugosime. Kaip ir bet kuria kita viena priemone. Reikia kompleksinio sprendimo. Pavyzdžiui šalia paketų filtrų, kurie yra ugnies sienos
dalis, panaudoti TCP apvalkalą.
Ugnies sienoje tinklo duomenų paketai iš Interneto atskirti nuo vidinio tinklo dviem maršrutizatoriais, kuriuose sukonfigūruoti paketų filtrai.
Išorinis maršrutizatorius sulaiko nepageidautinus tinklo duomenų paketus iš Interneto bei neišleidžia vidinio tinklo vartotojų tiesiogiai į Internetą. Prie perimetro tinklo prijungti kompiuteriai paprastai prieinami tiek iš vidaus, tiek iš išorės. Taip pat jie gali dirbti taprininkais vidinio tinklo vartotojams į Internetą. Ir vidinis maršrutizatorius nepraleidžia paketų iš Interneto į vidinį tinklą bei nereikalingu paketų iš vidinio tinklo į Interneta.
Kitas klaidų šaltinis &– buferio perpildymas programose dalinai sprendžiamas panaudojant Solar Designer Linux branduolio pataisymą [1]). Buferis perpildomas panašiose į žemiau pavaizduotają situacijose.
void internetas (char *str)
{
char eil[120];
strcpy (eil, str);
Mes kopijuojame funkcijai perduotą eilutę į fiksuoto dydžio buferį. Tačiau gali įvykti taip, kad šaltinio eilutė yra ilgesnė negu išskirtas buferio ilgis. Tuomet tolimesnis scenarijus būna toks: kadangi daugelyje C realizacijų vieta lokaliems kintamiesiems išskiriame steke, o čia pat yra ir grįžimo iš funkcijos adresas, tai tas adresas yra sugadinamas išeities eilutės duomenimis. GGeriausiu atveju tuomet programos vykdymas nutrūks. Blogiausiu atveju galima apskaičiuoti šaltinio eilutę ir sugrįžimo adresą sugadinti taip, kad valdymas būtų perduotas į išeities eilutės kūną.
Solar Designer pataisymas padaro steko segmentą nevykdomu. Taigi eliminuojama pavojingo kodo įvykdymo galimybė.
Potencialiai pavojingų funkcijų ssaraše pagrindinės funkcijos būtų gets(), strcpy() ir strcat(). Vietoj jų siūloma naudoti atitinkamai fgets(), strncpy() ir strncat(). O toliau sekančias funkcijas iš sisteminių bibliotekų reikėtų naudoti labai atsargiai. Tai sprintf(), fscanf(), scanf(), sscanf(), vsprintf(), realpath(), getopt(), getpass(), streadd(), strecpy(), strtrns().
Kai kuriose, ypač reikalaujančiose padidinto saugumo, sistemose gets() funkcijos net nėra sisteminėse bibliotekose, nes tai vienareikšmiška buferio perpildymo galimybė.
Dažniausiai klaidos apibūdinamos pagal klasifikaciją.
• Buferio perpildymas
• Lokalių programų paleidimas;
• Kitos klaidos.
Viena spragų grupė ryškiai didesnė už kitas. Tai buferio perpildymo problemos. Jos kyla dėl to, kad programoje vartotojo pateikti duomenys kopijuojami į fiksuoto ilgio buferius prieš tai nepatikrinus ar pateiktos eilutės ilgis neviršija duomenų buferio ilgio. Dėl to gali iškilti dvi problemos:
• Dalis vartotojo eilutės gali patekti į steką ir paskui būti įvykdyta kaip kkomandų seka.
• Programos veikimas gali nutrukti dėl tokios klaidos. Jei tai suid tipo programa – vartotojas įgys papildomų teisių sistemoje.
Trečiosios grupės klaidos leido nutolusiam vartotojui paleisti lokalias programas Interneto serveryje. Viena iš tokių klaidų buvo sendmail pašto transporto programoje, kuri dirba root teisėmis. Taigi vartotojo galimybės serveryje gali tapti praktiškai neribotomis.
Problemos branduolio dalyje kuri realizuoja TCP/IP protokolų steką iškyla branduoliui dirbant su tinklo duomenų paketais interneto bei transportiniame sluoksniuose. Būtent iš dviejų klaidų viena buvo rasta interneto sluoksnyje, kita &– transportiniame.
Interneto sluoksnyje buvo rasta problema ICMP paketus apdorojančiame kode. Ping tinklo paketu su daug duomenų (65508-65527 baitai) galima perkrauti kompiuterį su Linux operacine sistema. Tiesa ši klaida pasireiškė ir daugelyje kitų operacinių sistemų. Problema kyla todėl, kad perpildomas buferis.
Kita problema – „SYN flood“ ataka, kuri vykdoma transportiniame sluoksnyje. Čia pasinaudojama TCP sesijos užmezgimo ypatybėmis. Užmezgant TCP sesiją įvyksta trijų dalių „rankos paspaudimas“. Pirmiausia klientas serveriui siunčia taip vadinamą SYN paketą, serveris atsako SYN|ACK paketu ir pabaigoje klientas patvirtina sesijos užmezgimą ACK paketu.
Tokios atakos metu siunčia daug SYN paketų, tačiau nepatvirtina sesijos ACK paketais. Tuomet pakankamai greitai ušsipildo branduolio eilės, skirtos SYN buferizavimui ir branduolys nebegali priimti naujų prašymų TCP sesijų atidarymui.
Dar problema yra ta, kad iš anksto nuo tokių klaidų apsisaugoti nesudėtingai neišeina. Nuo ping atakos, jeigu iš vis neuždrausti ICMP paketų, galima apsisaugoti tik sutvarkius buferio perpildymą. „SYN flood“ atveju irgi situacija panaši. Tinklo duomenų paketai yra visiškai korektiški ir panašus srautas SYN paketų gali nesunkiai susidaryti pavyzdžiui kiek labiau užkrautame WWW serveryje. „SYN flood“ problema sprendžiama pridedant branduolyje funkcijas, kurios dirba atveju, kai atsiranda daug pusiau atidarytų TCP sesijų. Tuomet ilginama pauzė tarp atsakymų į SYN paketus, bei uždaromos tokios seniai pusiau atidarytos TCP sesijos.
Interneto servisai gali nnaudoti ir gerokai daugiau galimybių negu pats branduolys. Tai branduolio funkcijas, bibliotekų funkcijas, įvairius modulius.
Kad galėtume įvertinti apsaugos efektyvumą turime servisus paskirstyti pagal jų reikalingumą vartotojams iš Interneto. Nes interneto serveris dažniausiai jiems pateikia tik kelias funkcijas. Tačiau jame yra dar daug interneto servisų, kurie naudojami siauresnio rato žmonių tam tikriems tikslams. Pavyzdžiui, servero administravimui ir konfigūravimui.
Taigi vien atkirtus servisus, nebūtinus visiems vartotojams iš Interneto, mes (statistiškai) serverį apsaugosime nuo apie 64% galimų įsilaužimų. Taip pat sumažinus apdorojamų tinklo duomenų paketų aibę mes potencialiai serverį apsaugosime nuo dalies galimų atakų interneto ir transportiniame sluoksniuose.
Tai turės nemažą efektą ir todėl, kad laisvai prieinamų interneto servisų paprastai yra gana nedaug ir jie gana atidžiai peržiūrimi dėl potencialių saugumo spragų.
Tinklo duomenų paketai, atėję iš Interneto pirmiausia turi praeiti TCP/IP paketų filtrus prieš patekdami su jais dirbančiam Interneto servisui. Taip pat, prieš pradedant darbą su servisu, kliento duomenys patikrinami TCP apvalkale.
1997 metų darbuose išskirta 31 saugumo spraga. Po metų jų skaičius padviguėjo. Jų skaičiaus padidėjimą galima paaiškinti keliais veiksniais:
• Kelių operacinių sistemų ir Intenet tiklo išpopuliarėjimas. Dėl to daugiau žmonių peržiūrėjo branduolio ir jo kitų komponenčių išeities tekstus.
• Didėjančiu dėmesiu kompiuteriniam saugumui. Nes vis daugiau ir daugiau kompiuterių prisijungia prie Interneto tinklo. Dėl ko ddidėja potencialių įsilaužėlių skaičius.
Juntamai padidėjo buferio perpildymo klaidų dalis. To priežastis greičiausiai yra tai, kad tokio tipo klaidos randamos paprasčiausiai. Netgi nelabai kvalifikuotas programuotojas gali atsekti potencialų buferio perpildymą. Pakanka surasti ir išanalizuoti kreipinius į funkcijas strcpy(), sprintf() ir dar kelias. Funkcija gets() dabar jau praktiškai nebenaudojama.
Taip pat klaidų analizė rodo, kad vienos krypties pastangų neužtenka. Be paketų filtro ir TCP apvalkalo dar reikėtų:
• Paketų filtrus iškelti į kitą kompiuterį arba maršrutizatorių. Taip žymiai patikimiau apsaugosime Linux branduolį nuo „blogų“ IP paketų.
• Maksimaliai saugiai sukonfigūruoti laisvo priėjimo servisus.
• Imtis kitų priemonių tam, kad buferio perpildymas nesukeltų grėsmės sistemos saugumui.
Apsisaugojus nuo problemų riboto prieinamumo servisuose liko saugumo spragos laisvo priėjimo servisuose. Dažniausiai pasitaikanti spraga – buferio perpildymas. Ją gana įdomiai ir beveik pilnai išsprendžia Solar Designer parašytas Linux branduolio papildymas [1].
Buferio perpildymą beveik visada sukelia tos pačios funkcijos:
• gets. Jos iš viso neturėtų būti C kalba parašytose programose. Reikėtų keisti į fgets.
• strcpy. Iš vartotojo pateiktos simbolių eilutės į kopijuojant į fiksuoto ilgio buferį, jį galima perpildyti. Problemą galima spręsti arba keičiant funkciją į strncpy, arba prieš iškviečiant strcpy patikrinti vartotojo pateiktos simbolių eilutės ilgį.
• sprintf. Problemos tos pačios kaip ir su strcpy. Sprendimo metodai irgi tokie patys.
Keisti galima į snprintf.
Analizuotinos situacijos yra tik su strcpy ir sprintf. Ir gali būti, kad galima parašyti programą, kuri, kiek padedama vartotojo, galėtų atsekti šių funkcijų parametrų kilmę ir parodytų potencialiai pavojingas vietas.
Plačiausiai naudojami laisvai prieinami servisai dažniausiai dirba be TCP apvalkalo pagalbos, kad gautų maksimalų darbo greitį. Taip dirba labiausiai apkrauti iš visų servisų: naujienų (NNTP), pašto transporto (SMTP) ir WWW serveriai. Čia iškyla daugiau problemų – kaip juos sukonfigūruoti, kad potencialios saugumo spragos keltų minimalią grėsmę visos ssistemos saugumui.
Literatūros sąrašas
1. Increasing Security on IP Networks. http://www.cisco.com/warp/public/701/31.html 1997
2. Bugtraq mailing list archives. http://www.geek-girl.com/bugtraq/ 1998
3. Linux-alert mailing list archives. http://www.sonic.net/hypermail/alert/ 1998
4. Linux Online – Help Center. http://www.linux.org/help/ 1998
5. Mark Grennan Firewalling and Proxy Server HOWTO. http://sunsite.unc.edu/LDP/HOWTO/Firewall-HOWTO.html 1996
6. Michael Hasenstein Linux IP Network Address Translation. http://www.csn.tu-chemnitz.de/HyperNews/get/linux-ip-nat.html 1998
7. Albert Kahalan The Linux Kernel Wish List http://www.cs.uml.edu/_acahalan/linux/22wishlist.html 1997
8. Solar Designer http://www.false.com/security/linux/index.html 1997
9. Infilsec Vulnerabilities Database. http://www.infilsec.com/vulnerabilities/ 1998
10. rootshell.com http://www.rootshell.com/ 1998
11. D.Brent Chapman, Elizabeth D.Zwicky Building Internet Firewalls. O_Reilly & Associates 544pp 1995.
12. Simson Garfinkel, Gene Spafford Practical Unix and Internet Security, 2nd ed. OO_Reilly & Associates 1004pp 1996.
13. Simson Garfinkel, Gene Spafford Web Security & Commerce. O_Reilly & Associates 506pp 1997.
14. Craig Hunt TCP/IP Network Administration. O_Reilly & Associates 502pp 1992.
15. AElen Frisch Essential System Administration, 2nd ed. O_Reilly & Associates 788pp 1995.