Ohjelmointi

Kaikki tuo JAAS

Oletko koskaan tarvinnut luoda kirjautumistodennusmekanismin sovellukselle? Kertoimet ovat, olet todennäköisesti ja useammin kuin kerran, ja jokainen uusi toteutus on lähellä, mutta ei identtistä edellisen kanssa. Esimerkiksi yksi toteutus saattaa käyttää Oracle-tietokantaa, toinen NT-todennusta ja toinen LDAP-hakemistoa (lightweight access directory protocol). Eikö olisi mukavaa tukea kaikkia näitä turvamekanismeja muuttamatta mitään sovellustason koodia?

Nyt Java-maailmassa voit käyttää Java Authentication and Authorization Service (JAAS) -palvelua. Tämä suhteellisen uusi sovellusliittymä oli J2SE (Java 2 Platform, Standard Edition) 1.3: n laajennus, on J2SE 1.4: n ydinsovellusliittymä ja on myös osa J2EE (Java 2 Platform, Enterprise Edition) 1.3 -määritystä. Tässä artikkelissa opetamme sinulle JAAS: n olennaiset osat ja näytämme sinulle, kuinka JAASia voidaan soveltaa tehokkaasti reaalimaailman sovelluksiin. Perustimme tämän artikkelin sovelluksen omiin kokemuksiimme integroimalla JAAS olemassa olevaan Java-verkkopohjaiseen järjestelmään, joka käytti RDBMS: ää (relaatiotietokantojen hallintajärjestelmä) käyttäjien kirjautumistietojen tallentamiseen. JAAS: n avulla suunnittelimme vankemmat, joustavammat ja johdonmukaisemmat sisäänkirjautumis- ja todennusmekanismit.

Voit ladata täydellisen sarjan toimivia esimerkkejä alla olevista resursseista (sisältää Java-lähteet, JSP: t (JavaServer Pages), JAAS-määritykset, tietokanta- ja koontikomentosarjat). Testasimme nämä esimerkit käyttämällä Resin-palvelinta JDBC: llä (Java Database Connectivity) ja MySQL-tietokantaa.

Java-todennus ja valtuutus: Suuri kuva

Ennen JAAS: a Java-tietoturvamallin muotoiltiin lähinnä sen alkuperästä alustasta riippumattomana kielenä hajautettuihin, verkotettuihin sovelluksiin. Alkuvaiheissa Java esiintyi usein mobiilikoodina, kuten selainpohjaisina sovelmina, ja siksi alkuperäinen suojausmalli keskittyi käyttäjien suojaamiseen josta koodi on peräisin ja kuka sen loi. Varhaiset Java-suojausmekanismit, kuten Turvallisuuspäällikkös, hiekkalaatikkokonseptin, koodin allekirjoittamisen ja käytäntötiedostojen tarkoituksena oli kaikki suojella käyttäjiä järjestelmästä.

JAAS: n keksintö heijastaa Javan kehityksen yleiskäyttöiseksi ohjelmointikieleksi, jota käytetään perinteisten asiakas- ja palvelinsovellusten toteuttamiseen, jotka edellyttävät sisäänkirjautumista ja pääsynhallintaa. JAAS suojaa järjestelmää käyttäjiltä sallimalla tai estämällä pääsyn sen perusteella kuka tai mikä ajaa ohjelmaa. Vaikka JAAS pystyy suorittamaan sekä todennuksen että todennuksen, tässä artikkelissa keskitymme ensisijaisesti todennukseen.

JAAS voi yksinkertaistaa Java-tietoturvakehitystäsi asettamalla abstraktikerroksen sovelluksesi ja erilaisten todennus- ja valtuutusmekanismien välille. Tämän riippumattomuuden alustoista ja algoritmeista avulla voit käyttää erilaisia ​​suojausmekanismeja muuttamatta sovellustason koodia. Kuten useimmissa Java-tietoturvasovellusliittymissä, JAAS saavuttaa tämän toteutusriippumattomuuden laajennettavien palveluntarjoajaliittymien (SPI) laajennetun kehyksen avulla: joukko abstrakteja luokkia ja rajapintoja, joille kehitetään erityisiä toteutuksia.

Alla oleva kuva 1 antaa korkean tason yleiskuvan siitä, miten JAAS saavuttaa tämän liitettävyyden. Sovellustason koodi käsittelee ensisijaisesti a Kirjaudu sisään. Sen alla Kirjaudu sisään on joukko yhtä tai useampaa dynaamisesti konfiguroitua Kirjaudu sisääns, jotka käsittelevät todellisen todennuksen sopivalla suojausinfrastruktuurilla.

