Programovanie

Zabezpečenie J2EE: Kontajner oproti zvyku

Od prvého pridania prihlasovacej stránky do webovej aplikácie bolo zabezpečenie vždy jedným z kľúčových komponentov rozhodujúcich pre úspech aplikácií na webe. Historicky bolo všetko kódované ručne. Každá webová aplikácia mala vlastnú metódu autentifikácie a následného autorizácie používateľov. Vývojári tiež zabudovali komponenty na registráciu, správu a ďalšie potrebné funkcie. Aj keď to bol dosť režijný náklad, tento prístup umožňoval veľkú flexibilitu.

S príchodom JAAS, služby Java Authentication and Authorization Service, aplikácie získali sadu rozhraní a konfiguráciu, ktorú mohli využiť na štandardizáciu týchto úloh. Aj po pridaní JAAS do špecifikácie má J2EE stále niekoľko problémov na vyriešenie, než vývojári aplikácií môžu prestať vytvárať vlastné API. Vybrať si medzi použitím štandardov J2EE alebo vytvorením vlastného riešenia si vyžaduje poznanie kompromisov každého z nich a samozrejme požiadavky vašej aplikácie.

Cieľom tohto článku je poskytnúť všetky informácie potrebné na rozhodovanie medzi vlastnou bezpečnosťou alebo bezpečnosťou kontajnera. Diskutujem o najbežnejších bezpečnostných funkciách aplikácií na zabezpečenie potrebného pozadia bezpečnosti. Po tejto diskusii nasleduje podrobné vysvetlenie implementácií zabezpečenia J2EE, ktoré poskytujú špecifikácie, ako aj najbežnejšie metódy implementácie vlastnej bezpečnosti. Keď lepšie pochopíte každú z metód, mali by ste mať dostatok informácií na výber, ktorá metóda najlepšie vyhovuje požiadavkám vašej aplikácie.

Čo je to kontajner?

Predtým, ako prediskutujeme rôzne typy zabezpečenia a obavy týkajúce sa implementácie zabezpečenia, pozrime sa, čo a kontajner je. Kontajner je prostredie, v ktorom je spustená aplikácia. Je tiež synonymom pre aplikačný server J2EE. Pokiaľ ide o kontajnery J2EE, vo vnútri kontajnera beží aplikácia J2EE, ktorá má voči aplikácii konkrétne zodpovednosti. Existuje veľa rôznych typov kontajnerov J2EE a rôzne úrovne podpory J2EE. Tomcat od Apache je webový kontajner, ktorý implementuje iba časti servletu (webovej aplikácie) špecifikácie J2EE. WebLogic od spoločnosti BEA je plne kompatibilný aplikačný server J2EE, čo znamená, že podporuje všetky aspekty špecifikácie J2EE a prešiel certifikačnými testami spoločnosti Sun J2EE. Ak si nie ste istí podporou, ktorú váš aplikačný server poskytuje, požiadajte o ďalšie informácie predajcu.

Zabezpečenie aplikácií

Ďalšou témou, ktorej sa musíme venovať skôr, ako začneme, je rozlišovanie medzi bezpečnosť aplikácií a ďalšie typy zabezpečenia. Zabezpečenie aplikácie je zabezpečenie vykonávané priamo aplikáciou alebo nepriamo rámcom alebo kontajnerom pre aplikáciu vo vzťahu k používateľom tejto aplikácie. Príkladom používateľa aplikácie je niekto, kto sa prihlási do online kníhkupectva a zakúpi si niekoľko kníh Java. Existujú aj iné typy zabezpečenia, napríklad zabezpečenie siete a zabezpečenie JVM. Jedným z príkladov týchto typov zabezpečenia je používateľ, ktorý na počítači spustí proces Java. Po zvyšok tohto článku, kedykoľvek budem diskutovať o bezpečnosti, myslím tým bezpečnosť aplikácií. Ostatné typy zabezpečenia siahajú mimo rámec tejto diskusie.

