Programování

Všechno to JAAS

Už jste někdy potřebovali vytvořit mechanismus ověřování přihlášení pro aplikaci? Kurzy jsou, máte, a pravděpodobně více než jednou, přičemž každá nová implementace je blízká, ale ne identická, s tou předchozí. Například jedna implementace může používat databázi Oracle, jiná může používat ověřování NT a další adresář LDAP (lehký přístupový adresářový protokol). Nebylo by hezké podporovat všechny tyto bezpečnostní mechanismy beze změny kódu na úrovni aplikace?

Nyní ve světě Java můžete pomocí služby Java Authentication and Authorization Service (JAAS). Toto relativně nové API bylo rozšíření v J2SE (Java 2 Platform, Standard Edition) 1.3, je jádrem API v J2SE 1.4 a je také součástí specifikace J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tomto článku vás naučíme základy JAAS a ukážeme vám, jak efektivně aplikovat JAAS na aplikace v reálném světě. Aplikaci tohoto článku jsme založili na našich vlastních zkušenostech s integrací JAAS do existujícího webového systému Java, který pro ukládání přihlašovacích údajů uživatele používal RDBMS (systém správy relační databáze). S JAAS jsme navrhli robustnější, flexibilnější a konzistentnější mechanismy přihlášení a ověřování.

Můžete si stáhnout kompletní sadu pracovních příkladů z níže uvedených zdrojů (zahrnuje zdroje Java, JSP (stránky JavaServer), konfiguraci JAAS s databází a skripty sestavení). Tyto příklady jsme testovali pomocí Resin serveru s JDBC (Java Database Connectivity) a MySQL databáze.

Ověřování a autorizace Java: Celkový obraz

Před JAAS byl bezpečnostní model Javy většinou formován svým původem jako jazyk nezávislý na platformě pro distribuované síťové aplikace. V počátcích se Java často objevovala jako mobilní kód, jako jsou applety založené na prohlížeči, a proto se počáteční model zabezpečení zaměřil na ochranu uživatelů na základě kde kód vznikl a kdo to vytvořil. Rané bezpečnostní mechanismy Java, jako např Bezpečnostní manažers, koncept izolovaného prostoru, podepisování kódu a soubory zásad byly určeny k ochraně uživatelů před systémem.

Vynález JAAS odráží vývoj Javy v univerzální programovací jazyk používaný k implementaci tradičních klientských a serverových aplikací, které vyžadují přihlášení a řízení přístupu. JAAS chrání systém před uživateli povolením nebo odepřením přístupu na základě kdo nebo co program spouští. Zatímco JAAS může provádět ověřování i autorizaci, v tomto článku se zaměřujeme především na ověřování.

JAAS může zjednodušit váš vývoj zabezpečení Java tím, že mezi vaši aplikaci vloží abstrakční vrstvu a různorodé základní ověřovací a autorizační mechanismy. Tato nezávislost na platformách a algoritmech vám umožňuje používat různé bezpečnostní mechanismy bez úpravy kódu na úrovni aplikace. Stejně jako u většiny bezpečnostních API Java, dosahuje JAAS této nezávislosti na implementaci prostřednictvím rozšiřitelného rámce rozhraní zásuvných poskytovatelů služeb (SPI): sada abstraktních tříd a rozhraní, pro které jsou vyvíjeny konkrétní implementace.

Obrázek 1 níže poskytuje přehled na vysoké úrovni o tom, jak JAAS dosahuje této připojitelnosti. Váš kód aplikační vrstvy se primárně zabývá a LoginContext. Pod tím LoginContext je sada jednoho nebo více dynamicky konfigurovaných Přihlašovací moduls, které zpracovávají skutečné ověřování pomocí příslušné bezpečnostní infrastruktury.

JAAS poskytuje určité reference Přihlašovací modul implementace, jako je Modul JndiLogin; můžete si také vytvořit svůj vlastní, jak to uděláme zde s RdbmsLoginModule. Ukážeme také, jak můžete rychle nastavit aplikaci s výběrem implementací pomocí jednoduchého konfiguračního souboru.

Kromě toho, že je JAAS zapojitelný, je stohovatelný: v rámci jediného přihlášení se může sada bezpečnostních modulů skládat na sebe, každý je volán v pořadí a každý interaguje s jinou bezpečnostní infrastrukturou.

Aspekty JAAS jsou modelovány na některých známých architektonických vzorcích zabezpečení a existujících rámcích. Funkce stohovatelnosti se například záměrně podobá rámci Unix Pluggable Authentication Module (PAM). Z transakčního hlediska JAAS přijímá chování podobné protokolům dvoufázového potvrzení (2PC). Koncepty konfigurace zabezpečení JAAS, včetně Politika soubory a Oprávnění, pocházejí z bezpečnostních balíčků J2SE 1.2. JAAS si také vypůjčuje nápady z jiných zavedených bezpečnostních rámců, jako jsou certifikáty X.509, z nichž název Předmět je odvozeno (dozvíte se více o Předmět později).