JAAS tarjoaa jonkin verran viitteitä Kirjaudu sisään toteutukset, kuten JndiKirjaudu sisäänModuuli; voit myös kehittää oman, kuten teemme täällä RdbmsLoginModule. Näytämme myös, kuinka voit määrittää sovelluksen nopeasti valinnalla toteutuksia yksinkertaisen määritystiedoston avulla.

Liitettävyyden lisäksi JAAS on pinottava: yhden sisäänkirjautumisen yhteydessä joukko suojausmoduuleja voi pinota päällekkäin, kukin kutsutaan järjestyksessä ja kukin vuorovaikutuksessa eri turvallisuusinfrastruktuurin kanssa.

JAAS-näkökohdat mallinnetaan joillekin tutuille turvallisuusarkkitehtuurimalleille ja olemassa oleville kehyksille. Esimerkiksi pinottava ominaisuus muistuttaa tarkoituksella Unix Pluggable Authentication Module (PAM) -kehystä. Kaupan näkökulmasta JAAS käyttää käyttäytymistä, joka on samanlainen kuin kaksivaiheinen sitoutumisprotokolla (2PC). JAAS: n suojauskokoonpanokonseptit, mukaan lukien Käytäntö tiedostot ja Käyttöoikeudet, tulevat J2SE 1.2 -tietoturvapaketeista. JAAS lainaa ideoita myös muista vakiintuneista suojauskehyksistä, kuten X.509-varmenteista, joista nimi Aihe on johdettu (opit lisää Aihe myöhemmin).

merkintä: JAAS on vain yksi monista uusista Java-suojausrajapinnoista. Lisätietoja Java-turvallisuudesta on sivupalkissa "Java-turvallisuuspalapeli" ja alla olevista lähteistä.

Asiakas- ja palvelinpuolen JAAS

Voit käyttää JAASia sekä asiakkaalla että palvelimella. Sen käyttö asiakaspuolella on yksinkertaista, kuten osoitamme pian. Palvelinpuolella asiat kasvavat hieman monimutkaisemmiksi. Tällä hetkellä JAAS sovelluspalvelimien markkinoilla on hieman epäjohdonmukainen; J2EE-sovelluspalvelimet käyttävät JAAS: ää hieman eri tavalla riippuen siitä, mitä käytät. Esimerkiksi JBossSX, omaa arkkitehtuuriaan käyttäen, integroi JAAS hienosti yleiseen tietoturvakehykseen (joka on kuvattu Scott Starkin erinomaisessa JavaWorld artikkeli "Integroi turvallisuusinfrastruktuurit JBossSX: n kanssa" (elokuu 2001)). Vaikka WebLogic 6.x tukee JAAS: ää, yksityiskohdat eroavat toisistaan.

Joten voit ymmärtää JAAS: n sekä palvelin- että asiakaspuolelta, esittelemme esimerkkejä molemmista tässä artikkelissa. Ja palvelimen yksinkertaisuuden vuoksi käytämme hartsisovelluspalvelinta, jotta voimme aloittaa puhtaammalla pöydällä (hartsilla on oma plug-up -todennusjärjestelmä, mutta se on epätyypillinen, joten JAAS: n käyttö antaa meille enemmän siirrettävyyttä vaihtoehtoja myöhemmin).

JAAS-ydin

JAAS: n käytön aloittamiseksi sinun on ensin varmistettava, että se on asennettu. J2SE 1.4 sisältää jo JAAS: n; J2SE 1.3 ei. Jos haluat jatkaa J2SE 1.3: n käyttöä, lataa JAAS Sun Microsystemsista. Kun olet ladannut ja asentanut JAAS: n tiettyyn hakemistoon, näet alihakemiston nimeltä lib, joka sisältää yhden tiedoston nimeltä jaas.jar. Sinun on lisättävä tämä tiedosto luokkatiedeesi tai kopioitava se JRE (Java Runtime Environment) -laajennushakemistoon ( \ lib \ ext, missä on JRE: n sijainti). Olet sitten JAAS-valmis. merkintä: Jos käytät sovelluspalvelinta, se voi jo sisältää JAAS: n. Katso lisätietoja palvelimesi dokumentaatiosta.

Millä tahansa näistä lähestymistavoista on huomattava, että voit muuttaa joitain JAAS-järjestelmään liittyvistä järjestelmän ominaisuusasetuksista (samoin kuin monia muita Java-suojausasetuksia) Java-suojausominaisuustiedostossa. Tämä tiedosto, java.turvallisuus, sijaitsee / lib / turvallisuus hakemistoon ja kirjoitettu tavallisessa Java-ominaisuustiedostomuodossa.

