Programovanie

Všetko to JAAS

Už ste niekedy potrebovali vytvoriť mechanizmus autentifikácie prihlásenia pre aplikáciu? Kurzy sú, pravdepodobne existujú, a pravdepodobne aj viackrát, pričom každá nová implementácia je blízka, ale nie identická, s predchádzajúcou. Jedna implementácia môže napríklad používať databázu Oracle, iná môže používať autentifikáciu NT a iná adresár LDAP (ľahký prístupový adresárový protokol). Nebolo by pekné podporovať všetky tieto bezpečnostné mechanizmy bez zmeny kódu na úrovni aplikácie?

Teraz vo svete Java môžete používať službu Java Authentication and Authorization Service (JAAS). Toto relatívne nové API bolo rozšírením v J2SE (Java 2 Platform, Standard Edition) 1.3, je jadrom API v J2SE 1.4 a je tiež súčasťou špecifikácie J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tomto článku vás naučíme základné informácie o JAAS a ukážeme vám, ako efektívne používať JAAS na aplikácie v reálnom svete. Aplikáciu tohto článku sme založili na našich vlastných skúsenostiach s integráciou JAAS do existujúceho webového systému Java, ktorý na ukladanie prihlasovacích údajov používateľa používal RDBMS (systém správy relačnej databázy). S JAAS sme navrhli robustnejšie, flexibilnejšie a konzistentnejšie mechanizmy prihlásenia a autentifikácie.

Kompletnú sadu pracovných príkladov si môžete stiahnuť z nižšie uvedených zdrojov (vrátane zdrojov Java, JSP (stránky JavaServer), konfigurácie JAAS s databázou a skriptmi na zostavenie). Tieto príklady sme testovali pomocou živicového servera s JDBC (Java Database Connectivity) a MySQL databázy.

Java autentifikácia a autorizácia: Celkový obraz

Pred JAAS bol bezpečnostný model Javy väčšinou formovaný svojím pôvodom ako jazyk nezávislý na platforme pre distribuované sieťové aplikácie. V začiatkoch sa Java často javila ako mobilný kód, napríklad ako applety založené na prehliadači, a preto sa prvotný model zabezpečenia zameriaval na ochranu používateľov na základe kde kód vznikol a kto ju vytvoril. Včasné bezpečnostné mechanizmy Java, ako napr SecurityManagers, koncept karantény, podpisovanie kódu a súbory zásad boli určené na ochranu používateľov pred systémom.

Vynález JAAS odráža vývoj Javy v univerzálny programovací jazyk používaný na implementáciu tradičných klientských a serverových aplikácií, ktoré vyžadujú prihlásenie a riadenie prístupu. JAAS chráni systém pred užívateľmi povolením alebo zakázaním prístupu na základe kto alebo čo program spúšťa. Aj keď JAAS môže vykonávať autentifikáciu aj autorizáciu, v tomto článku sa zameriavame predovšetkým na autentifikáciu.

JAAS môže zjednodušiť váš vývoj zabezpečenia v Jave vložením abstrakčnej vrstvy medzi vašu aplikáciu a rôznorodé základné mechanizmy autentifikácie a autorizácie. Táto nezávislosť od platforiem a algoritmov vám umožňuje používať rôzne bezpečnostné mechanizmy bez úpravy kódu na úrovni aplikácie. Rovnako ako u väčšiny bezpečnostných rozhraní Java, JAAS dosahuje túto nezávislosť implementácie prostredníctvom rozšíriteľného rámca zásuvných rozhraní poskytovateľa služieb (SPI): súborom abstraktných tried a rozhraní, pre ktoré sú vyvinuté konkrétne implementácie.

Obrázok 1 nižšie poskytuje prehľad na vysokej úrovni o tom, ako JAAS dosahuje túto zapojiteľnosť. Váš kód na aplikačnej vrstve sa zaoberá predovšetkým a LoginContext. Pod tým LoginContext je sada jedného alebo viacerých dynamicky konfigurovaných Prihlasovací moduls, ktoré spracovávajú skutočné overovanie pomocou príslušnej bezpečnostnej infraštruktúry.

