Uvod u Java SASL

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 uputstvu proći ćemo kroz osnove jednostavne provjere autentičnosti i sigurnosnog sloja (SASL). Razumjet ćemo kako Java podržava usvajanje SASL-a za zaštitu komunikacije.

U tom ćemo procesu koristiti jednostavnu komunikaciju klijenta i poslužitelja, osiguravajući je s SASL-om.

2. Što je SASL?

SASL je okvir za provjeru autentičnosti i sigurnost podataka u internetskim protokolima. Cilj mu je razdvojiti internetske protokole od specifičnih mehanizama provjere autentičnosti. Dijelove ove definicije bolje ćemo razumjeti dok idemo dalje.

Potreba za sigurnošću u komunikaciji je implicitna. Pokušajmo shvatite to u kontekstu komunikacije klijenta i poslužitelja. Klijent i poslužitelj obično razmjenjuju podatke putem mreže. Nužno je da obje strane mogu vjerovati jedna drugoj i sigurno slati podatke.

2.1. Gdje je SASL Uklapati se?

U aplikaciji možemo koristiti SMTP za slanje e-pošte i LDAP za pristup uslugama direktorija. Ali svaki od ovih protokola može podržavati drugi mehanizam provjere autentičnosti, poput Digest-MD5 ili Kerberos.

Što ako postoji način da protokoli deklarativnije zamijene mehanizme provjere autentičnosti? Upravo tu SASL dolazi na scenu. Protokoli koji podržavaju SASL uvijek mogu podržati bilo koji od SASL mehanizama.

Stoga, aplikacije mogu pregovarati o prikladnom mehanizmu i usvojite to za provjeru autentičnosti i sigurnu komunikaciju.

2.2. Kako SASL Raditi?

Sad, kad smo vidjeli gdje se SASL uklapa u cjelokupnu shemu sigurnosti, shvatimo kako to funkcionira.

SASL je okvir izazov-odgovor. Ovdje poslužitelj klijentu izda izazov, a klijent šalje odgovor na temelju izazova. Izazov i odgovor su bajt-nizovi proizvoljne duljine i, prema tome, mogu nositi bilo koje podatke specifične za mehanizam.

Ovaj razmjena se može nastaviti za više ponavljanja i konačno završava kad poslužitelj ne izda daljnji izazov.

Nadalje, klijent i poslužitelj mogu pregovarati o sigurnosnom sloju nakon provjere autentičnosti. Sva sljedeća komunikacija tada može iskoristiti ovaj sigurnosni sloj. Međutim, imajte na umu da neki od mehanizama mogu podržavati samo provjeru autentičnosti.

Ovdje je važno razumjeti taj SASL samo pruža okvir za razmjenu izazova i odgovora podaci. Ne spominje se ništa o samim podacima niti o njihovoj razmjeni. Ti detalji ostaju za prijave koje usvajaju upotrebu SASL-a.

3. SASL podrška u Javi

U Javi postoje API-ji koji podrška razvoju aplikacija na strani klijenta i na poslužitelju sa SASL-om. API ne ovisi o stvarnim mehanizmima. Aplikacije koje koriste Java SASL API mogu odabrati mehanizam na temelju potrebnih sigurnosnih značajki.

3.1. Java SASL API

Ključna sučelja koja treba primijetiti, kao dio paketa "javax.security.sasl", jesu SaslServer i SaslClient.

SaslServer predstavlja mehanizam na strani poslužitelja SASL-a.

Pogledajmo kako možemo napraviti instancu a SaslServer:

SaslServer ss = Sasl.createSaslServer (mehanizam, protokol, Ime poslužitelja, rekviziti, callbackHandler);

