Programavimas

J2EE sauga: konteineris, palyginti su pasirinktiniu

Nuo tada, kai prisijungimo puslapis pirmą kartą buvo pridėtas prie žiniatinklio programos, saugumas visada buvo vienas iš svarbiausių komponentų, lemiančių programų sėkmę žiniatinklyje. Istoriškai viskas buvo užkoduota rankomis. Kiekviena žiniatinklio programa turėjo pasirinktinį metodą, kaip autentifikuoti vartotojus ir paskui juos įgalioti. Kūrėjai taip pat sukūrė komponentus registracijai, administravimui ir bet kuriai kitai reikalingai funkcijai. Šis metodas leido labai lanksčiai, nors ir nemažai pridėtinių išlaidų.

Atsiradus JAAS, „Java“ autentifikavimo ir autorizavimo tarnybai, programos įgijo sąsajų rinkinį ir konfigūraciją, kurią galėjo panaudoti standartizuodamos tas užduotis. Net pridėjus JAAS prie specifikacijos, J2EE vis tiek turi išspręsti kelias problemas, kad programų kūrėjai galėtų nustoti kurti pasirinktines API. Norint pasirinkti, ar naudoti J2EE standartus, ar sukurti pasirinktinį sprendimą, reikia žinoti kiekvieno kompromisą ir, žinoma, jūsų programos reikalavimus.

Šiuo straipsniu siekiama pateikti visą informaciją, kurios reikia norint nuspręsti dėl pasirinktinio ar konteinerio saugumo. Aptariu dažniausiai pasitaikančias programų saugos funkcijas, kad būtų užtikrintas būtinas saugumo pagrindas. Po šios diskusijos pateikiamas išsamus J2EE saugos diegimo paaiškinimas, pateiktas specifikacijose, taip pat dažniausiai naudojami individualaus saugumo diegimo metodai. Geriau supratę kiekvieną iš metodų, turėtumėte turėti pakankamai informacijos, kad pasirinktumėte, kuris metodas geriausiai atitinka jūsų programos reikalavimus.

Kas yra konteineris?

Prieš aptardami skirtingus saugumo tipus ir saugumo diegimo problemas, apžvelkime ką konteinerį yra. Sudėtinis rodinys yra aplinka, kurioje veikia programa. Tai taip pat yra „J2EE“ programų serverio sinonimas. Kalbant apie „J2EE“ konteinerius, konteinerio viduje veikia „J2EE“ programa, kuriai tenka konkreti atsakomybė dėl programos. Yra daug skirtingų J2EE talpyklų tipų ir skirtingo lygio J2EE palaikymas. „Tomcat“ iš „Apache“ yra žiniatinklio konteineris, įgyvendinantis tik J2EE specifikacijos „Servlet“ (žiniatinklio programos) dalis. BEA „WebLogic“ yra visiškai suderinamas su „J2EE“ programų serveriu, tai reiškia, kad jis palaiko visus J2EE specifikacijos aspektus ir išlaikė „Sun“ J2EE sertifikavimo testus. Jei nesate tikri dėl jūsų programų serverio palaikymo, susisiekite su pardavėju, kad gautumėte daugiau informacijos.

Programos saugumas

Kita tema, kurią turime aptarti prieš pradėdami, yra skirtumas tarp programos saugumas ir kitos apsaugos rūšys. Programos saugumas yra apsauga, kurią tiesiogiai taiko programa, arba netiesiogiai programos pagrindas ar sudėtinis rodinys tos programos naudotojų atžvilgiu. Programos vartotojo pavyzdys yra tas, kuris prisijungia prie internetinio knygyno ir įsigyja keletą „Java“ knygų. Yra ir kitų rūšių saugumas, pavyzdžiui, tinklo saugumas ir JVM saugumas. Vienas iš šių saugos tipų yra vartotojas, kuris mašinoje pradeda „Java“ procesą. Visoje šio straipsnio dalyje, kai tik aptariu saugumą, turiu omenyje programų saugumą. Kiti saugumo tipai nepatenka į šios diskusijos taikymo sritį.