JAAS poskytuje určité odkazy Prihlasovací modul implementácie, ako napríklad Modul JndiLogin; môžete si tiež vytvoriť svoj vlastný, ako to urobíme tu s RdbmsLoginModule. Ukážeme tiež, ako môžete rýchlo nastaviť aplikáciu s výberom implementácií pomocou jednoduchého konfiguračného súboru.

Okrem možnosti zapojenia je JAAS stohovateľný: v rámci jediného prihlásenia sa môže sada bezpečnostných modulov ukladať na seba, každý volaný v poradí a každý interaguje s inou bezpečnostnou infraštruktúrou.

Aspekty JAAS sú modelované na niektorých známych bezpečnostných architektonických vzoroch a existujúcich rámcoch. Stohovateľná funkcia sa napríklad zámerne podobá na rámec Unix Pluggable Authentication Module (PAM). Z transakčného hľadiska JAAS preberá správanie podobné protokolom dvojfázového odovzdania (2PC). Koncepty bezpečnostnej konfigurácie JAAS vrátane Politika súbory a Povolenia, pochádzajú z bezpečnostných balíkov J2SE 1.2. Spoločnosť JAAS si tiež požičiava nápady z iných zavedených bezpečnostných rámcov, ako sú napríklad certifikáty X.509, z ktorých názov pochádza Predmet je odvodené (dozviete sa viac o Predmet neskôr).

Poznámka: JAAS je iba jedným z niekoľkých nových bezpečnostných rozhraní Java. Viac informácií o zabezpečení Java nájdete na bočnom paneli „The Java Security Puzzle“ a zdrojoch nižšie.

JAAS na strane klienta a servera

Aplikáciu JAAS môžete použiť na klientovi aj serveri. Jeho použitie na strane klienta je priame, ako si ukážeme čoskoro. Na strane servera sa veci trochu komplikujú. V súčasnosti sú JAAS na trhu aplikačných serverov trochu nekonzistentné; Servery aplikácií J2EE používajú JAAS mierne odlišne, v závislosti od toho, ktorý používate. Napríklad JBossSX pomocou svojej vlastnej architektúry pekne integruje JAAS do svojho celkového bezpečnostného rámca (ktorý je podrobne uvedený v JavaWorld článok „Integrácia bezpečnostných infraštruktúr s JBossSX“ (august 2001)). Aj keď WebLogic 6.x podporuje JAAS, podrobnosti sa líšia.

Takže môžete pochopiť JAAS z pohľadu servera aj klienta, v tomto článku si ukážeme príklady oboch. A pre jednoduchosť na serveri použijeme aplikačný server Resin, aby sme mohli začať s čistejšou tabuľou (Resin má vlastnú zásuvnú autentifikačnú schému, ale je to neštandardné, takže použitie JAAS nám dáva väčšiu prenosnosť možnosti neskôr).

Jadro JAAS

Ak chcete začať používať JAAS, musíte sa najskôr ubezpečiť, že je nainštalovaný. J2SE 1.4 už obsahuje JAAS; J2SE 1.3 nie. Ak chcete naďalej používať J2SE 1.3, stiahnite si JAAS zo Sun Microsystems. Akonáhle stiahnete a nainštalujete JAAS do daného adresára, uvidíte podadresár s názvom lib, ktorý obsahuje jeden súbor s názvom jaas.jar. Tento súbor budete musieť pridať do svojej cesty triedy alebo ho skopírovať do svojho adresára s príponami JRE (Java Runtime Environment) (v \ lib \ ext, kde je umiestnenie vášho JRE). Potom ste pripravení na JAAS. Poznámka: Ak používate aplikačný server, môže už obsahovať JAAS. Podrobnosti nájdete v dokumentácii k serveru.

Pri ktoromkoľvek z týchto prístupov nezabudnite, že v súbore vlastností zabezpečenia Java môžete zmeniť niektoré nastavenia systému (JAAS) týkajúce sa systémových vlastností (ako aj mnoho ďalších nastavení zabezpečenia Java). Tento súbor, java.bezpečnosť, sa nachádza v / lib / bezpečnosť adresár a napísané v štandardnom formáte súboru vlastností Java.