Koristimo tvorničku klasu Sasl instancirati SaslServer. Metoda createSaslServer prihvaća nekoliko parametara:

  • mehanizam - IANA registrirani naziv SASL podržanog mehanizma
  • protokol - naziv protokola za koji se vrši provjera autentičnosti
  • ime poslužitelja - potpuno kvalificirano ime hosta poslužitelja
  • rekviziti - skup svojstava koja se koriste za konfiguriranje razmjene provjere autentičnosti
  • callbackHandler - rukovatelj povratnim pozivom koji odabrani mehanizam koristi za dobivanje dodatnih informacija

Od navedenog, samo su prva dva obavezna, a ostalo je za poništavanje.

SaslClient predstavlja mehanizam SASL-a na strani klijenta. Pogledajmo kako možemo napraviti instancu a SaslClient:

SaslClient sc = Sasl.createSaslClient (mehanizmi, authId, protokol, ServerName, rekviziti, callbackHandler);

I ovdje koristimo tvorničku klasu Sasl za instanciranje našeg SaslClient. Popis parametara koji createSaslClient prihvaća gotovo je isto kao i prije.

Međutim, postoje neke suptilne razlike:

  • mehanizmi - ovdje je ovo popis mehanizama iz kojih treba pokušati
  • autorizacijaId - ovo je identifikacija ovisna o protokolu koja će se koristiti za autorizaciju

Ostali su parametri slični po značenju i po svojoj izbornosti.

3.2. Javni davatelj sigurnosnih usluga SASL

Ispod Java SASL API-a nalaze se stvarni mehanizmi koji pružaju sigurnosne značajke. The provedbu ovih mehanizama pružaju pružatelji usluga sigurnosti registrirana kod Java Cryptography Architecture (JCA).

Pri JCA može biti registrirano više pružatelja sigurnosti. Svaka od ovih može podržavati jedan ili više SASL mehanizama.

Java se isporučuje s SunSASL-om kao pružateljem zaštite, koji se prema zadanim postavkama registrira kao JCA davatelj. Međutim, ovo se može ukloniti ili preurediti kod bilo kojeg drugog dostupnog pružatelja usluga.

Štoviše, uvijek je moguće pružiti prilagođenog davatelja sigurnosnih usluga. To će zahtijevati da implementiramo sučelja SaslClient i SaslServer. Pritom možemo primijeniti i naš prilagođeni sigurnosni mehanizam!

4. SASL kroz primjer

Sad kad smo vidjeli kako stvoriti SaslServer i a SaslClient, vrijeme je da shvatimo kako ih koristiti. Razvit ćemo komponente klijenta i poslužitelja. Oni će iterativno razmijeniti izazov i odgovor kako bi postigli provjeru autentičnosti. U ovom ćemo jednostavnom primjeru upotrijebiti DIGEST-MD5 mehanizam.

4.1. Klijent i poslužitelj CallbackHandler

Kao što smo vidjeli ranije, moramo osigurati implementacije CallbackHandler do SaslServer i SaslClient. Sada, CallbackHandler je jednostavno sučelje koje definira jednu metodu - drška. Ova metoda prihvaća niz Uzvratiti poziv.

Ovdje, Uzvratiti poziv predstavlja način za sigurnosni mehanizam za prikupljanje podataka za provjeru autentičnosti iz pozivne aplikacije. Na primjer, sigurnosni mehanizam može zahtijevati korisničko ime i lozinku. Ima ih podosta Uzvratiti poziv implementacije poput NameCallback i PasswordCallback dostupno za upotrebu.

Pogledajmo kako možemo definirati a CallbackHandler za poslužitelj, za početak:

