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ään
s, 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:
- Luo
Kirjaudu sisään
- Vaihtoehtoisesti läpäise a
Soittokäsittelijä
ettäKirjaudu sisään
, todennustietojen keräämiseen tai käsittelyyn - Suorita todennus soittamalla
Kirjaudu sisään
onKirjaudu sisään()
menetelmä - 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:
- Alustamisen aikana
Kirjaudu sisään
löytää kokoonpanomerkinnän"OmaExample"
JAAS-määritystiedostossa (jonka olet määrittänyt) sen määrittämiseksiKirjaudu sisään
s ladattavaksi (katso kuva 2) - Sisäänkirjautumisen aikana
Kirjaudu sisään
kutsuu kutakinKirjaudu sisään
onKirjaudu sisään()
menetelmä - Jokainen
Kirjaudu sisään()
menetelmä suorittaa todennuksen tai pyytää aSoittokäsittelijä
-
Soittokäsittelijä
käyttää yhtä tai useampaaSoita takaisin
s olla vuorovaikutuksessa käyttäjän kanssa ja kerätä syötteitä - Uusi
Aihe
ilmentymä täytetään todennustiedoilla, kutenRehtori
s 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
Yleinen | Aihe , Rehtori , tunnistetiedot (tunnistetiedot eivät ole mitään erityisiä luokkia, mutta voivat olla mitä tahansa esineitä) |
Todennus | Kirjaudu sisään , Kirjaudu sisään , Soittokäsittelijä , Soita takaisin |
Valtuutus | Kä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
Rehtori
s - Julkiset valtakirjat: Kuten nimi tai julkiset avaimet
- Yksityiset valtakirjat: Kuten salasanat tai yksityiset avaimet
Rehtori
edustavat Aihe
identiteetit. He toteuttavat java.security.Principal
käyttöliittymä (joka edeltää JAAS: ää) ja java.io.Serialisoitavissa
. A Aihe
Tärkein menetelmä on getName ()
, joka palauttaa identiteetin merkkijononimen. Koska a Aihe
esiintymä sisältää joukon Rehtori
s, 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 Aseta
yksityiset 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 Aihe
s. 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ään
s 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ään mää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 Rehtori s 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äänModuuli | Vertaa hakemistopalveluun, joka on määritetty JNDI: ssä (Java Naming and Directory Interface) |
Krb5Kirjaudu sisäänModuuli | Todentaminen Kerberos-protokollien avulla |
NTLoginModule | Käyttää todentamiseen nykyisen käyttäjän NT-suojaustietoja |
UnixLoginModule | Kä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. |
| Suorittaa todennuksen. |
tehdä() | Soitti Kirjaudu sisään kun se on hyväksynyt kaikkien tulokset Kirjaudu sisään määritetty tälle sovellukselle. Me annamme Rehtori s 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 Rehtori s tai valtakirjat määritetään Aihe . |
kirjautua ulos() | Poistaa Rehtori s 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 takaisin
anna 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ä).