Tu sa kladieme dôraz hlavne na zabezpečenie J2EE, čo je typ zabezpečenia aplikácie, pretože sa zaoberá používateľmi aplikácie J2EE (t. J. Volajúci). Užívateľom môže byť niekto, kto používa kníhkupectvo online, alebo iná aplikácia, ktorá využíva nákupné služby aplikácie pre kníhkupectvá, napríklad iný online predajca.

Bezpečnostné funkcie aplikácií

Pri zvažovaní zabezpečenia aplikácie existuje päť hlavných funkcií: autentifikácia, autorizácia, registrácia, údržba účtu (aktualizácie) a mazanie / deaktivácia účtu. Aj keď existuje iba malá podmnožina všetkých možných funkcií, ktoré môže mať aplikácia, sú to tie najzákladnejšie a najštandardnejšie pre všetky aplikácie. Menej formálne sú tieto funkcie poznanie používateľa (autentifikácia), znalosť toho, čo môže používateľ robiť (autorizácia), vytváranie nových používateľov (registrácia), aktualizácia informácií o používateľovi (údržba účtu) a odstránenie používateľa alebo zabránenie prístupu používateľa k aplikácii. (vymazanie účtu).

Väčšina aplikácií umožňuje vykonávanie týchto funkcií používateľovi alebo správcovi. Keď používatelia vykonávajú tieto funkcie, robia to pre seba. Správcovia tieto funkcie vždy vykonávajú v mene iných používateľov.

Ako bude ilustrované, všetky tieto funkcie nie je možné dosiahnuť bez vlastného riešenia, dokonca ani pri autentifikácii. Krátko si prejdeme každú z nich, aby sme ďalej ilustrovali koncepty a to, čo J2EE chýba, ktoré musia byť vyrobené na mieru.

Overenie

Autentifikácia je proces identifikácie používateľa, ktorý interaguje s aplikáciou. V čase písania tohto článku bolo možné autentifikáciu J2EE implementovať pomocou rôznych riešení, z ktorých každé bolo definované ako súčasť špecifikácie J2EE (verzia 1.0-1.4). Autentifikácia je hlavným pojmom tejto diskusie a ďalej sa jej budeme podrobnejšie venovať. Je dôležité si uvedomiť, že autentifikácia je bezpečnostná funkcia, ktorá má najväčšiu podporu v rámci špecifikácie J2EE, ale na implementáciu autentifikácie J2EE (alias autentifikácia kontajnera) sa zvyčajne vyžaduje vlastný kód alebo konfigurácia.

Povolenie

Autorizácia je proces overovania, či má používateľ povolenie na vykonanie konkrétnej akcie. J2EE sa venuje tejto téme, ale je obmedzená na autorizáciu na základe rolí, čo znamená, že činnosť môže byť obmedzená na základe rolí, ktoré používateľ dostal. Napríklad používatelia v role manažéra môžu byť schopní vymazať inventár, zatiaľ čo používatelia v role zamestnanca nie.

Aplikácie môžu navyše brať do úvahy dva rôzne typy autorizácie: Java Runtime Environment (JRE) / kontajner a autorizácia aplikácie. Autorizácia JRE / kontajnera je proces zisťovania, či má užívateľ, ktorý žiada, oprávnenie. Toto určuje JRE / kontajner pred vykonaním ľubovoľného kódu. Príkladom je kontajner J2EE, ktorý musí pred vykonaním servletu najskôr skontrolovať, či má aktuálny používateľ oprávnenie na vykonávanie servletu (prostredníctvom obmedzenia adresy URL zdroja). Tento typ autorizácie je tiež známy ako deklaratívna bezpečnosť pretože je deklarovaný v konfiguračných súboroch pre webovú aplikáciu. Pokiaľ to kontajner nepodporuje, deklaratívne zabezpečenie nie je možné za behu meniť. Deklaratívne zabezpečenie možno použiť na autorizáciu používateľov aplikácií J2EE mnohými spôsobmi, ale táto téma siaha mimo rámec tejto diskusie. (Pozri špecifikáciu servletu 2.3, kapitola 12. Oddiel 2 sa týka deklaratívnej bezpečnosti a 8 je dobrým východiskovým bodom pre bezpečnostné obmedzenia.)