javna klasa ServerCallbackHandler implementira CallbackHandler {@Override public void handle (Callback [] cbs) baca IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (cb instanceof AuthorizeCallback) {AuthorizeCallback ac = (AuthorizeCallback ac = (Authorizecallback ac = (AuthorizeCallback ac = (AuthorizeCallback ac = (Authorizecallback ac = 0 // Izvršite radnju autorizacije specifičnu za aplikaciju ac.setAuthorized (true); } else if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb; // Prikupljanje korisničkog imena na način specifičan za aplikaciju nc.setName ("korisničko ime"); } else if (cb primjer PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb; // Prikupljanje lozinke na način specifičan za aplikaciju pc.setPassword ("lozinka" .toCharArray ()); } else if (cb instanceof RealmCallback) {RealmCallback rc = (RealmCallback) cb; // Prikupljanje podataka o području na način specifičan za aplikaciju rc.setText ("myServer"); }}}}

Sada, da vidimo našu klijentsku stranu Povratnik poziva:

javna klasa ClientCallbackHandler implementira CallbackHandler {@Override public void handle (Callback [] cbs) baca IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb; // Prikupljanje korisničkog imena na način specifičan za aplikaciju nc.setName ("korisničko ime"); } else if (cb primjer PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb; // Prikupljanje lozinke na način specifičan za aplikaciju pc.setPassword ("lozinka" .toCharArray ()); } else if (cb instanceof RealmCallback) {RealmCallback rc = (RealmCallback) cb; // Prikupljanje podataka o području na način specifičan za aplikaciju rc.setText ("myServer"); }}}}

Da pojasnimo, mi smo petljajući kroz Uzvratiti poziv niz i rukovanje samo određenim. Oni s kojima moramo rukovati specifični su za mehanizam koji se koristi, a to je DIGEST-MD5 ovdje.

4.2. SASL autentifikacija

Dakle, napisali smo našeg klijenta i poslužitelja CallbackHandler. Također smo napravili instancu SaslClient i SaslServer za DIGEST-MD5 mehanizam.

Sada je vrijeme da ih vidite na djelu:

@Test public void givenHandlers_whenStarted_thenAutenticationWorks () baca izazov SaslException {byte []; bajt [] odgovor; challenge = saslServer.evaluateResponse (novi bajt [0]); odgovor = saslClient.evaluateChallenge (izazov); challenge = saslServer.evaluateResponse (odgovor); odgovor = saslClient.evaluateChallenge (izazov); assertTrue (saslServer.isComplete ()); assertTrue (saslClient.isComplete ()); }

Pokušajmo shvatiti što se ovdje događa:

  • Prvo, naš klijent dobiva zadani izazov od poslužitelja
  • Klijent zatim procjenjuje izazov i priprema odgovor
  • Ova razmjena izazov-odgovor nastavlja se još jedan ciklus
  • U tom procesu klijent i poslužitelj koriste rukovatelje povratnim pozivima kako bi prikupili sve dodatne podatke prema potrebi mehanizma
  • Ovim je završena naša autentifikacija ovdje, ali u stvarnosti se može ponavljati u više ciklusa

A tipična razmjena bajtova nizova izazova i odgovora događa se preko mreže. Ali, ovdje smo radi jednostavnosti pretpostavili lokalnu komunikaciju.

4.3. SASL sigurna komunikacija

Kao što smo ranije razgovarali, SASL je okvir sposoban podržati sigurnu komunikaciju izvan samo provjere autentičnosti. Međutim, to je moguće samo ako ga podržava osnovni mehanizam.

Prvo, provjerimo jesmo li uspjeli pregovarati o sigurnoj komunikaciji:

Niz qop = (Niz) saslClient.getNegotiatedProperty (Sasl.QOP); assertEquals ("auth-conf", qop);

Ovdje, QOP označava kvalitetu zaštite. To je nešto o čemu klijent i poslužitelj dogovaraju tijekom provjere autentičnosti. Vrijednost "auth-int" označava provjeru autentičnosti i cjelovitost. Iako vrijednost "auth-conf" ukazuje na autentičnost, integritet i povjerljivost.

Jednom kada imamo sigurnosni sloj, možemo ga iskoristiti za zaštitu naše komunikacije.

Pogledajmo kako možemo osigurati odlaznu komunikaciju u klijentu:

bajt [] odlazni = "Baeldung" .getBytes (); bajt [] secureOutgoing = saslClient.wrap (odlazni, 0, odlazni.dužina); // Pošaljite secureOutgoing poslužitelju preko mreže

I, slično tome, poslužitelj može obrađivati ​​dolaznu komunikaciju:

// primamo secureIncoming od klijenta preko mrežne bajt [] incoming = saslServer.unwrap (secureIncoming, 0, netIn.length); assertEquals ("Baeldung", novi niz (dolazni, StandardCharsets.UTF_8));

5. SASL u stvarnom svijetu

Dakle, sada dobro razumijemo što je SASL i kako ga koristiti u Javi. Ali, obično to nije ono zbog čega ćemo na kraju koristiti SASL, barem u svojoj svakodnevnoj rutini.

Kao što smo vidjeli ranije, SASL je prvenstveno namijenjen protokolima poput LDAP-a i SMTP-a. Iako, sve više i više aplikacija dolazi na SASL - na primjer, Kafka. Pa, kako koristimo SASL za autentifikaciju s takvim uslugama?

Pretpostavimo da smo konfigurirali Kafka Broker za SASL s PLAIN-om kao mehanizmom izbora. PLAIN jednostavno znači da provjerava autentičnost pomoću kombinacije korisničkog imena i lozinke u običnom tekstu.

Pogledajmo sada kako možemo konfigurirati Java klijenta da koristi SASL / PLAIN za autentifikaciju protiv Kafka Brokera.

Započinjemo pružanjem jednostavne JAAS konfiguracije, "kafka_jaas.conf":

KafkaClient {org.apache.kafka.common.security.plain.PlainLoginModule potrebno korisničko ime = "korisničko ime" lozinka = "lozinka"; };

Koristimo ovu JAAS konfiguraciju prilikom pokretanja JVM-a:

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

Na kraju, moramo dodati nekoliko svojstava koja ćemo proslijediti našim proizvođačima i potrošačima:

security.protocol = SASL_SSL sasl.mechanism = PROSTOR

To je sve. Ovo je ipak samo mali dio konfiguracija klijenta Kafke. Osim PLAIN-a, Kafka također podržava GSSAPI / Kerberos za provjeru autentičnosti.

6. SASL u usporedbi

Iako je SASL prilično učinkovit u pružanju mehanizma neutralnog načina autentifikacije i osiguranja komunikacije klijenta i poslužitelja. Međutim, SASL nije jedino dostupno rješenje s tim u vezi.

Java sama pruža druge mehanizme za postizanje ovog cilja. Kratko ćemo razgovarati o njima i shvatit ćemo kako stoje protiv SASL-a:

  • 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 SASL-a, JSSE se za rad oslanja na infrastrukturu javnih ključeva (PKI). Stoga SASL djeluje fleksibilnije i lakše od JSSE-a.
  • Java GSS API (JGSS): JGGS je obvezujući jezik Java za sučelje za programiranje generičke sigurnosne usluge (GSS-API). GSS-API je IETF standard za aplikacije za pristup sigurnosnim uslugama. U Javi je pod GSS-API jedini podržani mehanizam Kerberos. Kerberos ponovno zahtijeva kerberiziranu infrastrukturu za rad. U usporedbi sa SASL-om, ovdje još nema izbora, ograničenih i teških.

Sve u svemu, SASL je vrlo lagan okvir i nudi širok spektar sigurnosnih značajki putem priključnih mehanizama. Aplikacije koje usvajaju SASL imaju puno izbora za implementaciju ispravnog skupa sigurnosnih značajki, ovisno o potrebi.

7. Zaključak

Da rezimiramo, u ovom smo tutorijalu razumjeli osnove SASL okvira koji pruža provjeru autentičnosti i sigurnu komunikaciju. Također smo razgovarali o API-jevima dostupnim u Javi za implementaciju SASL-a na strani klijenta i poslužitelja.

Vidjeli smo kako koristiti sigurnosni mehanizam putem JCA davatelja usluga. Na kraju smo razgovarali i o upotrebi SASL-a u radu s različitim protokolima i aplikacijama.

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