Vodič za Java GSS API

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom ćemo uputstvu razumjeti API generičke sigurnosne usluge (GSS API) i kako ga možemo implementirati u Javi. Vidjet ćemo kako možemo osigurati mrežnu komunikaciju pomoću GSS API-ja u Javi.

U tom ćemo procesu stvoriti jednostavne klijentske i poslužiteljske komponente, osiguravajući ih GSS API-jem.

2. Što je GSS API?

Pa, što je zapravo API generičke sigurnosne usluge? GSS API pruža generički okvir za aplikacije koji koriste različite sigurnosne mehanizme poput Kerberosa, NTLM i SPNEGO na priključni način. Posljedično, to pomaže aplikacijama da se izravno odvoje od sigurnosnih mehanizama.

Da pojasnimo, ovdje se proteže sigurnost autentičnost, cjelovitost podataka i povjerljivost.

2.1. Zašto trebamo GSS API?

Sigurnosni mehanizmi poput Kerberosa, NTLM-a i Digest-MD5 prilično se razlikuju u svojim mogućnostima i implementacijama. Uobičajeno je da aplikacija koja podržava jedan od ovih mehanizama prilično zastrašujuće prebaciti se na drugi.

Ovo je gdje generički okvir poput GSS API-a pruža aplikacijama apstrakciju. Stoga aplikacije koje koriste GSS API mogu pregovarati o prikladnom sigurnosnom mehanizmu i koristiti ga za komunikaciju. Sve to bez da zapravo morate provoditi bilo kakve detalje specifične za mehanizam.

2.2. Kako GSS API rad?

GSS API je mehanizam zasnovan na žetonu. Djeluje po razmjena sigurnosnih tokena između vršnjaka. Ta se razmjena obično događa preko mreže, ali GSS API je agnostičan za te detalje.

Te tokene generiraju i obrađuju specifične implementacije GSS API-ja. The sintaksa i semantika ovih tokena specifični su za sigurnosni mehanizam pregovore između vršnjaka:

Središnja tema GSS API-ja vrti se oko sigurnosnog konteksta. Ovaj kontekst možemo uspostaviti među vršnjacima razmjenom žetona. Mi možda će trebati višestruka razmjena tokena između vršnjaka uspostaviti kontekst.

Jednom uspješno uspostavljeni na oba kraja, možemo koristiti sigurnosni kontekst za sigurnu razmjenu podataka. To može uključivati ​​provjere integriteta podataka i šifriranje podataka, ovisno o temeljnom sigurnosnom mehanizmu.

3. Podrška za GSS API u Javi

Java podržava GSS API kao dio paketa "org.ietf.jgss". Naziv paketa može se činiti neobičnim. To je zato što Java vezi za GSS API definirani su u IETF specifikaciji. Sama specifikacija neovisna je o sigurnosnom mehanizmu.

Jedan od popularnih sigurnosnih mehanizama za Java GSS je Kerberos v5.

3.1. Java GSS API

Pokušajmo razumjeti neke od osnovnih API-ja koji grade Java GSS:

  • GSSContext enkapsulira sigurnosni kontekst GSS API-a i pruža usluge dostupne u tom kontekstu
  • GSSC vjerodostojnost enkapsulira vjerodajnice GSS API-ja za entitet koji je potreban za uspostavljanje sigurnosnog konteksta
  • GSSName enkapsulira glavni entitet GSS API-a koji pruža apstrakciju za različiti prostor imena koji se koriste u osnovi mehanizama

Osim gore navedenih sučelja, ima još nekoliko važnih klasa koje treba napomenuti:

  • GSSManager služi kao tvornička klasa za druge važne klase GSS API-a poput GSSName, GSSCredencija, i GSSContext
  • Oid predstavlja Univerzalne identifikatore objekata (OID) koji su hijerarhijski identifikatori koji se koriste u GSS API-ju za identifikaciju mehanizama i formata imena
  • MessageProp obavija svojstva koja ukazuju na GSSContext o stvarima poput kvalitete zaštite (QoP) i povjerljivosti za razmjenu podataka
  • Povezivanje kanala enkapsulira opcijske informacije o vezivanju kanala koje se koriste za jačanje kvalitete s kojom se pruža provjera autentičnosti ravnopravnog entiteta