Čia daugiausia dėmesio skiriama J2EE saugumui, kuris yra programos saugumo tipas, nes jis susijęs su J2EE programos vartotojais (t. Y. Skambinančiaisiais). Vartotojas gali būti tas, kuris naudojasi internetiniu knygynu ar kita programa, kuri naudojasi knygyno programos pirkimo paslaugomis, pavyzdžiui, kitas internetinis perpardavėjas.

Programų saugos funkcijos

Svarstant programos saugumą yra penkios pagrindinės funkcijos: autentifikavimas, prieigos teisė, registracija, paskyros priežiūra (atnaujinimai) ir paskyros ištrynimas / inaktyvinimas. Nors programoje gali būti tik nedidelis visų galimų funkcijų pogrupis, jos yra pačios svarbiausios ir gana standartiškos visoms programoms. Formaliau tariant, šios funkcijos yra vartotojo pažinimas (autentifikavimas), žinojimas, ką vartotojas gali padaryti (autorizavimas), naujų vartotojų sukūrimas (registracija), vartotojo informacijos atnaujinimas (paskyros priežiūra) ir vartotojo pašalinimas arba neleidimas vartotojui pasiekti programą (paskyros ištrynimas).

Daugelis programų leidžia vartotojui arba administratoriui atlikti šias funkcijas. Kai vartotojai vykdo šias funkcijas, jie tai daro patys. Administratoriai šias funkcijas visada vykdo kitų vartotojų vardu.

Kaip bus parodyta, visų šių funkcijų negalima atlikti be pasirinktinio sprendimo, net ir autentifikavimui. Trumpai apžvelgsime kiekvieną iš jų, norėdami toliau iliustruoti sąvokas ir tai, ko trūksta „J2EE“.

Autentifikavimas

Autentifikavimas yra vartotojo, sąveikaujančio su programa, identifikavimo procesas. Šio rašymo metu J2EE autentifikavimas galėjo būti įgyvendintas naudojant įvairius sprendimus, kiekvienas apibrėžtas kaip J2EE specifikacijos dalis (versija 1.0-1.4). Autentifikavimas yra pagrindinė šios diskusijos samprata, kuri bus išsamiau aptarta vėliau. Svarbu suvokti, kad autentifikavimas yra saugos funkcija, kuri turi didžiausią palaikymą pagal J2EE specifikaciją, tačiau norint įdiegti J2EE autentifikavimą (dar vadinamą konteinerio autentifikavimu) paprastai reikalingas pasirinktinis kodas arba konfigūracija.

Leidimas

Įgaliojimas yra procesas, kuriuo patikrinama, ar vartotojas turi leidimą atlikti konkretų veiksmą. J2EE apima šią temą, tačiau ji yra apribota pagal vaidmenimis pagrįstą prieigą, o tai reiškia, kad veikla gali būti ribojama atsižvelgiant į vartotojui suteiktus vaidmenis. Pvz., Valdytojo vaidmens vartotojai gali ištrinti atsargas, o darbuotojai - darbuotojo vaidmenyje.

Be to, programos gali apsvarstyti du skirtingus autorizacijos tipus: „Java Runtime Environment“ (JRE) / sudėtinį rodinį ir programos įgaliojimą. JRE / „container“ įgaliojimas yra procesas, kuriuo nustatoma, ar prašymą pateikiantis vartotojas turi privilegijas tai padaryti. JRE / konteineris tai nustato prieš vykdydamas kodą. Pavyzdys yra J2EE sudėtinis rodinys, kuris prieš vykdydamas servletą pirmiausia turi patikrinti, ar dabartinis vartotojas turi leidimus vykdyti servletą (naudojant išteklių URL apribojimą). Šis autorizacijos tipas taip pat žinomas kaip deklaratyvus saugumas nes tai deklaruojama žiniatinklio programos konfigūracijos failuose. Deklaracinio saugumo negalima keisti vykdymo metu, nebent tai palaiko sudėtinis rodinys. Deklaracinis saugumas gali būti naudojamas daugeliu būdų suteikiant įgaliojimus J2EE programos vartotojams, tačiau ta tema nepatenka į šios diskusijos sritį. (Žr. „Servlet 2.3“ specifikacijos 12 skyrių. 2 skyrius apima deklaruojamąjį saugumą, o 8 yra geras saugumo apribojimų atspirties taškas.)

