Sav taj JAAS

Jeste li ikad trebali stvoriti mehanizam za provjeru autentičnosti prijave za aplikaciju? Šanse su, imate i vjerojatno više puta, pri čemu je svaka nova implementacija bliska, ali ne i identična prethodnoj. Na primjer, jedna implementacija može koristiti Oracle bazu podataka, druga može koristiti NT provjeru autentičnosti, a druga LDAP (lagani protokol direktorija pristupa) direktorij. Ne bi li bilo lijepo podržati sve ove sigurnosne mehanizme bez promjene bilo kojeg koda na razini aplikacije?

Sada u svijetu Jave možete s Java uslugom provjere autentičnosti i autorizacije (JAAS). Ovaj relativno novi API bio je proširenje u J2SE (Java 2 Platform, Standard Edition) 1.3, osnovni je API u J2SE 1.4, a također je dio J2EE (Java 2 Platform, Enterprise Edition) 1.3 specifikacije. U ovom ćemo vas članku naučiti osnove JAAS-a i pokazati vam kako učinkovito primijeniti JAAS na stvarne programe. Aplikaciju ovog članka temeljili smo na vlastitim iskustvima integriranja JAAS-a u postojeći sustav zasnovan na Javi, koji je koristio RDBMS (relacijski sustav upravljanja bazom podataka) za pohranu podataka o prijavi korisnika. S JAAS-om smo osmislili robusnije, fleksibilnije i dosljednije mehanizme za prijavu i provjeru autentičnosti.

Kompletan niz radnih primjera možete preuzeti iz donjih Resursa (uključuje Java izvore, JSP-ove (JavaServer stranice), JAAS konfiguraciju, sa skriptama baze podataka i gradnje). Isprobali smo ove primjere koristeći Resin poslužitelj s JDBC (Java Database Connectivity) i MySQL bazu podataka.

Java provjera autentičnosti i autorizacija: velika slika

Prije JAAS-a, Java-ov sigurnosni model uglavnom je oblikovao njegovo podrijetlo kao jezik neovisan o platformi za distribuirane, umrežene programe. U svojim ranim danima Java se često pojavljivala kao mobilni kôd, kao što su apleti temeljeni na pregledniku, pa se stoga početni sigurnosni model usredotočio na zaštitu korisnika na temelju toga gdje kôd potječe i tko ga je stvorio. Rani Java sigurnosni mehanizmi kao što su SecurityManagers, koncept pješčanika, potpisivanje koda i datoteke politika trebali su zaštititi korisnike od sustava.

Izum JAAS odražava razvoj Jave u programski jezik opće namjene, koji se koristi za implementaciju tradicionalnih klijentskih i poslužiteljskih aplikacija koje zahtijevaju prijavu i kontrolu pristupa. JAAS štiti sustav od korisnika dopuštanjem ili odbijanjem pristupa na temelju toga tko ili što pokreće program. Iako JAAS može izvoditi i provjeru autentičnosti i autorizaciju, u ovom smo članku prvenstveno usredotočeni na provjeru autentičnosti.

JAAS može pojednostaviti razvoj vaše Java sigurnosti stavljanjem sloja apstrakcije između vaše aplikacije i različitih osnovnih mehanizama za provjeru autentičnosti i autorizacije. Ova neovisnost od platformi i algoritama omogućuje vam upotrebu različitih sigurnosnih mehanizama bez mijenjanja koda na razini aplikacije. Kao i kod većine Java sigurnosnih API-ja, JAAS postiže ovu neovisnost o implementaciji putem proširivog okvira priključnih sučelja davatelja usluga (SPI): skupa apstraktnih klasa i sučelja za koje se razvijaju specifične implementacije.

Slika 1 u nastavku daje pregled na visokoj razini o tome kako JAAS postiže ovu mogućnost povezivanja. Vaš kod aplikacijskog sloja prvenstveno se bavi a LoginContext. Ispod toga LoginContextje skup jednog ili više dinamički konfiguriranih LoginModules, koji obrađuju stvarnu provjeru autentičnosti pomoću odgovarajuće sigurnosne infrastrukture.

JAAS pruža neke referentne LoginModuleimplementacije, poput JndiLoginModule; možete razviti i vlastiti, kao što ćemo ovdje učiniti s RdbmsLoginModule. Pokazat ćemo i kako možete brzo postaviti aplikaciju s izborom implementacija pomoću jednostavne konfiguracijske datoteke.

Osim što ga je moguće priključiti, JAAS se može složiti: u kontekstu jedne prijave, skup sigurnosnih modula može se slagati jedan na drugi, svaki pozvan po redu i svaki interaktivno s drugom sigurnosnom infrastrukturom.

