Programiranje

Vse to JAAS

Ste že kdaj morali ustvariti mehanizem za preverjanje pristnosti prijave za aplikacijo? Verjetno je, da imate in verjetno večkrat, pri čemer je vsaka nova izvedba blizu, vendar ne enaka prejšnji. Na primer, ena izvedba lahko uporablja bazo podatkov Oracle, druga lahko uporablja overjanje NT, druga pa imenik LDAP (protokol imenika lahkega dostopa). Ali ne bi bilo lepo podpirati vse te varnostne mehanizme, ne da bi spremenili kodo na ravni aplikacije?

Zdaj v svetu Jave lahko to storite s storitvijo Java Authentication and Authorization Service (JAAS). Ta relativno nov API je bil razširitev v J2SE (Java 2 Platform, Standard Edition) 1.3, je osnovni API v J2SE 1.4 in je tudi del specifikacije J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tem članku vas bomo naučili osnov JAAS in vam pokazali, kako učinkovito uporabiti JAAS v resničnih aplikacijah. Aplikacijo v tem članku smo utemeljili na lastnih izkušnjah z integracijo JAAS v obstoječi sistem, ki temelji na Javi, ki je za shranjevanje uporabniških podatkov uporabljal sistem RDBMS (sistem za upravljanje relacijske baze podatkov). Z JAAS smo oblikovali robustnejše, prilagodljivejše in doslednejše mehanizme za prijavo in preverjanje pristnosti.

Iz spodnjih virov lahko prenesete celoten nabor delovnih primerov (vključno z viri Java, JSP-ji (strani JavaServer), konfiguracijo JAAS s skripti za zbirko podatkov in gradnjo). Te primere smo preizkusili z uporabo strežnika Resin z JDBC (Java Database Connectivity) in bazo podatkov MySQL.

Javna overitev in avtorizacija: velika slika

Pred JAAS-om je bil Java-ov varnostni model večinoma oblikovan kot jezik, neodvisen od platforme za distribuirane, povezane v omrežje aplikacije. V zgodnjih dneh se je Java pogosto pojavljala kot mobilna koda, na primer programčki, ki temeljijo na brskalniku, zato se je začetni varnostni model osredotočil na zaščito uporabnikov na podlagi od kod izvira koda in kdo ga je ustvaril. Zgodnji varnostni mehanizmi Java, kot so SecurityManagerKoncept peskovnika, podpisovanje kode in datoteke pravilnikov so bili namenjeni zaščiti uporabnikov pred sistemom.

Izum JAAS odraža razvoj Jave v programski jezik za splošne namene, ki se uporablja za izvajanje tradicionalnih odjemalskih in strežniških aplikacij, ki zahtevajo prijavo in nadzor dostopa. JAAS ščiti sistem pred uporabniki tako, da dovoli ali zavrne dostop na podlagi kdo ali kaj izvaja program. Čeprav lahko JAAS izvaja preverjanje pristnosti in avtorizacijo, se v tem članku osredotočamo predvsem na preverjanje pristnosti.

JAAS vam lahko poenostavi razvoj varnosti Java, tako da postavi abstrakcijski sloj med vašo aplikacijo in različnimi osnovnimi mehanizmi za preverjanje pristnosti in avtorizacije. Ta neodvisnost od platform in algoritmov vam omogoča uporabo različnih varnostnih mehanizmov brez spreminjanja kode na ravni aplikacije. Tako kot pri večini Java-ovih varnostnih API-jev tudi JAAS to neodvisnost od izvedbe doseže z razširljivim okvirom vtičnih vmesnikov ponudnikov storitev (SPI): nizom abstraktnih razredov in vmesnikov, za katere so razvite posebne izvedbe.

Slika 1 spodaj daje pregled na visoki ravni, kako JAAS dosega to priključitev. Vaša koda na ravni aplikacije se ukvarja predvsem z LoginContext. Pod tem LoginContext je nabor enega ali več dinamično konfiguriranih LoginModules, ki obdelujejo dejansko preverjanje pristnosti z uporabo ustrezne varnostne infrastrukture.