Kaip minėta anksčiau, vartotojas gali būti kita programa arba tiesiog programos vartotojas. Bet kuriuo atveju JRE / konteinerio autorizacija atliekama kiekvienos užklausos metu. Šios užklausos gali būti HTTP užklausos iš naršyklės į žiniatinklio programą arba nuotoliniai EJB („Enterprise JavaBeans“) skambučiai. Bet kuriuo atveju, jei JRE / konteineris pažįsta vartotoją, jis gali atlikti prieigą remdamasis to vartotojo informacija.

Programos autorizavimas yra autorizacijos procesas, kai programa vykdoma. Programos leidimą galima toliau suskirstyti į vaidmenimis ir segmentais pagrįstą prieigą. Vaidmenimis pagrįstos programos autorizacijos pavyzdys yra tas, kai programa taiko skirtingus žymėjimo lygius, atsižvelgdama į tai, ar vartotojas yra darbuotojas, ar lankytojas (t. Y. Darbuotojo nuolaida). J2EE teikia vadinamąsias API programinis saugumas įvykdyti vaidmenimis pagrįstą prieigą (daugiau informacijos žr. „Servlet 2.3“ specifikacijos 12 skyriaus 3 skyriuje).

Segmentu pagrįsta prieiga yra autorizacija, pagrįsta kitais vartotojo atributais, tokiais kaip amžius ar pomėgiai. Segmentu pagrįsta autorizacija vadinama tokia, nes ji grupuoja vartotojus į segmentus pagal konkrečius atributus. J2EE neturi segmentais pagrįsto leidimo įgyvendinimo metodo. Segmentais pagrįsto autorizavimo pavyzdys yra tai, ar formos mygtuką mato vyresni nei 40 metų vartotojai. Kai kurie pardavėjai gali pasiūlyti tokio tipo autorizaciją, tačiau tai garantuotų pardavėjo blokavimą visais atvejais.

Registracija

Registracija yra naujo vartotojo įtraukimo į programą procesas. Programos vartotojai gali patys susikurti naujas paskyras arba programa gali pasirinkti šią veiklą apriboti programų administratoriams. J2EE specifikacijoje nėra API ar konfigūracijos, leidžiančios programoms pridėti naujų vartotojų; todėl šio tipo saugumas visada yra sukurtas pagal užsakymą. „J2EE“ negali pasakyti konteineriui, kad naujas vartotojas užregistravo, ir kad jos sesijos metu jos informacija turi būti palaikoma ir palaikoma.

Priežiūra

Sąskaitos priežiūra yra paskyros informacijos, tokios kaip kontaktinė informacija, prisijungimai ar slaptažodžiai, keitimas. Daugelis programų leidžia programų vartotojams ir administratoriams atlikti priežiūrą. J2EE specifikacijoje taip pat trūksta API ar konfigūracijos paskyros priežiūrai. Trūksta mechanizmo, kaip informuoti sudėtinį rodinį, kad pasikeitė vartotojo informacija.

Ištrinti

Paskyra ištrinama paprastai tik administratoriams. Retais atvejais kai kurios programos gali leisti vartotojams ištrinti savo paskyras. Dauguma programų iš tikrųjų niekada neištrina vartotojų; jie tiesiog inaktyvina paskyrą, kad vartotojas nebegalėtų prisijungti. Atlikus sudėtingus ir greitus ištrynimus, dažniausiai yra paniekinta, nes paskyros duomenys yra kur kas sunkiau prikelti, jei to reikia. J2EE nėra būdas pašalinti ar inaktyvuoti vartotojus iš programų. Trūksta mechanizmo, leidžiančio pasakyti konteineriui, kad konkretus vartotojas buvo inaktyvuotas arba pašalintas. J2EE taip pat trūksta mechanizmo, kaip nedelsiant atjungti vartotoją iš programos, kai jos paskyra bus ištrinta.

Kas yra konteinerio autentifikavimas?