JAAS aspekti modelirani su na temelju nekih poznatih sigurnosnih arhitektonskih obrazaca i postojećih okvira. Na primjer, značajka koja se može slagati namjerno podsjeća na okvir Unix Pluggable Authentication Module (PAM). S gledišta transakcija, JAAS prihvaća ponašanja slična protokolima dvofaznog predavanja (2PC). JAAS-ovi koncepti sigurnosne konfiguracije, uključujući Policydatoteke i Permissions, dolaze iz sigurnosnih paketa J2SE 1.2. JAAS također posuđuje ideje iz drugih uspostavljenih sigurnosnih okvira, poput X.509 certifikata, iz kojih Subjectje i izvedeno ime (o tome ćete saznati Subjectkasnije).

Napomena: JAAS je samo jedan od nekoliko novih Java sigurnosnih API-ja. Za više informacija o sigurnosti Jave, pogledajte bočnu traku "Slagalica o sigurnosti Java" i resurse u nastavku.

JAAS na strani klijenta i poslužitelja

JAAS možete primijeniti i na klijentu i na poslužitelju. Kao što ćemo uskoro pokazati, upotreba na klijentskoj strani je jednostavna. Na serveru stvari postaju malo složenije. Trenutno je JAAS na tržištu poslužitelja aplikacija pomalo nedosljedan; Poslužitelji aplikacija J2EE JAAS koriste malo drugačije, ovisno o tome koji koristite. Na primjer, JBossSX, koristeći vlastitu arhitekturu, lijepo integrira JAAS u svoj cjelokupni sigurnosni okvir (što je detaljno opisano u izvrsnom članku Scotta Starka o JavaWorldu "Integriraj sigurnosne infrastrukture s JBossSX" (kolovoz 2001.)). Međutim, iako WebLogic 6.x podržava JAAS, detalji se razlikuju.

Da biste mogli razumjeti JAAS i s perspektive poslužitelja i klijenta, u ovom ćemo članku pokazati primjere oba. A za potrebe jednostavnosti na poslužitelju koristit ćemo poslužitelj aplikacija Resin kako bismo mogli započeti s čišćim programom (Resin ima vlastitu shemu provjere autentičnosti koja se može priključiti, ali ona je nestandardna, pa nam korištenje JAAS-a daje veću prenosivost mogućnosti kasnije).

Jezgra JAAS

Da biste započeli s JAAS-om, prvo morate osigurati da je instaliran. J2SE 1.4 već uključuje JAAS; J2SE 1.3 ne. Ako želite nastaviti koristiti J2SE 1.3, preuzmite JAAS iz Sun Microsystems. Jednom kada preuzmete i instalirate JAAS u određeni direktorij, vidjet ćete nazvani poddirektorij libkoji sadrži jednu datoteku s imenom jaas.jar. Morat ćete dodati ovu datoteku u stazu predavanja ili je kopirati u direktorij ekstenzija JRE (Java Runtime Environment) (u \lib\ext, gdje je mjesto vašeg JRE). Tada ste spremni za JAAS. Napomena: Ako koristite aplikacijski poslužitelj, on možda već uključuje JAAS. Pojedinosti potražite u dokumentaciji poslužitelja.

Uz bilo koji od ovih pristupa, imajte na umu da možete promijeniti neke postavke svojstva sustava povezane s JAAS-om (kao i mnoge druge sigurnosne postavke Java) u datoteci Java sigurnosnih svojstava. Ova se datoteka java.securitynalazi u /lib/securitydirektoriju i napisana je u standardnom formatu datoteke Java svojstava.

Korištenje JAAS provjere autentičnosti iz vaše aplikacije obično uključuje sljedeće korake:

  1. Stvoriti LoginContext
  2. Po želji proñe jedna CallbackHandlerdo LoginContext, za prikupljanje i obradu podataka za autorizaciju
  3. Izvođenje autentifikaciju pozivom LoginContext„s login()metodom
  4. Izvršite povlaštene radnje pomoću vraćenog Subject(pod pretpostavkom da je prijava uspjela)

Evo minimalnog primjera:

LoginContext lc = novi LoginContext ("MojPrimjer"); isprobajte {lc.login (); } catch (LoginException) {// Autentifikacija nije uspjela. } // Autentifikacija uspješna, sada možemo nastaviti. // Možemo koristiti vraćeni Predmet ako želimo. Predmet sub = lc.getSubject (); Subject.doAs (pod, novo MyPrivilegedAction ());

Ispod pokrivača događa se nekoliko drugih stvari:

  1. Tijekom inicijalizacije LoginContextpronalazi unos konfiguracije "MyExample"u konfiguracijskoj datoteci JAAS (koju ste konfigurirali) kako bi odredio koje LoginModules treba učitati (vidi sliku 2)
  2. Tijekom prijave je LoginContextpoziva svakog LoginModule„s login()metodom
  3. Svaka login()metoda izvodi provjeru autentičnosti ili upisuje aCallbackHandler
  4. Na CallbackHandlerkoristi jedan ili više Callbacks interakciju s korisnikom i skupiti ulaz
  5. Nova Subjectinstanca popunjava se detaljima provjere autentičnosti kao što su Principals i vjerodajnice

Daljnje detalje objasnit ćemo u nastavku, ali za početak pogledajmo ključne JAAS klase i sučelja uključena u proces. Oni se obično dijele u sljedeće tri skupine:

Tablica 1. JAAS klase i sučelja

Uobičajen Subject, Principal, Uvjerenje (uvjerenje nije bilo specifične klase, ali može biti bilo koji predmet)
Ovjera LoginContext, LoginModule, CallbackHandler,Callback
Odobrenje Policy, AuthPermission,PrivateCredentialPermission

Većina tih klasa i sučelja nalaze se u javax.security.authpotpaketama paketa, s nekim unaprijed izgrađenim implementacijama u com.sun.security.authpaketu, uključenim samo u J2SE 1.4.

Napomena: Budući da se u ovom članku fokusiramo na provjeru autentičnosti, ne ulazimo u klase autorizacije.

Common: Subjects, Principals, and Credentials

The Subject class represents an authenticated entity: an end-user or administrator, or a Web service, device, or another process. The class contains three sets of security information types:

  • Identities: In the form of one or more Principals
  • Public credentials: Such as name or public keys
  • Private credentials: Like passwords or private keys

Principals represent Subject identities. They implement the java.security.Principal interface (which predates JAAS) and java.io.Serializable. A Subject's most important method is getName(), which returns an identity's string name. Since a Subject instance contains an array of Principals, it can thus have multiple names. Because a social security number, login ID, email address, and so on, can all represent one user, multiple identities prove common in the real world.

The last element here, credential, is not a class or an interface, but can be any object. Credentials can include any authentication artifact, such as a ticket, key, or password, that specific security systems might require. The Subject class maintains unique Sets of private and public credentials, which can be retrieved with methods such as getPrivateCredentials() and getPublicCrendentials(). These methods are more often used by security subsystems than at the application layer.

Authentication: LoginContext

Your application layer uses LoginContext as its primary class for authenticating Subjects. LoginContext also represents where JAAS's dynamic pluggability comes into play, because when you construct a LoginContext, you specify a named configuration to load. The LoginContext typically loads the configuration information from a text file, which in turn tells the LoginContext which LoginModules to use during login.

The three commonly used methods in LoginContext are:

Table 2. LoginContext methods

login() Performs login, a relatively complex step that invokes all LoginModules specified for this configuration. If it succeeds, it creates an authenticated Subject. If it fails, it throws a LoginException.
getSubject() Returns the authenticated Subject.
logout() Logs out the authenticated Subject and removes its Principals and credentials.

We will show how to use these methods later.

Authentication: LoginModule

LoginModule is the interface to specific authentication mechanisms. J2SE 1.4 ships with a set of ready-to-use LoginModules, including:

Table 3. LoginModules in J2SE 1.4

JndiLoginModule Verifies against a directory service configured under JNDI (Java Naming and Directory Interface)
Krb5LoginModule Authenticates using Kerberos protocols
NTLoginModule Uses the current user's NT security information to authenticate
UnixLoginModule Uses the current user's Unix security information to authenticate

Along with these modules comes a set of corresponding concrete Principal implementations in the com.sun.security.auth package, such as NTDomainPrincipal and UnixPrincipal.

The LoginModule interface has five methods:

Table 4. LoginModule methods

initialize() Called after the LoginModule is constructed.
login() Performs the authentication.
commit() Called by the LoginContext after it has accepted the results from all LoginModules defined for this application. We assign Principals and credentials to the Subject here.
abort() Called when any LoginModule for this application fails (even though earlier ones in sequence may have succeeded—thus akin to a 2PC model). No Principals or credentials are assigned to the Subject.
logout() Removes the Principals and credentials associated with the Subject.

The application layer calls none of these methods directly—the LoginContext invokes them as needed. Our example below will elaborate on these methods' implementations.

Authentication: CallbackHandlers and Callbacks

CallbackHandlers i Callbacks dopuštaju LoginModuleprikupljanje potrebnih podataka za provjeru autentičnosti od korisnika ili sustava, istovremeno ostajući neovisni o stvarnom mehanizmu interakcije. Iskoristit ćemo tu mogućnost u našem dizajnu - naša RdbmsLoginModulene ovisi o načinu na koji se dobivaju vjerodajnice korisnika (korisničko ime / lozinka) i stoga se mogu koristiti u različitim aplikacijskim okruženjima koja ćemo prikazati (bilo iz naredbenog retka ili iz JSP-a) .