JAAS ponuja nekaj referenc LoginModule izvedbe, kot je JndiLoginModule; lahko razvijete tudi svojega, kot bomo tukaj storili z RdbmsLoginModule. Pokazali bomo tudi, kako lahko s preprosto konfiguracijsko datoteko hitro nastavite aplikacijo z različnimi izvedbami.

JAAS je poleg tega, da ga je mogoče vstaviti, mogoče zložiti: v okviru ene prijave se lahko niz varnostnih modulov zloži drug na drugega, od katerih je vsak poklican v vrstnem redu in vsak medsebojno deluje z različno varnostno infrastrukturo.

Vidiki JAAS so zasnovani na nekaterih znanih varnostnih arhitekturnih vzorcih in obstoječih okvirih. Funkcija, ki jo je mogoče zložiti, na primer namerno spominja na okvir Unix Pluggable Authentication Module (PAM). S transakcijskega vidika JAAS sprejme vedenja, podobna dvofaznim protokolom odobritve (2PC). JAAS-ovi koncepti varnostne konfiguracije, vključno z Politika datotek in Dovoljenja, prihajajo iz varnostnih paketov J2SE 1.2. JAAS si izposoja ideje tudi iz drugih uveljavljenih varnostnih okvirov, kot so potrdila X.509, iz katerih izhaja ime Predmet je izpeljana (izvedeli boste več o Predmet kasneje).

Opomba: JAAS je le eden od številnih novih varnostnih API-jev Java. Če želite več informacij o varnosti Java, glejte stransko vrstico "Java Security Puzzle" in vire spodaj.

Na strani odjemalca in strežnika JAAS

JAAS lahko uporabite na odjemalcu in strežniku. Kot bomo kmalu pokazali, je uporaba na strani odjemalca preprosta. Na strani strežnika so stvari nekoliko bolj zapletene. Trenutno je JAAS na trgu strežnikov aplikacij nekoliko nedosleden; Strežniki aplikacij J2EE uporabljajo JAAS nekoliko drugače, odvisno od tega, katerega uporabljate. Na primer, JBossSX z lastno arhitekturo lepo vključi JAAS v svoj splošni varnostni okvir (ki je podrobno opisan v odličnem Scott Starku JavaWorld članek "Integriranje varnostnih infrastruktur z JBossSX" (avgust 2001)). Čeprav WebLogic 6.x podpira JAAS, se podrobnosti razlikujejo.

Tako lahko JAAS razumete tako z vidika strežnika kot odjemalca, primere obeh bomo prikazali v tem članku. Za poenostavitev strežnika bomo uporabili aplikacijski strežnik Resin, da bomo lahko začeli s čistejšim skrilavcem (Resin sicer ima lastno vtično shemo za preverjanje pristnosti, vendar je nestandardna, zato nam uporaba JAAS zagotavlja večjo prenosljivost kasneje).

Jedro JAAS

Če želite začeti uporabljati JAAS, morate najprej zagotoviti, da je nameščen. J2SE 1.4 že vključuje JAAS; J2SE 1.3 ne. Če želite še naprej uporabljati J2SE 1.3, prenesite JAAS iz Sun Microsystems. Ko prenesete in namestite JAAS v dani imenik, se prikaže podimenik z imenom lib, ki vsebuje eno datoteko z imenom jaas.jar. To datoteko boste morali dodati na pot učil ali jo kopirati v imenik razširitev JRE (Java Runtime Environment) (v \ lib \ ext, kje je lokacija vašega JRE). Nato ste pripravljeni na JAAS. Opomba: Če uporabljate strežnik aplikacij, morda že vključuje JAAS. Za podrobnosti poglejte v dokumentacijo strežnika.

Pri katerem koli od teh pristopov upoštevajte, da lahko v datoteki z zaščitnimi lastnostmi Java spremenite nekatere nastavitve sistemskih lastnosti, povezane z JAAS (in številne druge varnostne nastavitve Java). Ta datoteka, java.security, se nahaja v / lib / varnost imenika in napisana v standardni obliki datoteke z lastnostmi Java.