3.2. Java GSS davatelj sigurnosti

Iako Java GSS definira temeljni okvir za implementaciju GSS API-ja u Javi, on ne pruža implementaciju. Java usvaja Pružatelj uslugazasnovane na priključnim implementacijama za sigurnosne usluge uključujući Java GSS.

Takvih može biti jedan ili više davatelji sigurnosti registrirani u Java Cryptography Architecture (JCA). Svaki pružatelj zaštite može implementirati jednu ili više sigurnosnih usluga, poput Java GSSAPI i sigurnosnih mehanizama ispod.

Postoji zadani GSS dobavljač koji se isporučuje s JDK. Međutim, postoje i drugi dobavljači GSS-a s različitim sigurnosnim mehanizmima koje možemo koristiti. Jedan od takvih davatelja usluga je IBM Java GSS. Moramo registrirati takvog pružatelja sigurnosti kod JCA kako bismo ih mogli koristiti.

Štoviše, ako je potrebno, mi možemo implementirati vlastitog sigurnosnog pružatelja s možda prilagođenim sigurnosnim mehanizmima. Međutim, to u praksi teško treba.

4. GSS API kroz primjer

Sada ćemo na primjeru vidjeti Java GSS na djelu. Stvorit ćemo jednostavnu aplikaciju za klijenta i poslužitelja. Klijenta se u GSS-u češće naziva inicijatorom, a poslužiteljem kao prihvatiocem. Za provjeru autentičnosti koristit ćemo Java GSS i Kerberos v5 ispod.

4.1. GSS kontekst za klijenta i poslužitelja

Za početak ćemo morati uspostaviti a GSSContext, kako na poslužitelju tako i na strani klijenta prijave.

Pogledajmo prvo kako to možemo učiniti na strani klijenta:

Upravitelj GSSManager = GSSManager.getInstance (); String serverPrinciple = "HTTP / [e-pošta zaštićena]"; GSSName ime poslužitelja = manager.createName (Načelo poslužitelja, null); Oid krb5Oid = novi Oid ("1.2.840.113554.1.2.2"); GSSContext clientContext = manager.createContext (ime poslužitelja, krb5Oid, (GSSCredential) null, GSSContext.DEFAULT_LIFETIME); clientContext.requestMutualAuth (true); clientContext.requestConf (true); clientContext.requestInteg (true);

Ovdje se događa dosta puno stvari, hajde da ih raščlanimo:

  • Započinjemo stvaranjem instance GSSManager
  • Zatim koristimo ovu instancu za stvaranje GSSContext, prolazeći dalje:
    • a GSSName predstavlja glavnicu poslužitelja, bilješka posebno glavno ime Kerberos ovdje
    • the Oid mehanizma za upotrebu, ovdje Kerberos v5
    • vjerodajnice inicijatora, null ovdje znači da će se koristiti zadane vjerodajnice
    • životni vijek za uspostavljeni kontekst
  • Napokon se pripremamo kontekst uzajamne provjere autentičnosti, povjerljivosti i integriteta podataka

Slično tome, moramo definirati kontekst na strani poslužitelja:

Upravitelj GSSManager = GSSManager.getInstance (); GSSContext serverContext = manager.createContext ((GSSCredential) null);

Kao što vidimo, ovo je mnogo jednostavnije od konteksta na strani klijenta. Jedina razlika ovdje je u tome što su nam potrebne vjerodajnice prihvatioca koje smo koristili kao null. Kao prije, null znači da će se koristiti zadane vjerodajnice.

4.2. GSS API provjera autentičnosti

Iako smo stvorili poslužitelja i klijenta GSSContext, imajte na umu da nisu uspostavljeni u ovoj fazi.

Da bismo uspostavili ove kontekste, moramo razmijeniti tokene specifične za navedeni sigurnosni mehanizam, to jest Kerberos v5:

// Na strani klijenta clientToken = clientContext.initSecContext (novi bajt [0], 0, 0); sendToServer (clientToken); // Ovo bi trebalo biti poslano preko mreže // Na strani poslužitelja serverToken = serverContext.acceptSecContext (clientToken, 0, clientToken.length); sendToClient (serverToken); // Ovo bi trebalo biti poslano preko mreže // Natrag na klijentskoj strani clientContext.initSecContext (serverToken, 0, serverToken.length);

To konačno čini kontekst uspostavljen na oba kraja:

assertTrue (serverContext.isEstablished ()); assertTrue (clientContext.isEstablished ());

4.3. GSS API sigurna komunikacija

Sad, kad imamo kontekst uspostavljen na oba kraja, možemo početi slati podatke s integritetom i povjerljivošću:

// Na bajtu na strani klijenta [] messageBytes = "Baeldung" .getBytes (); MessageProp clientProp = novi MessageProp (0, istina); bajt [] clientToken = clientContext.wrap (messageBytes, 0, messageBytes.length, clientProp); sendToClient (serverToken); // Ovo bi trebalo biti poslano preko mreže // Na serveru MessageProp serverProp = new MessageProp (0, false); bajt [] bajtova = serverContext.unwrap (clientToken, 0, clientToken.length, serverProp); Niz niza = novi niz (bajtovi); assertEquals ("Baeldung", niz);

Nekoliko se stvari ovdje događa, analizirajmo:

  • MessageProp koristi klijent za postavljanje zamotati metoda i generiranje tokena
  • Metoda zamotati također dodaje kriptografski MIC podataka, MIC se stavlja u paket kao dio tokena
  • Taj se token šalje poslužitelju (moguće putem mrežnog poziva)
  • Poslužitelj koristi MessageProp opet za postavljanje razmotati metodu i vratite podatke
  • Također, metoda razmotati provjerava MIC za primljene podatke, osiguravajući integritet podataka

Stoga klijent i poslužitelj mogu razmjenjivati ​​podatke s integritetom i povjerljivošću.

4.4. Postavljanje Kerberosa za primjer

Sad, GSS mehanizam poput Obično se očekuje da će Kerberos donijeti vjerodajnice s postojećeg Predmet. Razred Predmet ovdje je JAAS apstrakcija koja predstavlja entitet poput osobe ili usluge. To se obično popunjava tijekom provjere autentičnosti na temelju JAAS-a.

Međutim, za naš primjer nećemo izravno koristiti autentifikaciju na temelju JAAS. Dopustit ćemo Kerberosu da izravno dobije vjerodajnice, u našem slučaju pomoću datoteke s ključnim pločama. Postoji parametar JVM sustava da bi se to postiglo:

-Djavax.security.auth.useSubjectCredsOnly = false

Međutim, zadana implementacija Kerberosa koju pruža Sun Microsystem oslanja se na JAAS za pružanje provjere autentičnosti.

Ovo može zvučati suprotno onome što smo upravo razgovarali. Imajte na umu da u našoj aplikaciji možemo izričito koristiti JAAS koji će popuniti Predmet. Ili prepustite osnovnom mehanizmu da izravno provjeri autentičnost, gdje god koristi JAAS. Stoga moramo pružiti JAAS konfiguracijsku datoteku osnovnom mehanizmu:

com.sun.security.jgss.initiate {com.sun.security.auth.module.Krb5LoginModule potreban useKeyTab = true keyTab = example.keytab principal = "client / localhost" storeKey = true; }; com.sun.security.jgss.accept {com.sun.security.auth.module.Krb5LoginModule potreban useKeyTab = true keyTab = example.keytab storeKey = true principal = "HTTP / localhost"; };

Ova je konfiguracija direktna, gdje smo definirali Kerberos kao potrebni modul za prijavu i inicijatora i akceptora. Osim toga, konfigurirali smo upotrebu odgovarajućih principala iz datoteke s ključnim karticama. Ovu JAAS konfiguraciju možemo proslijediti JVM-u kao sistemski parametar:

-Djava.security.auth.login.config = login.conf

Ovdje se pretpostavlja da imamo pristup Kerberos KDC-u. U KDC-u smo postavili potrebne principale i dobili datoteku keytab koju ćemo koristiti, recimo “Primjer.tablica”.