Poznámka: JAAS je jen jedním z několika nových bezpečnostních API Java. Další informace o zabezpečení Java najdete v postranním panelu „The Java Security Puzzle“ a v níže uvedených zdrojích.

JAAS na straně klienta a serveru

JAAS můžete použít na klientovi i na serveru. Jeho použití na straně klienta je přímé, jak si brzy ukážeme. Na straně serveru se věci stávají o něco složitějšími. V současné době je JAAS na trhu aplikačních serverů trochu nekonzistentní; Servery aplikací J2EE používají JAAS mírně odlišně, podle toho, který používáte. Například JBossSX pomocí své vlastní architektury pěkně integruje JAAS do svého celkového bezpečnostního rámce (který je podrobně popsán v JavaWorld článek „Integrovat bezpečnostní infrastruktury s JBossSX“ (srpen 2001)). Přestože WebLogic 6.x podporuje JAAS, podrobnosti se liší.

Takže můžete pochopit JAAS z pohledu na straně serveru i na straně klienta, v tomto článku si ukážeme příklady obou. A pro zjednodušení na serveru použijeme aplikační server Resin, abychom mohli začít s čistší břidlicí (Resin má vlastní zásuvné ověřovací schéma, ale je to nestandardní, takže použití JAAS nám dává větší přenositelnost možnosti později).

Jádro JAAS

Abyste mohli začít s JAAS, musíte se nejprve ujistit, že je nainstalován. J2SE 1.4 již obsahuje JAAS; J2SE 1.3 není. Pokud chcete i nadále používat J2SE 1.3, stáhněte si JAAS ze Sun Microsystems. Jakmile si stáhnete a nainstalujete JAAS do daného adresáře, uvidíte podadresář s názvem lib, který obsahuje jeden soubor s názvem jaas.jar. Tento soubor budete muset přidat do své cesty ke třídě nebo jej zkopírovat do adresáře rozšíření JRE (Java Runtime Environment) (v \ lib \ ext, kde je umístění vašeho JRE). Pak jste připraveni na JAAS. Poznámka: Pokud používáte aplikační server, může již obsahovat JAAS. Podrobnosti najdete v dokumentaci k serveru.

U některého z těchto přístupů si všimněte, že můžete změnit některá nastavení systémových vlastností souvisejících s JAAS (stejně jako mnoho dalších nastavení zabezpečení Java) v souboru vlastností zabezpečení Java. Tento soubor, java.bezpečnost, se nachází v / lib / zabezpečení adresář a zapsán ve standardním formátu souboru vlastností Java.

Použití ověřování JAAS z vaší aplikace obvykle zahrnuje následující kroky:

  1. Vytvořit LoginContext
  2. Volitelně předat a CallbackHandler do LoginContext, pro shromažďování nebo zpracování autentizačních dat
  3. Proveďte ověřování voláním LoginContextje přihlásit se() metoda
  4. Proveďte privilegované akce pomocí vráceného Předmět (za předpokladu úspěšného přihlášení)