Uporaba overjanja JAAS iz vaše aplikacije običajno vključuje naslednje korake:

  1. Ustvariti LoginContext
  2. Neobvezno podajte a CallbackHandler do LoginContext, za zbiranje ali obdelavo avtentikacijskih podatkov
  3. Izvedite preverjanje pristnosti tako, da pokličete LoginContextje Vpiši se() metoda
  4. Izvedite privilegirana dejanja z uporabo vrnjenega Predmet (ob predpostavki, da je prijava uspela)

Tu je minimalni primer:

 LoginContext lc = novo LoginContext ("MyExample"); poskusite {lc.login (); } catch (LoginException) {// Preverjanje pristnosti ni uspelo. } // Preverjanje pristnosti je uspešno, zdaj lahko nadaljujemo. // Vrnjeno Zadevo lahko uporabimo, če želimo. Subject sub = lc.getSubject (); Subject.doAs (pod, novo MyPrivilegedAction ()); 

Pod platnicami se zgodi še nekaj stvari:

  1. Med inicializacijo se LoginContext najde vnos konfiguracije "MojPrimer" v konfiguracijski datoteki JAAS (ki ste jo konfigurirali), da določite katero LoginModules za nalaganje (glej sliko 2)
  2. Med prijavo je LoginContext pokliče vsak LoginModuleje Vpiši se() metoda
  3. Vsak Vpiši se() metoda izvede preverjanje pristnosti ali vpiše a CallbackHandler
  4. The CallbackHandler uporablja enega ali več Poklicati nazajs za interakcijo z uporabnikom in zbiranje vhodnih podatkov
  5. Novo Predmet primerek je zapolnjen s podrobnostmi preverjanja pristnosti, kot je Ravnateljs in poverilnice

Spodaj bomo razložili nadaljnje podrobnosti, za začetek pa si oglejmo ključne razrede in vmesnike JAAS, vključene v postopek. Ti so običajno razdeljeni v naslednje tri skupine:

Tabela 1. Razredi in vmesniki JAAS

ObičajniPredmet, Ravnatelj, poverilnica (poverilnica ni noben določen razred, lahko pa je kateri koli predmet)
Preverjanje pristnostiLoginContext, LoginModule, CallbackHandler, Poklicati nazaj
PooblastiloPolitika, AuthPermission, PrivateCredentialPermission

Večina teh razredov in vmesnikov je v javax.security.auth paketov, z nekaterimi vnaprej vgrajenimi izvedbami v com.sun.security.auth paket, vključen samo v J2SE 1.4.

Opomba: Ker se v tem članku osredotočamo na preverjanje pristnosti, se ne poglabljamo v avtorizacijske razrede.

Pogosti: predmeti, ravnatelji in poverilnice

The Predmet razred predstavlja overjeno entiteto: končnega uporabnika ali skrbnika ali spletno storitev, napravo ali drug postopek. Razred vsebuje tri sklope vrst varnostnih informacij:

  • Identitete: V obliki enega ali več Ravnateljs
  • Javna pooblastila: Kot so ime ali javni ključi
  • Zasebne poverilnice: Tako kot gesla ali zasebni ključi

Ravnateljs predstavljajo Predmet identitete. Izvajajo java.security.Principal vmesnik (ki je pred JAAS) in java.io.Serializable. A Predmetje najpomembnejša metoda getName (), ki vrne ime niza identitete. Ker a Predmet Primer vsebuje matriko Ravnateljs, lahko ima torej več imen. Ker lahko številka socialnega zavarovanja, ID za prijavo, e-poštni naslov itd. Predstavljajo enega uporabnika, se več identitet v resničnem svetu izkaže za pogosto.

Zadnji element tukaj, poverilnica, ni razred ali vmesnik, lahko pa je kateri koli predmet. Poverilnice lahko vključujejo kakršen koli artefakt za preverjanje pristnosti, kot je vstopnica, ključ ali geslo, ki bi ga morda potrebovali določeni varnostni sistemi. The Predmet razred ohranja edinstveno Nastavitezasebnih in javnih poverilnic, ki jih je mogoče pridobiti z metodami, kot so getPrivateCredentials () in getPublicCrendentials (). Te metode pogosteje uporabljajo varnostni podsistemi kot na aplikacijski ravni.

Preverjanje pristnosti: LoginContext

Vaša aplikacijska plast uporablja LoginContext kot primarni razred za overjanje Predmets. LoginContext predstavlja tudi, kje pride v poštev JAAS-ova dinamična vtičnost, kajti ko sestavite a LoginContext, določite imenovano konfiguracijo za nalaganje. The LoginContext ponavadi naloži podatke o konfiguraciji iz besedilne datoteke, ki nato sporoči LoginContext ki LoginModules za uporabo med prijavo.

Tri najpogosteje uporabljene metode v LoginContext so:

Tabela 2. Metode LoginContext

Vpiši se()Izvede prijavo, razmeroma zapleten korak, ki prikliče vse LoginModules, določeni za to konfiguracijo. Če uspe, ustvari overjeno Predmet. Če ne uspe, vrže a LoginException.
getSubject ()Vrne overjeno Predmet.
Odjava()Odjavi preverjeno pristnost Predmet in ga odstrani Ravnateljs in poverilnice.

Kako uporabljati te metode bomo pokazali kasneje.

Preverjanje pristnosti: LoginModule

LoginModule je vmesnik za določene avtentikacijske mehanizme. J2SE 1.4 je dobavljen z nizom pripravljenih za uporabo LoginModules, vključno z:

Tabela 3. Moduli za prijavo v J2SE 1.4

JndiLoginModulePreveri v imeniški storitvi, konfigurirani pod JNDI (Java Iaming and Directory Interface)
Krb5LoginModulePreverjanje pristnosti s pomočjo protokolov Kerberos
NTLoginModuleZa preverjanje pristnosti uporablja trenutne uporabnikove varnostne informacije NT
UnixLoginModuleZa preverjanje pristnosti uporablja trenutne uporabniške varnostne informacije Unix

Skupaj s temi moduli je na voljo tudi ustrezen beton Ravnatelj izvedbe v com.sun.security.auth paket, kot je NTDomenaGlavno in UnixPrincipal.

The LoginModule vmesnik ima pet načinov:

Tabela 4. Metode LoginModule

inicializiraj ()Klicano po LoginModule je zgrajena.
Vpiši se()Opravi overjanje.
zaveži ()Poklical LoginContext potem ko je sprejel rezultate od vseh LoginModuleza to aplikacijo. Dodelimo Ravnateljin poverilnice za Predmet tukaj.
prekini ()Klican, kadar koli LoginModule saj ta aplikacija ne uspe (čeprav so prejšnje zaporedoma morda uspele - torej podobno kot model 2PC). Ne Ravnateljali poverilnice so dodeljene Predmet.
Odjava()Odstrani Ravnateljin poverilnice, povezane z Predmet.

Programska plast nobene od teh metod ne pokliče neposredno - LoginContext jih po potrebi prikliče. Naš spodnji primer bo podrobneje opisal izvedbe teh metod.

Preverjanje pristnosti: Povratni klici in povratni klici

CallbackHandlers in Poklicati nazajs pusti a LoginModule od uporabnika ali sistema zbrati potrebne podatke za preverjanje pristnosti, pri tem pa ostati neodvisen od dejanskega mehanizma interakcije. To sposobnost bomo izkoristili pri svojem oblikovanju - našem RdbmsLoginModule ni odvisno od tega, kako so uporabniške poverilnice (uporabniško ime / geslo) pridobljene in jih je zato mogoče uporabiti v različnih okoljih aplikacij, ki jih bomo prikazali (bodisi iz ukazne vrstice bodisi iz JSP).

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