Programavimas

Visa tai JAAS

Ar kada nors reikėjo sukurti programos prisijungimo autentifikavimo mechanizmą? Tikimybė yra, kad jūs tikriausiai turite daugiau nei vieną kartą, kai kiekvienas naujas diegimas yra artimas, bet ne identiškas ankstesniam. Pavyzdžiui, vienas diegimas gali naudoti „Oracle“ duomenų bazę, kitas gali naudoti NT autentifikavimą, o kitas - LDAP (lengvos prieigos katalogo protokolas) katalogą. Ar nebūtų malonu palaikyti visus šiuos saugos mechanizmus, nekeičiant jokio programos lygio kodo?

Dabar „Java“ pasaulyje galite tai padaryti naudodami „Java“ autentifikavimo ir autorizavimo tarnybą (JAAS). Ši palyginti nauja API buvo J2SE („Java 2 Platform“, „Standard Edition“) 1.3 plėtinys, yra pagrindinė „J2SE 1.4“ API ir taip pat yra „J2EE“ („Java 2 Platform, Enterprise Edition“) 1.3 specifikacijos dalis. Šiame straipsnyje mes išmokysime JAAS pagrindų ir parodysime, kaip efektyviai pritaikyti JAAS realaus pasaulio programose. Šio straipsnio taikymą grindėme savo patirtimi integruojant JAAS į esamą „Java“ žiniatinklio sistemą, kuri naudotojo prisijungimo informacijai saugoti naudojo RDBMS (reliacinių duomenų bazių valdymo sistemą). Su JAAS sukūrėme patikimesnius, lanksčius ir nuoseklius prisijungimo ir autentifikavimo mechanizmus.

Iš toliau pateiktų šaltinių galite atsisiųsti visą darbo pavyzdžių rinkinį (įskaitant „Java“ šaltinius, JSP („JavaServer Pages“), JAAS konfigūraciją, su duomenų bazėmis ir sukūrimo scenarijais). Šiuos pavyzdžius išbandėme naudodami „Resin“ serverį su JDBC („Java Database Connectivity“) ir „MySQL“ duomenų bazę.

„Java“ autentifikavimas ir autorizavimas: bendras vaizdas

Iki JAAS „Java“ saugos modelį daugiausia formavo jo kilmė kaip nuo platformos nepriklausoma kalba paskirstytoms, tinklų programoms. Pirmosiomis dienomis „Java“ dažnai atrodė kaip mobilusis kodas, pvz., Naršyklės programėlės, todėl pradiniame saugos modelyje daugiausia dėmesio buvo skirta vartotojų apsaugai, remiantis kur atsirado kodas ir kas ją sukūrė. Ankstyvieji „Java“ saugumo mechanizmai, pvz „SecurityManager“s, smėlio dėžės koncepcija, kodo pasirašymas ir politikos failai buvo skirti apsaugoti vartotojus nuo sistemos.

JAAS išradimas atspindi „Java“ raidą į bendros paskirties programavimo kalbą, naudojamą įgyvendinant tradicines kliento ir serverio programas, kurioms reikalingas prisijungimas ir prieigos kontrolė. JAAS apsaugo sistemą nuo vartotojų, leisdamas arba neleisdamas prieigos pagal kas ar kas vykdo programą. Nors JAAS gali atlikti ir autentifikavimą, ir autorizaciją, šiame straipsnyje daugiausia dėmesio skiriame autentifikavimui.

JAAS gali supaprastinti jūsų „Java“ saugos kūrimą įdėdamas abstrakcijos sluoksnį tarp jūsų programos ir skirtingų pagrindinių autentifikavimo ir įgaliojimo mechanizmų. Ši nepriklausomybė nuo platformų ir algoritmų leidžia naudoti skirtingus saugos mechanizmus, nekeičiant programos lygio kodo. Kaip ir daugumoje „Java“ saugos API, JAAS pasiekia šį nepriklausomumą nuo įgyvendinimo, naudodamas išplėstinę papildomų paslaugų teikėjų sąsajų (SPI) sistemą: abstrakčių klasių ir sąsajų rinkinį, kuriam kuriamos konkrečios įgyvendinimo priemonės.

1 paveiksle pateikiama aukšto lygio apžvalga, kaip JAAS pasiekia šį papildymą. Jūsų programos sluoksnio kodas pirmiausia susijęs su a „LoginContext“. Po tuo „LoginContext“ yra vieno ar daugiau dinamiškai sukonfigūruotų rinkinys „LoginModule“s, kurie tvarko faktinį autentifikavimą naudodamiesi atitinkama saugumo infrastruktūra.