Uz to, potrebna nam je datoteka za konfiguraciju Kerberos koja pokazuje na desni KDC:

[libdefaults] default_realm = EXAMPLE.COM udp_preference_limit = 1 [carstva] EXAMPLE.COM = {kdc = localhost: 52135}

Ova jednostavna konfiguracija definira KDC koji se izvodi na portu 52135 sa zadanim područjem kao EXAMPLE.COM. To možemo proslijediti JVM-u kao sistemski parametar:

-Djava.security.krb5.conf = krb5.conf

4.5. Pokretanje primjera

Da bismo pokrenuli primjer, moramo iskoristite artefakte Kerberos o kojima je bilo riječi u posljednjem odjeljku.

Također, moramo proslijediti potrebne JVM parametre:

java -Djava.security.krb5.conf = krb5.conf \ -Djavax.security.auth.useSubjectCredsOnly = false \ -Djava.security.auth.login.config = login.conf \ com.baeldung.jgss.JgssUnitTest

To je dovoljno da Kerberos izvede provjeru autentičnosti s vjerodajnicama s keytab-a i GSS-a kako bi uspostavio kontekst.

5. GSS API u stvarnom svijetu

Iako GSS API obećava da će riješiti mnoštvo sigurnosnih problema putem priključnih mehanizama, malo je slučajeva koji su široko prihvaćeni:

  • To je naširoko se koristi u SASL-u kao sigurnosni mehanizam, posebno tamo gdje je Kerberos temeljni mehanizam izbora. Kerberos je široko korišten mehanizam provjere autentičnosti, posebno unutar poslovne mreže. Zaista je korisno iskoristiti kerberiziranu infrastrukturu za provjeru autentičnosti nove aplikacije. Dakle, GSS API lijepo premošćuje taj jaz.
  • To je također koristi se u sprezi sa SPNEGO-om pregovarati o sigurnosnom mehanizmu kada se prethodno ne zna. S tim u vezi, SPNEGO je pseudo mehanizam GSS API-a u određenom smislu. To je široko podržano u svim modernim preglednicima što ih čini sposobnima za provjeru autentičnosti na temelju Kerberos-a.

6. GSS API u usporedbi

GSS API prilično je učinkovit u pružanju sigurnosnih usluga aplikacijama na priključni način. Međutim, to nije jedini izbor da se to postigne na Javi.

Razumijemo što još Java nudi i kako se uspoređuju s GSS API-jem:

  • Java Secure Socket Extension (JSSE): JSSE je skup paketa u Javi koji implementira Secure Sockets Layer (SSL) za Javu. Pruža šifriranje podataka, provjeru autentičnosti klijenta i poslužitelja te integritet poruka. Za razliku od GSS API-ja, JSSE se za rad oslanja na infrastrukturu javnih ključeva (PKI). Stoga GSS API djeluje fleksibilnije i laganije od JSSE-a.
  • Java jednostavna razina provjere autentičnosti i sigurnosti (SASL): SASL je okvir za provjeru autentičnosti i sigurnost podataka za internetske protokole što ih razdvaja od specifičnih mehanizama provjere autentičnosti. Ovo je po opsegu slično GSS API-ju. Međutim, Java GSS ima ograničenu podršku za temeljne sigurnosne mehanizme putem dostupnih pružatelja usluga zaštite.

Sve u svemu, GSS API prilično je moćan u pružanju sigurnosnih usluga na agnostički način. Međutim, podrška za više sigurnosnih mehanizama u Javi to će dodatno usvojiti.

7. Zaključak

Da rezimiramo, u ovom uputstvu razumjeli smo osnove GSS API-ja kao sigurnosni okvir. Prošli smo kroz Java API za GSS i shvatili kako ih možemo iskoristiti. U tom smo procesu stvorili jednostavne klijentske i poslužiteljske komponente koje su vršile međusobnu provjeru autentičnosti i sigurno razmjenjivale podatke.

Nadalje, također smo vidjeli koje su praktične primjene GSS API-ja i koje su alternative dostupne u Javi.

Kao i uvijek, kod se može pronaći na GitHub-u.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

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