Používanie autentifikácie JAAS z vašej aplikácie zvyčajne zahŕňa nasledujúce kroky:

  1. Vytvor LoginContext
  2. Voliteľne zložiť a CallbackHandler do LoginContext, na zhromažďovanie alebo spracovanie autentifikačných údajov
  3. Overenie vykonajte zavolaním na server LoginContextje Prihlásiť sa() metóda
  4. Vykonajte privilegované akcie pomocou vráteného Predmet (za predpokladu úspešného prihlásenia)

Tu je minimálny príklad:

 LoginContext lc = nový LoginContext ("Môj príklad"); skus {lc.login (); } catch (LoginException) {// Overenie zlyhalo. } // Autentifikácia úspešná, teraz môžeme pokračovať. // Vrátený Subjekt môžeme použiť, ak sa nám páči. Predmet sub = lc.getSubject (); Subject.doAs (sub, nová MyPrivilegedAction ()); 

Pod krytmi sa vyskytuje niekoľko ďalších vecí:

  1. Počas inicializácie sa LoginContext vyhľadá položku konfigurácie „Môj príklad“ v konfiguračnom súbore JAAS (ktorý ste nakonfigurovali), aby ste určili, ktorý Prihlasovací moduls na načítanie (pozri obrázok 2)
  2. Počas prihlásenia LoginContext volá každý Prihlasovací modulje Prihlásiť sa() metóda
  3. Každý Prihlásiť sa() metóda vykonáva autentifikáciu alebo získava a CallbackHandler
  4. The CallbackHandler používa jeden alebo viac Zavolaj späťs na interakciu s používateľom a zhromažďovanie vstupných informácií
  5. Nový Predmet inštancia je vyplnená podrobnosťami autentifikácie ako napr Principals a poverenia

Ďalej vysvetlíme ďalšie podrobnosti, ale najskôr sa pozrime na kľúčové triedy a rozhrania JAAS zapojené do procesu. Spravidla sa delia do nasledujúcich troch skupín:

Tabuľka 1. Triedy a rozhrania JAAS

BežnéPredmet, Principal, poverenie (poverenie nie je žiadna konkrétna trieda, ale môže to byť akýkoľvek objekt)
OverenieLoginContext, Prihlasovací modul, CallbackHandler, Zavolaj späť
PovoleniePolitika, AuthPermission, PrivateCredentialPermission

Väčšina z týchto tried a rozhraní je v javax.security.auth čiastkové balíčky balíka s niektorými vopred pripravenými implementáciami v priečinku com.sun.security.auth balík, zahrnutý iba v J2SE 1.4.

Poznámka: Pretože sa v tomto článku zameriavame na autentifikáciu, nebudeme sa venovať autorizačným triedam.

Časté: Predmety, riaditelia a poverovacie listiny

The Predmet trieda predstavuje autentifikovanú entitu: koncového používateľa alebo správcu alebo webovú službu, zariadenie alebo iný proces. Trieda obsahuje tri sady typov bezpečnostných informácií:

  • Totožnosti: Vo forme jedného alebo viacerých Principals
  • Verejné údaje: Napríklad meno alebo verejné kľúče
  • Súkromné ​​údaje: Rovnako ako heslá alebo súkromné ​​kľúče

Principals predstavujú Predmet totožnosti. Vykonávajú java.bezpečnosť.Principal rozhranie (ktoré predchádza JAAS) a java.io. Serializovateľné. A Predmetnajdôležitejšou metódou je getName (), ktorý vráti názov reťazca identity. Keďže a Predmet inštancia obsahuje pole Principals, môže tak mať viac mien. Pretože číslo sociálneho zabezpečenia, prihlasovacie ID, e-mailová adresa atď., Môžu všetci predstavovať jedného používateľa, je v reálnom svete bežné viac totožností.

Posledným prvkom, poverením, nie je trieda ani rozhranie, ale môže to byť akýkoľvek objekt. Poverovacie údaje môžu obsahovať akýkoľvek artefakt autentifikácie, napríklad lístok, kľúč alebo heslo, ktorý môžu vyžadovať konkrétne systémy zabezpečenia. The Predmet trieda zachováva jedinečnosť Nastaviťso súkromnými a verejnými povereniami, ktoré je možné získať metódami ako napr getPrivateCredentials () a getPublicCrendentials (). Tieto metódy používajú bezpečnostné podsystémy častejšie ako na aplikačnej vrstve.

Autentifikácia: LoginContext

Vaša aplikačná vrstva používa LoginContext ako svoju primárnu triedu pre autentifikáciu Predmets. LoginContext tiež predstavuje miesto, kde vstupuje do hry dynamická pripojiteľnosť JAAS, pretože keď skonštruujete a LoginContext, zadáte pomenovanú konfiguráciu, ktorá sa má načítať. The LoginContext zvyčajne načíta informácie o konfigurácii z textového súboru, ktorý zase informuje LoginContext ktoré Prihlasovací moduls použiť počas prihlásenia.

Tri bežne používané metódy v LoginContext sú:

Tabuľka 2. Metódy LoginContext

Prihlásiť sa()Vykoná prihlásenie, čo je pomerne zložitý krok, ktorý vyvolá všetky Prihlasovací modulpre túto konfiguráciu je zadané. Ak bude úspešný, vytvorí sa autentifikovaný Predmet. Ak zlyhá, hodí a Prihlasovacia výnimka.
getSubject ()Vráti overený Predmet.
odhlásiť sa()Odhlási overené Predmet a odstráni jeho Principals a poverenia.

Neskôr sa ukážeme, ako tieto metódy použiť.

Autentifikácia: LoginModule

Prihlasovací modul je rozhranie k špecifickým mechanizmom autentifikácie. J2SE 1.4 sa dodáva so sadou pripravených na použitie Prihlasovacie moduly, počítajúc do toho:

Tabuľka 3. LoginModules v J2SE 1.4

Modul JndiLoginOveruje oproti adresárovej službe nakonfigurovanej v rámci JNDI (Java Naming and Directory Interface)
Modul Krb5LoginOveruje pomocou protokolov Kerberos
NTLoginModulePoužíva na autentifikáciu bezpečnostné informácie NT aktuálneho používateľa
UnixLoginModulePoužíva na autentifikáciu bezpečnostné informácie Unixu aktuálneho používateľa

Spolu s týmito modulmi prichádza aj sada zodpovedajúceho betónu Principal implementácie v com.sun.security.auth balíček, ako napr NTDomainPrincipal a UnixPrincipal.

The Prihlasovací modul rozhranie má päť metód:

Tabuľka 4. Metódy LoginModule

inicializovať ()Volal po Prihlasovací modul je skonštruovaný.
Prihlásiť sa()Vykoná autentifikáciu.
spáchať ()Volal LoginContext po prijatí výsledkov od všetkých Prihlasovací modulsú definované pre túto aplikáciu. Priradíme Principals a poverenia do Predmet tu.
prerušiť ()Volal, keď existuje Prihlasovací modul pretože táto aplikácia zlyhala (aj keď tie staršie v poradí mohli uspieť - teda podobné ako v prípade modelu 2PC). Nie Principalalebo poverenia sú pridelené Predmet.
odhlásiť sa()Odstráni Principala poverenia spojené s Predmet.

Aplikačná vrstva nenavolá žiadnu z týchto metód priamo - LoginContext vyvoláva ich podľa potreby. Náš príklad nižšie bude rozpracovávať implementácie týchto metód.

Autentifikácia: CallbackHandlers a Callbacks

CallbackHandlers a Zavolaj späťs nech a Prihlasovací modul zhromažďovať potrebné autentifikačné informácie od používateľa alebo systému, pričom zostáva nezávislý od skutočného mechanizmu interakcie. Túto schopnosť využijeme v našom dizajne - našom RdbmsLoginModule nezávisí od toho, ako sa získajú poverenia používateľa (používateľské meno / heslo), a dá sa teda použiť v rôznych prostrediach aplikácií, ktoré ilustrujeme (buď z príkazového riadku alebo z JSP).

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