JAAS pateikia tam tikrą nuorodą „LoginModule“ diegimai, tokie kaip JndiLoginModule; taip pat galite sukurti savo, kaip mes darysime čia su „RdbmsLoginModule“. Mes taip pat parodysime, kaip galite greitai nustatyti programą naudodami paprastą konfigūracijos failą, pasirinkdami įvairius diegimus.

Be to, kad jis yra prijungiamas, JAAS yra sukraunamas: vieno prisijungimo kontekste vienas ant kito gali kauptis saugos modulių rinkinys, kiekvienas vadinamas tvarkingai ir kiekvienas sąveikauja su skirtinga saugos infrastruktūra.

JAAS aspektai modeliuojami pagal kai kuriuos pažįstamus saugumo architektūros modelius ir esamas sistemas. Pavyzdžiui, sukraunama funkcija sąmoningai primena „Unix Pluggable Authentication Module“ (PAM) sistemą. Sandorių požiūriu JAAS priima elgseną, panašią į dviejų fazių įsipareigojimų (2PC) protokolus. JAAS saugumo konfigūracijos koncepcijos, įskaitant Politika bylos ir Leidimai, yra iš J2SE 1.2 saugos paketų. JAAS taip pat skolinasi idėjas iš kitų nusistovėjusių saugumo sistemų, pvz., X.509 sertifikatų, iš kurių gautas pavadinimas Tema yra išvestas (sužinosite daugiau apie Tema vėliau).

Pastaba: JAAS yra tik viena iš kelių naujų „Java“ saugos API. Norėdami sužinoti daugiau apie „Java“ saugumą, žiūrėkite žemiau esančioje šoninėje juostoje „Java saugos galvosūkis“ ir šaltiniuose.

Kliento ir serverio pusės JAAS

JAAS galite taikyti tiek kliente, tiek serveryje. Kaip netrukus parodysime, naudoti jį kliento pusėje yra nesudėtinga. Serverio pusėje viskas tampa šiek tiek sudėtingiau. Šiuo metu JAAS programų serverių rinkoje yra šiek tiek nenuoseklus; J2EE programų serveriai naudoja JAAS šiek tiek kitaip, priklausomai nuo to, kurį naudojate. Pavyzdžiui, „JBossSX“, naudodamas savo architektūrą, puikiai integruoja JAAS į savo bendrą saugumo sistemą (tai išsamiai aprašyta puikiame Scotto Starko puslapyje). „JavaWorld“ straipsnis „Integruoti saugos infrastruktūras su„ JBossSX “(2001 m. rugpjūtis)). Nors „WebLogic 6.x“ palaiko JAAS, išsami informacija skiriasi.

Taigi jūs galite suprasti JAAS tiek iš serverio, tiek iš kliento pusės, mes parodysime abiejų pavyzdžius šiame straipsnyje. Kad būtų paprasčiau serveryje, naudosime „Resin“ programų serverį, kad galėtume pradėti nuo švaresnio skalūno („Resin“ turi savo prijungiamą autentifikavimo schemą, tačiau ji yra nestandartinė, todėl JAAS suteikia mums daugiau perkeliamumo vėliau).

Pagrindinė JAAS

Norėdami pradėti naudoti JAAS, pirmiausia turite įsitikinti, kad jis įdiegtas. J2SE 1.4 jau apima JAAS; J2SE 1.3 nėra. Jei norite toliau naudoti J2SE 1.3, atsisiųskite JAAS iš „Sun Microsystems“. Atsisiuntę ir įdiegę JAAS į tam tikrą katalogą, pamatysite pakatalogį, vadinamą lib, kuriame yra vienas failas pavadinimu jaas.jar. Šį failą turėsite pridėti prie savo klasės kelio arba nukopijuoti į JRE („Java Runtime Environment“) plėtinių katalogą ( \ lib \ ext, kur yra jūsų JRE vieta). Tada esate pasirengęs JAAS. Pastaba: Jei naudojate programų serverį, jame jau gali būti JAAS. Išsamesnės informacijos ieškokite savo serverio dokumentacijoje.