Konteinerio autentifikavimas yra procesas, nurodantis konteineriui vartotojo, pateikiančio dabartinę užklausą, tapatybę. Daugumai konteinerių šis procesas apima srovės susiejimą „ServletRequest“ objektas, dabartinė vykdymo gija ir vidinė sesija su vartotojo tapatybe. Susiejęs seansą su tapatybe, sudėtinis rodinys gali garantuoti, kad dabartinė užklausa ir visos paskesnės to paties vartotojo užklausos gali būti susietos su ta pačia seansu, kol baigsis to vartotojo seansas. Šis seanso objektas paprastai nėra tas pats, kas „HttpSession“ objektas, nors pirmasis naudojamas kuriant ir palaikant antrąjį. Kiekviena paskesnė to paties vartotojo užklausa yra susieta su seansu naudojant URL perrašymą arba seanso slapuką pagal „Servlet 2.3“ specifikacijos 7 skyrių.

Kaip jau minėta aptariant įgaliojimą, kiekvienas veiksmas, kurį atlieka sudėtinis rodinys, taip pat visi veiksmai, kuriuos JRE atlieka vartotojo vardu, yra kruopščiai tikrinami, kad būtų užtikrinta, jog vartotojas turi leidimą atlikti veiksmą. Pakartodamas ankstesnį pavyzdį, kai konteineris vartotojo vardu vykdo servletą, jis patikrina, ar vartotojas priklauso vaidmenų rinkiniui, kuriam suteikiami leidimai vykdyti tą servletą. JRE 1.4 taip pat atlieka šiuos daugelio veiksmų patikrinimus, įskaitant tada, kai atsidaro failas ar lizdas. JRE autentifikavimas yra galinga sąvoka ir gali užtikrinti, kad kiekvienas užklausa į konteinerį yra iš esmės saugi.

Šiuo metu J2EE pateikia kelis skirtingus vartotojo autentifikavimo mechanizmus. Tai apima formos autentifikavimą, HTTPS kliento autentifikavimą ir pagrindinį HTTP autentifikavimą. JAAS yra įtrauktas kaip būtinas autentifikavimo metodas, kurį konteineriai turi palaikyti. Tačiau specifikacija nėra griežta, kaip konteineris turėtų suteikti šią funkciją; todėl kiekvienas konteineris teikia skirtingą JAAS palaikymą. Be to, JAAS savaime yra atskira autentifikavimo sistema ir gali būti naudojama įgyvendinant konteinerio autentifikavimą, neatsižvelgiant į tai, ar specifikacija ją palaiko. Vėliau šią sąvoką paaiškinu išsamiau.

Kiekvienas iš autentifikavimo mechanizmų suteikia standartinį būdą, kaip pateikti konteineriui informaciją apie vartotoją. Aš tai vadinu įgaliojimų realizavimas. Sudėtinis rodinys vis tiek turi naudoti šią informaciją norėdamas patikrinti, ar vartotojas egzistuoja ir turi leidimų, reikalingų pateikti užklausą. Aš tai vadinu kredencialų autentifikavimas. Kai kurie sudėtiniai rodiniai pateikia konfigūraciją, kad būtų galima nustatyti kredencialų autentifikavimą, o kiti teikia sąsajas, kurias reikia įdiegti.

J2EE autentifikavimo metodai

Trumpai apžvelkime keletą labiausiai paplitusių konteinerio autentifikavimo diegimo ir konfigūravimo metodų.

Forma pagrįstas autentifikavimas

Forma pagrįstas autentifikavimas leidžia vartotojus identifikuoti ir patvirtinti J2EE programų serveryje naudojant bet kurią HTML formą. Formos veiksmas turi būti j_security_check ir du HTTP užklausos parametrai (formos įvesties laukai) visada turi būti užklausoje, vienas vadinamas j_naudotojo vardas ir kitas, j_ slaptažodis. Naudojant formą pagrįstą autentifikavimą, kredencialų realizavimas įvyksta, kai forma pateikiama, o vartotojo vardas ir slaptažodis siunčiami į serverį.

Čia pateikiamas JSP („JavaServer Pages“) puslapio, kuriame naudojamas formos patvirtinimas, pavyzdys:

 Prisijungti Įveskite savo vartotojo vardą:

Įveskite savo slaptažodį:

$config[zx-auto] not found$config[zx-overlay] not found