Ako už bolo spomenuté, používateľom môže byť iná aplikácia alebo jednoducho používateľ aplikácie. V každom prípade sa autorizácia JRE / kontajnera vykonáva počas každej požiadavky. Môžu to byť požiadavky HTTP z prehľadávača na webovú aplikáciu alebo vzdialené hovory EJB (Enterprise JavaBeans). V obidvoch prípadoch, za predpokladu, že JRE / kontajner pozná používateľa, môže vykonať autorizáciu na základe informácií tohto používateľa.

Autorizácia aplikácie je proces autorizácie počas vykonávania aplikácie. Autorizáciu aplikácie je možné ďalej rozdeliť na autorizáciu na základe rolí a segmentov. Príkladom autorizácie aplikácie na základe role je, keď aplikácia uplatňuje rôzne úrovne označenia na základe toho, či je používateľ zamestnanec alebo návštevník (t. J. Zamestnanecká zľava). J2EE poskytuje API tzv programová bezpečnosť na vykonanie autorizácie na základe rolí (ďalšie informácie nájdete v špecifikácii servletu 2.3, kapitola 12, časť 3).

Segmentová autorizácia je autorizácia založená na iných atribútoch používateľa, ako sú vek alebo záľuby. Segmentová autorizácia sa nazýva taká, pretože zoskupuje používateľov do segmentov na základe konkrétnych atribútov. J2EE nemá žiadny spôsob implementácie segmentovej autorizácie. Príkladom autorizácie založenej na segmentoch je, či je tlačidlo na formulári viditeľné pre používateľov starších ako 40 rokov. Niektorí dodávatelia môžu ponúkať tento typ autorizácie, čo by však vo všetkých prípadoch zaručilo uzamknutie dodávateľa.

Registrácia

Registrácia je proces pridania nového používateľa do aplikácie. Používatelia aplikácií môžu byť schopní sami si vytvoriť nové účty alebo sa aplikácia môže rozhodnúť obmedziť túto činnosť na správcov aplikácií. Špecifikácia J2EE nemá API alebo konfiguráciu, ktorá umožňuje aplikáciám pridávať nových používateľov; preto je tento typ zabezpečenia vždy zostavený na mieru. J2EE chýba schopnosť povedať kontajneru, že nový užívateľ sa zaregistroval, a že jej informácie musia byť počas jej relácie trvalé a udržiavané.

Údržba

Údržba účtu je proces zmeny informácií o účte, ako sú kontaktné informácie, prihlasovacie údaje alebo heslá. Väčšina aplikácií umožňuje používateľom aplikácií aj správcom vykonávať údržbu. V špecifikácii J2EE tiež chýba API alebo konfigurácia pre údržbu účtu. Chýba mechanizmus na informovanie kontajnera, že sa zmenili informácie o používateľovi.

Vymazanie

Vymazanie účtu je zvyčajne obmedzené iba na administratívnych používateľov. V zriedkavých prípadoch môžu niektoré aplikácie umožniť používateľom vymazať svoje vlastné účty. Väčšina aplikácií v skutočnosti nikdy neodstraňuje používateľov; jednoducho deaktivujú účet, aby sa používateľ už nemohol prihlásiť. Robiť rýchle a rýchle mazanie sa zvyčajne zamračuje, pretože v prípade potreby je oveľa ťažšie vzkriesiť údaje o účte. J2EE neposkytuje žiadny spôsob odstránenia alebo deaktivácie používateľov z aplikácií. Chýba mu mechanizmus na informovanie kontajnera o tom, že konkrétny používateľ bol inaktivovaný alebo odstránený. J2EE tiež chýba mechanizmus na okamžité odhlásenie používateľa z aplikácie, keď bol jej účet odstránený.