Zde je minimální příklad:

 LoginContext lc = nový LoginContext ("Můj příklad"); zkuste {lc.login (); } catch (LoginException) {// Ověření se nezdařilo. } // Ověření bylo úspěšné, nyní můžeme pokračovat. // Pokud chceme, můžeme použít vrácený předmět. Předmět sub = lc.getSubject (); Subject.doAs (sub, new MyPrivilegedAction ()); 

Pod kryty se objevuje několik dalších věcí:

  1. Během inicializace LoginContext najde položku konfigurace „Můj příklad“ v konfiguračním souboru JAAS (který jste nakonfigurovali), abyste zjistili, který z nich Přihlašovací moduls načíst (viz obrázek 2)
  2. Během přihlášení se LoginContext volá každý Přihlašovací modulje přihlásit se() metoda
  3. Každý přihlásit se() metoda provádí ověřování nebo získává a CallbackHandler
  4. The CallbackHandler používá jeden nebo více Zpětné volánís k interakci s uživatelem a shromažďování informací
  5. Nový Předmět instance je naplněna podrobnostmi ověřování, jako je Ředitel školysa pověření

Níže vysvětlíme další podrobnosti, ale nejprve se podívejme na klíčové třídy a rozhraní JAAS zapojené do procesu. Ty se obvykle dělí do následujících tří skupin:

Tabulka 1. Třídy a rozhraní JAAS

BěžnýPředmět, Ředitel školypověření (pověření není žádná konkrétní třída, ale může to být jakýkoli objekt)
OvěřeníLoginContext, Přihlašovací modul, CallbackHandler, Zpětné volání
PovoleníPolitika, AuthPermission, PrivateCredentialPermission

Většina z těchto tříd a rozhraní je v javax.security.auth dílčí balíčky balíčku s některými předem připravenými implementacemi v com.sun.security.auth balíček, zahrnutý pouze v J2SE 1.4.

Poznámka: Protože se v tomto článku zaměříme na ověřování, nebudeme se ponořit do tříd autorizace.

Společné: Subjekty, ředitelé a pověřovací listiny

The Předmět třída představuje ověřenou entitu: koncového uživatele nebo správce nebo webovou službu, zařízení nebo jiný proces. Třída obsahuje tři sady typů informací o zabezpečení:

  • Totožnosti: Ve formě jednoho nebo více Ředitel školys
  • Veřejné údaje: Například jméno nebo veřejné klíče
  • Soukromé údaje: Jako hesla nebo soukromé klíče

Ředitel školys představují Předmět identity. Provádějí java.security.Principal rozhraní (které předchází JAAS) a java.io. Serializovatelné. A Předmětnejdůležitější metoda je getName (), který vrací název řetězce identity. Protože a Předmět instance obsahuje pole Ředitel školys, může tedy mít více jmen. Protože číslo sociálního zabezpečení, přihlašovací ID, e-mailová adresa atd., To vše může představovat jednoho uživatele, je v reálném světě více identit běžné.

Posledním prvkem zde, pověření, není třída nebo rozhraní, ale může to být jakýkoli objekt. Pověření mohou zahrnovat jakýkoli artefakt ověřování, například lístek, klíč nebo heslo, který mohou vyžadovat konkrétní systémy zabezpečení. The Předmět třída udržuje jedinečný Souborsoukromých a veřejných údajů, které lze načíst pomocí metod, jako je getPrivateCredentials () a getPublicCrendentials (). Tyto metody používají bezpečnostní subsystémy častěji než na aplikační vrstvě.

Ověření: LoginContext

Vaše aplikační vrstva používá LoginContext jako primární třída pro autentizaci Předměts. LoginContext také představuje místo, kde vstupuje do hry dynamická připojitelnost JAAS, protože když vytvoříte a LoginContext, určíte pojmenovanou konfiguraci, která se má načíst. The LoginContext obvykle načte informace o konfiguraci z textového souboru, což zase řekne LoginContext který Přihlašovací moduls použít při přihlášení.

Tři běžně používané metody v LoginContext jsou:

Tabulka 2. LoginContext metody

přihlásit se()Provede přihlášení, což je relativně složitý krok, který vyvolá všechny Přihlašovací modulpro tuto konfiguraci je uvedeno. Pokud uspěje, vytvoří ověřený Předmět. Pokud selže, hodí a Přihlašovací výjimka.
getSubject ()Vrátí ověřený Předmět.
odhlásit se()Odhlásí ověřené Předmět a odstraní jeho Ředitel školysa pověření.

Ukážeme si, jak tyto metody použít později.

Ověření: LoginModule

Přihlašovací modul je rozhraní ke konkrétním mechanismům autentizace. J2SE 1.4 se dodává se sadou připravených k použití Přihlašovací moduly, počítaje v to:

Tabulka 3. LoginModules v J2SE 1.4

Modul JndiLoginOvěří se proti adresářové službě nakonfigurované v rámci JNDI (Java Naming and Directory Interface)
Krb5LoginModuleOvěření pomocí protokolů Kerberos
NTLoginModuleK ověření použije informace o zabezpečení NT aktuálního uživatele
UnixLoginModuleK ověření použije informace o zabezpečení Unixu aktuálního uživatele

Spolu s těmito moduly přichází sada odpovídajícího betonu Ředitel školy implementace v com.sun.security.auth balíček, jako je NTDomainPrincipal a UnixPrincipal.

The Přihlašovací modul rozhraní má pět metod:

Tabulka 4. Metody LoginModule

inicializovat ()Volal po Přihlašovací modul je postaven.
přihlásit se()Provede ověření.
spáchat()Volal LoginContext poté, co přijme výsledky od všech Přihlašovací moduljsou definovány pro tuto aplikaci. Přiřadíme Ředitel školysa pověření k Předmět tady.
přerušit()Volal, když existuje Přihlašovací modul pro tuto aplikaci selže (i když ty starší v pořadí mohly uspět - tedy podobné jako u modelu 2PC). Ne Ředitel školys nebo pověření jsou přiřazena k Předmět.
odhlásit se()Odstraní Ředitel školysa pověření spojená s Předmět.

Aplikační vrstva žádnou z těchto metod přímo nevolá - the LoginContext podle potřeby je vyvolá. Náš příklad níže se bude zabývat implementacemi těchto metod.

Ověření: CallbackHandlers a zpětná volání

CallbackHandlers a Zpětné volánínecháme a Přihlašovací modul shromažďovat potřebné ověřovací informace od uživatele nebo systému, přičemž zůstávají nezávislé na skutečném mechanismu interakce. Tuto schopnost využijeme v našem designu - našem RdbmsLoginModule Nezáleží na tom, jak jsou získána pověření uživatele (uživatelské jméno / heslo), a lze je tedy použít v různých aplikačních prostředích, která ilustrujeme (buď z příkazového řádku nebo z JSP).

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