Naudodami bet kurį iš šių būdų, atkreipkite dėmesį, kad kai kuriuos su JAAS susijusius sistemos ypatybių parametrus (taip pat daugelį kitų „Java“ saugos parametrų) galite pakeisti „Java“ saugos ypatybių faile. Šis failas java.saugumasyra įsikūręs / lib / security katalogas ir parašytas standartiniu „Java“ ypatybių failo formatu.

JAAS autentifikavimo naudojimas iš jūsų programos paprastai apima šiuos veiksmus:

  1. Sukurti „LoginContext“
  2. Pasirinktinai išlaikykite a Skambinimo vadovas į „LoginContext“, autentifikavimo duomenims rinkti ar apdoroti
  3. Atlikite autentifikavimą paskambinę „LoginContext“'s Prisijungti() metodas
  4. Atlikite privilegijuotus veiksmus naudodami grąžintus Tema (darant prielaidą, kad prisijungti pavyks)

Pateikiame minimalų pavyzdį:

 LoginContext lc = naujas LoginContext („Mano pavyzdys“); pabandykite {lc.login (); } catch (LoginException) {// Nepavyko autentifikuoti. } // Autentifikavimas sėkmingas, dabar galime tęsti. // Mes galime naudoti grąžintą Temą, jei norime. Subject sub = lc.getSubject (); Subject.doAs (sub, new MyPrivilegedAction ()); 

Po viršeliais atsiranda keletas kitų dalykų:

  1. Inicializavimo metu „LoginContext“ suranda konfigūracijos įrašą „Mano pavyzdys“ JAAS konfigūracijos faile (kurį sukonfigūravote), kad nustatytumėte „LoginModule“s pakrauti (žr. 2 paveikslą)
  2. Prisijungimo metu „LoginContext“ skambina kiekvienam „LoginModule“'s Prisijungti() metodas
  3. Kiekvienas Prisijungti() metodas atlieka autentifikavimą arba pateikia a Skambinimo vadovas
  4. Skambinimo vadovas naudoja vieną ar daugiau Perskambinks bendrauti su vartotoju ir rinkti informaciją
  5. Naujas Tema egzempliorius yra užpildytas autentifikavimo informacija, tokia kaip Direktoriuss ir įgaliojimai

Toliau paaiškinsime išsamią informaciją, tačiau pirmiausia pažvelkime į pagrindines JAAS klases ir sąsajas, susijusias su procesu. Paprastai jie skirstomi į šias tris grupes:

1 lentelė. JAAS klasės ir sąsajos

DažnasTema, Direktorius, kredencialai (kredencialai nėra jokia konkreti klasė, bet gali būti bet koks objektas)
Autentifikavimas„LoginContext“, „LoginModule“, Skambinimo vadovas, Perskambink
LeidimasPolitika, AuthPermission, „PrivateCredentialPermission“

Dauguma šių klasių ir sąsajų yra javax.security.auth paketo paketai, su tam tikrais iš anksto įdiegtais diegimais com.sun.security.auth paketas, įtrauktas tik į J2SE 1.4.

Pastaba: Kadangi šiame straipsnyje daugiausia dėmesio skiriame autentifikavimui, nesigiliname į autorizacijos klases.

Dažnai: dalykai, vadovai ir įgaliojimai

Tema klasė reiškia patvirtintą subjektą: galutinį vartotoją ar administratorių, arba žiniatinklio paslaugą, įrenginį ar kitą procesą. Klasėje yra trys saugos informacijos tipų rinkiniai:

  • Tapatybės: Vieno ar kelių pavidalu Direktoriuss
  • Viešieji įgaliojimai: Tokie kaip vardas arba viešieji raktai
  • Asmeniniai įgaliojimai: Kaip slaptažodžiai ar privatūs raktai

Direktoriuss atstovauja Tema tapatybės. Jie įgyvendina java.security.Principal sąsaja (kuri buvo ankstesnė už JAAS) ir java.io.Serializuojama. A TemaSvarbiausias metodas yra getName (), kuris grąžina tapatybės eilutės pavadinimą. Kadangi a Tema egzemplioriuje yra masyvas DirektoriusTaigi jis gali turėti kelis vardus. Kadangi socialinio draudimo numeris, prisijungimo ID, el. Pašto adresas ir t. T. Visi gali atstovauti vienam vartotojui, kelios tapatybės yra įprastos realiame pasaulyje.

Paskutinis elementas čia - kredencialas - nėra klasė ar sąsaja, bet gali būti bet koks objektas. Kvalifikacijos duomenys gali apimti bet kokį autentifikavimo artefaktą, pvz., Bilietą, raktą ar slaptažodį, kurių gali prireikti konkrečioms apsaugos sistemoms. Tema klasė išlaiko nepakartojamą Nustatytiprivačių ir viešų įgaliojimų, kuriuos galima gauti naudojant tokius metodus kaip getPrivateCredentials () ir getPublicCrendentials (). Šiuos metodus dažniau naudoja saugos posistemiai, o ne programų sluoksnyje.

Autentifikavimas: „LoginContext“

Jūsų programos sluoksnis naudoja „LoginContext“ kaip pagrindinė autentifikavimo klasė Temas. „LoginContext“ taip pat atspindi JAAS dinaminį prijungimą, nes kai sukonstruojate a „LoginContext“, nurodote įvesti konfigūraciją, kurią norite įkelti. „LoginContext“ paprastai konfigūracijos informaciją įkelia iš teksto failo, kuris savo ruožtu nurodo „LoginContext“ kuri „LoginModule“s naudoti prisijungimo metu.

Trys dažniausiai naudojami metodai „LoginContext“ yra:

2 lentelė. „LoginContext“ metodai

Prisijungti()Atlieka prisijungimą, palyginti sudėtingą veiksmą, kuris iškviečia visus „LoginModule“s, nurodyti šiai konfigūracijai. Jei tai pavyksta, sukuriama tapatybė Tema. Jei nepavyksta, meta a „LoginException“.
„getSubject“ ()Grąžina patvirtintą Tema.
Atsijungti()Atsijungia nuo patvirtinto Tema ir pašalina jo Direktoriuss ir įgaliojimai.

Vėliau parodysime, kaip naudoti šiuos metodus.

Autentifikavimas: „LoginModule“

„LoginModule“ yra sąsaja su konkrečiais autentifikavimo mechanizmais. J2SE 1.4 pristatomas su paruoštu naudoti rinkiniu Prisijungimo moduliai, įskaitant:

3 lentelė. „J2SE“ prisijungimo moduliai 1.4

JndiLoginModuleTikrinama pagal katalogo paslaugą, sukonfigūruotą pagal JNDI („Java“ pavadinimų ir katalogų sąsaja)
Krb5LoginModuleAutentifikuojasi naudodamas „Kerberos“ protokolus
NTLoginModuleAutentifikavimui naudoja dabartinio vartotojo NT saugos informaciją
„UnixLoginModule“Autentifikavimui naudoja dabartinio vartotojo „Unix“ saugos informaciją

Kartu su šiais moduliais yra atitinkamo betono rinkinys Direktorius įgyvendinimai com.sun.security.auth paketą, pvz NTDomenasPagrindinis ir „Unix“ pagrindinis.

„LoginModule“ sąsajoje yra penki metodai:

4 lentelė. „LoginModule“ metodai

inicijuoti ()Paskambinta po „LoginModule“ yra sukonstruotas.
Prisijungti()Atlieka autentifikavimą.
įsipareigoti ()Paskambino „LoginContext“ visiems priėmus rezultatus „LoginModule“apibrėžta šiai programai. Mes paskiriame Direktoriuss ir įgaliojimai Tema čia.
nutraukti ()Skambina, kai yra „LoginModule“ šiai programai nepavyksta (nors ankstesnės iš eilės galėjo pavykti, taigi panašios į 2PC modelį). Ne Direktoriuss arba įgaliojimai priskiriami Tema.
Atsijungti()Pašalina Direktoriuss ir įgaliojimai, susiję su Tema.

Programos lygmuo tiesiogiai nevadina nė vieno iš šių metodų „LoginContext“ kaip reikiant juos kviečia. Žemiau pateiktame pavyzdyje bus išsamiau aprašyta šių metodų įgyvendinimas.

Autentifikavimas: CallbackHandlers ir Callback

Skambinimo vadovassmėlis Perskambinks tegul a „LoginModule“ rinkti reikalingą autentifikavimo informaciją iš vartotojo ar sistemos, likdami nepriklausomi nuo faktinio sąveikos mechanizmo. Mes pasinaudosime ta galimybe kurdami savo dizainą „RdbmsLoginModule“ nepriklauso nuo to, kaip gaunami vartotojo kredencialai (vartotojo vardas / slaptažodis), todėl juos galima naudoti skirtingose ​​programų aplinkose, kurias iliustruosime (arba iš komandinės eilutės, arba iš JSP).