Soluţii - PC Magazine Romania, August 2004
INTERNET PRO - Cerberul meu
Alexandru Ioan Lazăr
Identitatea este o mare problemă pe Internet (vezi, am şi ajuns la un consens?). Uite un exemplu: în fiecare seară vin de la şcoală şi prima mea oprire este calculatorul. Îmi verific mesajele, şi - normal - serverul se interesează cine sunt. Acesta e cazul cel mai simplu: normal că trebuie să ştie cine sunt, de vreme ce vreau să-mi verific mesajele (de unde să ştie serverul care sunt mesajele mele?).
Normal că asta implică şi un pic de bun-simţ din partea mea. Ca orice utilizator de bună-credinţa (yeah, right…) nu sunt interesat decât de propriile mele mesaje, nu mă interesează mail-urile colegului de bancă, şi chiar aşa, nu îi ştiu parola şi nici nu vreau s-o aflu. ☺
În lumea ,,normală", identitatea nu pune probleme securităţii decât în cazuri extreme. Asta pentru că numele meu este, inevitabil, asociat chipului meu. Cine m-a văzut o dată, va şti că sunt… eu. Normal, dacă aş fi dat în urmărire generală şi aş vrea să mă ascund, aş putea să îmi schimb înfăţişarea, dar aş putea fi, inevitabil, recunoscut (profilul nasului, strabismul…). Lucrurile sunt cam pe dos atunci când vorbim de Internet. În general, nu mă pot prezenta unui om cu IP-ul (,,bună ziua, 197.156.122.63 mă numesc, dumneavoastră"?) - dar asta e cam singura metodă prin care calculatoarele se pot recunoaşte pe Internet: IP-ul şi adresa MAC a plăcii Ethernet.
,,Nu pot… la ora aia mă dedublez"
Înainte să-ţi povestesc despre Kerberos, vreau să-ţi explic un pic problema identităţii. Când îţi verifici căsuţa de mail, introduci un nume de utilizator şi o parolă. Atunci declari identitatea ta ca utilizator: ,,Bună, puiule, std[@cwazy.co.uk] mă numesc, uite parola, mă laşi să intru?". Eu pot să-mi verific mail-ul de pe orice calculator legat la Internet: nu calculatorul care intră e problema, pentru că nu el vede e-mail-ul, ci eu, utilizatorul; eu pot fi std@cwazy.co.uk, dar la fel de bine pot fi şi altcineva.
Pentru securitatea reţelelor, situaţia este mai complicată. Eu pot, desigur, să falsific identitatea unui utilizator (să spun că sunt "root" când, de fapt, nu sunt). Lucrul acesta devine însă din ce în ce mai greu. Parole sigure şi mascate prin shadow înseamnă o securitatea aproape imposibil de compromis. Singura metodă (care trebuie însă luată în seamă!) este interceptarea pachetelor care conţin numele de utilizator şi parola.
Dacă ai citit articolele din serialul tocmai terminat îţi aminteşti, probabil, de o situaţie în care perechea username-password este inutilă: atunci când autentificarea se face identificând nu utilizatorul, ci calculatorul. Mda, imitarea IP. Atunci, privilegiul de de utilizator al unei maşini nu este al meu, ca persoană, ci al maşinii în care cealaltă are încredere. Oricine are acces la acea maşină este utilizator al celeilalte. Nu mai are nici un sens să falsific identitatea utilizatorului (care utilizator, în fond?) - eu trebuie să falsific identitatea maşinii.
Atunci când între două maşini există o relaţie de încredere, cum se pot identifica ele una pe alta dacă nu prin IP? Dar şi IP-ul poate fi falsificat. Ce securitate mai e asta? Atunci e nevoie de încă ceva… eventual criptat, ca să fie greu de spart.
Biletele la control…
Tocmai pe asta se bazează Kerberos. El este, de fapt, un sistem de autentificare. Numai că este un sistem mai "hoţ": identificarea se face nu numai pe bază de nume de utilizator şi parolă, ci şi pe un ansamblu de chei şi bilete (tickets) numite credentials .
Kerberos este implementat ca un sistem de servere: unul se ocupă cu alocarea cheilor (servere Kerberos), iar celălat cu alocarea "biletelor" (server ticket-granting). Biletele sunt criptate, folosind un algoritm DES (aşa că sunt sigure… cel puţin pentru următoarele trei ere geografice ☺) pentru chei cunoscute numai de client şi de server.
Un bilet este, în esenţă, un mesaj (care include şi cheia alocată clientului la autentificare). Folosind mesajul acesta, un client poate folosi un serviciu furnizat de server - dar într-un mod absolut sigur. Sunt destui care pot falsifica un IP, dar o cheie AES-256 CTS, de exemplu, este ceva mai greu de falsificat. De fapt, e practic imposibil, timpul necesar e prea mare.
Principiul este, în mare, următorul: utilizatorul introduce numele de utilizator şi parola. I se alocă un bilet iniţial - pe care îl poate folosi ca să obţină bilete pentru alte servicii. După care, folosind aceste ultime bilete, el poate folosi serviciile care le urmăresc până la expirararea biletelor, când va trebui din nou să fie autentificat prin procesul de login. Procesul este perfect transparent pentru utilizator - singurul lucru pe care nu îl cunoaşte exact este timpul de expirare al biletelor.
Toate aceste credentials sunt stocate în aşa-numitul credentials-cache de pe hard-disk, într-un fişier. Locaţia acestui fişier poate fi specificată în fişierele de configurare Kerberos - şi ar fi foarte bine să o setezi….
Evident, marele avantaj în folosirea Kerberos este că, de vreme ce negociază comunicaţiile prin pachete autentificate şi (opţional) criptate, securitatea nu depinde de firewall (pachetele sunt oricum filtrate, pentru că sunt autentificate şi criptate: ce nu corespunde cu biletul e respins).
Un cerber îmblânzit
Teoretic, Kerberos este perfect sigur. Asta e teoria. În acest moment, există mai multe metode de a zădărnici această protecţie - majoritatea destul de complexe (în fond, Kerberos este dezvoltat de MIT) dar eficiente.
Prima (şi cea mai întâlnită situaţie) este aceea în care nu ai setat locaţia credentials-cache-ului, tocmai ţi-ai bătut un cui în talpă. Kerberos merită folosit, de exemplu, pe servere de fişiere. Problema este că, dacă nu ai specificat explicit altceva, locaţia cache-ului este în /tmp/<UID> (sub Linux, cel puţin), unde <UID> este UID-ul utilizatorului căruia îi aparţine credential-ul. Dacă mai mulţi utilizatori sunt logaţi simultan şi pot citi aceste fişiere, ei tocmai au făcut rost de credential-urile de care aveau nevoie pentru a se da drept altcineva. Aşa că asigură-te că aceste credential-uri sunt stocate departe de ochii utilizatorilor prea curioşi.
Mai este o problemă. Pentru asta pot să garantez, pentru că am încercat-o (e drept, pe o versiune veche, pe Linux Fedora Core I, distribuţia pe care o folosesc, nu am încercat încă). Dacă durata de expirare a biletului este foarte mare (de ordinul orelor), atunci cand un client părăseşte sistemul prin logout, biletele, cu credentials cu tot, rămân acolo. Atunci un atacator care are parola şi numele de utilizator al acelui client poate să treacă peste bariera impusă de Kerberos asumându-şi adresa clientului. Un fel de imitare IP mai avansată.
Cerberi de închiriat
Pachetul Kerberos este dezvoltat de MIT (iniţial a fost realizat pentru utilizare in-house, în condiţiile proiectulu Athena), şi poate fi obţinut de pe site-ul sus-numite instituţii: http://web.mit.edu/kerberos/dist/index.html . Pachetul Kerberos este disponibil pentru sistemele UNIX, şi probabil că îl vei găsi chiar cu distribuţia pe care o folseşti (poate nu în cazul tuturor, dar pot garanta pentru Linux Fedora Core şi pentru Slackware 8.1 şi 9.x). Personal sunt fan declarat al Kerberos, pentru că, dacă îl configurezi corect, pachetul îţi va asigura o securitate excelentă, şi îţi recomand să-l foloseşti mai ales dacă ai de administrat o reţea mare, unde acţiunile de IP-spoofing sunt totuşi destul de greu de detectat. Este disponibil pentru mai multe platforme - UNIX, Win32, Mac, Cygnus.
Până data viitoare, eu îţi urez mult noroc, şi, ca să citez un clasic în viaţă,
"stay with the law". Aştept mesajele tale: std@cwazy.co.uk.
|