JAAS-todennuksen käyttäminen sovelluksessasi edellyttää yleensä seuraavia vaiheita:

  1. Luo Kirjaudu sisään
  2. Vaihtoehtoisesti läpäise a Soittokäsittelijä että Kirjaudu sisään, todennustietojen keräämiseen tai käsittelyyn
  3. Suorita todennus soittamalla Kirjaudu sisäänon Kirjaudu sisään() menetelmä
  4. Suorita etuoikeutetut toiminnot käyttämällä palautettua Aihe (olettaen, että sisäänkirjautuminen onnistuu)

Tässä on vähäinen esimerkki:

 LoginContext lc = uusi LoginContext ("Oma esimerkki"); kokeile {lc.login (); } catch (LoginException) {// Todennus epäonnistui. } // Todennus onnistui, voimme nyt jatkaa. // Voimme käyttää palautettua aihetta, jos haluamme. Aihe sub = lc.getSubject (); Subject.doAs (ala, uusi MyPrivilegedAction ()); 

Kansien alla esiintyy muutama muu asia:

  1. Alustamisen aikana Kirjaudu sisään löytää kokoonpanomerkinnän "OmaExample" JAAS-määritystiedostossa (jonka olet määrittänyt) sen määrittämiseksi Kirjaudu sisääns ladattavaksi (katso kuva 2)
  2. Sisäänkirjautumisen aikana Kirjaudu sisään kutsuu kutakin Kirjaudu sisäänon Kirjaudu sisään() menetelmä
  3. Jokainen Kirjaudu sisään() menetelmä suorittaa todennuksen tai pyytää a Soittokäsittelijä
  4. Soittokäsittelijä käyttää yhtä tai useampaa Soita takaisins olla vuorovaikutuksessa käyttäjän kanssa ja kerätä syötteitä
  5. Uusi Aihe ilmentymä täytetään todennustiedoilla, kuten Rehtoris ja valtakirjat

Selitämme lisätietoja alla, mutta aluksi katsotaanpa prosessin keskeiset JAAS-luokat ja rajapinnat. Nämä jaetaan tyypillisesti seuraaviin kolmeen ryhmään:

Taulukko 1. JAAS-luokat ja rajapinnat

YleinenAihe, Rehtori, tunnistetiedot (tunnistetiedot eivät ole mitään erityisiä luokkia, mutta voivat olla mitä tahansa esineitä)
TodennusKirjaudu sisään, Kirjaudu sisään, Soittokäsittelijä, Soita takaisin
ValtuutusKäytäntö, AuthPermission, PrivateCredentialPermission

Suurin osa näistä luokista ja rajapinnoista on javax.security.auth paketin alipaketit, joissakin valmiiksi toteutetuissa toteutuksissa com.sun.security.auth paketti, sisältyy vain J2SE 1.4: een.

merkintä: Koska keskitymme tässä artikkelissa todennukseen, emme syvennä valtuutusluokkiin.

Yleiset: Aiheet, rehtorit ja valtakirjat

Aihe luokka edustaa todennettua kokonaisuutta: loppukäyttäjä tai järjestelmänvalvoja tai verkkopalvelu, laite tai muu prosessi. Luokka sisältää kolme joukkoa suojaustietotyyppejä:

  • Identiteetit: Yhden tai useamman muodossa Rehtoris
  • Julkiset valtakirjat: Kuten nimi tai julkiset avaimet
  • Yksityiset valtakirjat: Kuten salasanat tai yksityiset avaimet

Rehtoriedustavat Aihe identiteetit. He toteuttavat java.security.Principal käyttöliittymä (joka edeltää JAAS: ää) ja java.io.Serialisoitavissa. A AiheTärkein menetelmä on getName (), joka palauttaa identiteetin merkkijononimen. Koska a Aihe esiintymä sisältää joukon Rehtoris, sillä voi siis olla useita nimiä. Koska sosiaaliturvatunnus, kirjautumistunnus, sähköpostiosoite ja niin edelleen, voivat kaikki edustaa yhtä käyttäjää, useat henkilöllisyydet osoittautuvat tavallisiksi todellisessa maailmassa.

Viimeinen elementti tässä, tunnistetiedot, ei ole luokka tai käyttöliittymä, vaan se voi olla mikä tahansa esine. Tunnistetiedot voivat sisältää minkä tahansa todennusasiakirjan, kuten lipun, avaimen tai salasanan, joita tietyt turvajärjestelmät saattavat edellyttää. Aihe luokka säilyttää ainutlaatuisen Asetayksityiset ja julkiset tunnistetiedot, jotka voidaan hakea esimerkiksi getPrivateCredentials () ja getPublicCrendentials (). Suojausalijärjestelmät käyttävät näitä menetelmiä useammin kuin sovelluskerroksessa.

Todennus: LoginContext

Sovelluskerroksesi käyttää Kirjaudu sisään ensisijaisena luokkana todentamiseksi Aihes. Kirjaudu sisään edustaa myös sitä, missä JAAS: n dynaaminen liitettävyys tulee esiin, koska kun rakennat a Kirjaudu sisään, määrität nimettävän kokoonpanon ladattavaksi. Kirjaudu sisään yleensä lataa kokoonpanotiedot tekstitiedostosta, joka puolestaan ​​kertoo Kirjaudu sisään mikä Kirjaudu sisääns käyttää sisäänkirjautumisen yhteydessä.

Kolme yleisesti käytettyä menetelmää Kirjaudu sisään ovat:

Taulukko 2. LoginContext-menetelmät

Kirjaudu sisään()Suorittaa sisäänkirjautumisen, joka on suhteellisen monimutkainen vaihe, joka kutsuu kaikki Kirjaudu sisäänmääritetty tälle kokoonpanolle. Jos se onnistuu, se luo todennetun Aihe. Jos se epäonnistuu, se heittää a Kirjaudu sisäänPoikkeus.
getSubject ()Palauttaa todennetun Aihe.
kirjautua ulos()Kirjaudu ulos todennetusta Aihe ja poistaa sen Rehtoris ja valtakirjat.

Näytämme, miten näitä menetelmiä käytetään myöhemmin.

Todennus: LoginModule

Kirjaudu sisään on rajapinta tiettyihin todennusmekanismeihin. J2SE 1.4 toimitetaan valmiina käyttöön Kirjaudu sisään, mukaan lukien:

Taulukko 3. Sisäänkirjautumismoduulit J2SE 1.4: ssä

JndiKirjaudu sisäänModuuliVertaa hakemistopalveluun, joka on määritetty JNDI: ssä (Java Naming and Directory Interface)
Krb5Kirjaudu sisäänModuuliTodentaminen Kerberos-protokollien avulla
NTLoginModuleKäyttää todentamiseen nykyisen käyttäjän NT-suojaustietoja
UnixLoginModuleKäyttää todentamiseen nykyisen käyttäjän Unix-suojaustietoja

Näiden moduulien mukana tulee joukko vastaavaa betonia Rehtori toteutukset com.sun.security.auth paketti, kuten NTDomainPääoma ja Unix-periaate.

Kirjaudu sisään käyttöliittymässä on viisi tapaa:

Taulukko 4. LoginModule-menetelmät

alustaa()Soitettu Kirjaudu sisään on rakennettu.
Kirjaudu sisään()Suorittaa todennuksen.
tehdä()Soitti Kirjaudu sisään kun se on hyväksynyt kaikkien tulokset Kirjaudu sisäänmääritetty tälle sovellukselle. Me annamme Rehtoris ja valtakirjat Aihe tässä.
keskeyttää()Soitetaan milloin tahansa Kirjaudu sisään tälle sovellukselle epäonnistuu (vaikka aikaisemmat peräkkäisetkin ovat saattaneet onnistua - samanlainen kuin 2PC-malli). Ei Rehtoris tai valtakirjat määritetään Aihe.
kirjautua ulos()Poistaa Rehtoris ja tunnukset, jotka liittyvät Aihe.

Sovelluskerros ei kutsu mitään näistä menetelmistä suoraan - Kirjaudu sisään käyttää niitä tarvittaessa. Alla olevassa esimerkissämme käsitellään tarkemmin näiden menetelmien toteutuksia.

Todennus: CallbackHandlers ja Callback

Soittokäsittelijäs ja Soita takaisinanna a Kirjaudu sisään kerätä tarvittavat todennustiedot käyttäjältä tai järjestelmältä samalla, kun se pysyy riippumattomana todellisesta vuorovaikutusmekanismista. Hyödynnämme tätä kykyä suunnittelussamme - meidän RdbmsLoginModule ei riipu siitä, miten käyttäjän tunnistetiedot (käyttäjätunnus / salasana) hankitaan, ja sitä voidaan siten käyttää eri havainnollistettavissa sovellusympäristöissä (joko komentoriviltä tai JSP: ltä).