Čo je to autentifikácia kontajnera?

Autentifikácia kontajnera je proces informovania kontajnera o totožnosti používateľa, ktorý podáva aktuálnu požiadavku. Pre väčšinu kontajnerov tento proces zahŕňa priradenie prúdu ServletRequest objekt, aktuálne vlákno spustenia a interná relácia s totožnosťou používateľa. Priradením relácie k identite môže kontajner zaručiť, že aktuálna požiadavka a všetky nasledujúce požiadavky toho istého používateľa môžu byť priradené k tej istej relácii, kým nevyprší platnosť relácie tohto používateľa. Tento objekt relácie nie je zvyčajne rovnaký ako objekt HttpSession prvý sa používa na vytvorenie a údržbu druhého objektu. Každá ďalšia požiadavka toho istého používateľa je spojená s reláciou pomocou prepisovania URL alebo pomocou súboru cookie relácie, podľa špecifikácie servletu 2.3, kapitola 7.

Ako už bolo spomenuté vyššie v našej diskusii o autorizácii, všetky akcie, ktoré kontajner vykoná, ako aj všetky akcie, ktoré JRE vykoná v mene tohto používateľa, sú starostlivo skontrolované, aby sa zabezpečilo, že používateľ má povolenie na vykonanie akcie. Ak chcete zopakovať náš predchádzajúci príklad, keď kontajner vykoná servlet v mene používateľa, overí, či používateľ patrí do množiny rolí, ktoré majú oprávnenie na vykonávanie tohto servletu. JRE 1.4 tiež vykonáva tieto kontroly mnohých akcií, vrátane otvorenia súboru alebo soketu. Autentizácia JRE je silný koncept a môže zabezpečiť, že každá požiadavka na kontajner je v podstate bezpečná.

V súčasnosti J2EE poskytuje niekoľko rôznych mechanizmov na implementáciu autentifikácie používateľov. Patria sem autentifikácia na základe formulára, autentifikácia klienta HTTPS a základné autentifikácia HTTP. JAAS je zahrnutý ako požadovaná metóda autentifikácie, ktorú musia kontajnery podporovať. Špecifikácia však nie je striktná v tom, ako by mal kontajner túto funkciu poskytovať; preto každý kontajner poskytuje inú podporu pre JAAS. Samotný JAAS je navyše samostatný rámec autentifikácie a mohol by sa použiť na implementáciu autentifikácie kontajnera bez ohľadu na to, či ho špecifikácia podporuje. Tento pojem vysvetľujem podrobnejšie neskôr.

Každý z mechanizmov autentifikácie poskytuje štandardný spôsob poskytovania informácií o kontajneri o používateľovi. Hovorím o tom ako splnomocnenie. Kontajner stále musí tieto informácie použiť na overenie existencie používateľa a dostatočných povolení na uskutočnenie žiadosti. Hovorím o tom ako autentifikácia poverenia. Niektoré kontajnery poskytujú konfiguráciu na nastavenie autentifikácie poverení a iné poskytujú rozhrania, ktoré je potrebné implementovať.

Metódy autentifikácie J2EE

Pozrime sa stručne na niektoré z najbežnejších metód implementácie a konfigurácie autentifikácie kontajnera.

Overovanie na základe formulára

Autentifikácia na základe formulára umožňuje identifikáciu a autentifikáciu používateľov pomocou aplikačného servera J2EE pomocou ľubovoľného formulára HTML. Akcia formulára musí byť j_security_check a v požiadavke musia byť vždy dva parametre požiadavky HTTP (vstupné polia formulára), jeden volaný j_username a druhý, j_heslo. Pri použití autentifikácie na základe formulára dôjde k splneniu poverenia po odoslaní formulára a zaslaní používateľského mena a hesla na server.

Tu je príklad stránky JSP (JavaServer Pages), ktorá používa autentifikáciu na základe formulára:

 Prihlásenie Zadajte svoje užívateľské meno:

Zadajte svoje heslo:

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