Úvod do Java SASL

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

V tomto tutoriáli si prejdeme základy jednoduchej autentifikácie a bezpečnostnej vrstvy (SASL). Pochopíme, ako Java podporuje prijatie SASL na zabezpečenie komunikácie.

V tomto procese použijeme jednoduchú komunikáciu medzi klientom a serverom a zabezpečíme ju pomocou protokolu SASL.

2. Čo je SASL?

SASL je rámec pre autentizáciu a bezpečnosť údajov v internetových protokoloch. Jeho cieľom je oddeliť internetové protokoly od konkrétnych mechanizmov autentifikácie. Postupne lepšie pochopíme časti tejto definície.

Potreba bezpečnosti v komunikácii je implicitná. Skúsme to chápať v kontexte komunikácie medzi klientom a serverom. Klient a server si zvyčajne vymieňajú údaje po sieti. Je nevyhnutné, aby si obidve strany navzájom dôverovali a mohli bezpečne odosielať údaje.

2.1. Kde SASL Pasovať?

V aplikácii môžeme používať SMTP na odosielanie e-mailov a používať LDAP na prístup k adresárovým službám. Ale každý z týchto protokolov môže podporovať iný autentifikačný mechanizmus, napríklad Digest-MD5 alebo Kerberos.

Čo ak by existoval spôsob, ako by protokoly mohli deklaratívne zameniť mechanizmy autentifikácie? To je presne miesto, kde prichádza na scénu SASL. Protokoly podporujúce SASL môžu vždy podporovať ktorýkoľvek z mechanizmov SASL.

Teda aplikácie môžu vyjednať vhodný mechanizmus a prijať to pre autentifikáciu a bezpečnú komunikáciu.

2.2. Ako to robí? SASL Práca?

Teraz, keď sme videli, kde sa SASL hodí do celkovej schémy zabezpečenia, pochopme, ako to funguje.

SASL je rámec reakcie na výzvu. Tu server vydá výzvu klientovi a klient na základe výzvy odošle odpoveď. Výzvou a odpoveďou sú bajtové polia ľubovoľnej dĺžky, a preto môžu niesť akékoľvek údaje špecifické pre daný mechanizmus.

Toto výmena môže pokračovať pre viac iterácií a nakoniec končí, keď server nevydá ďalšiu výzvu.

Ďalej môže klient a server dojednať následnú autentizáciu bezpečnostnej vrstvy. Celá nasledujúca komunikácia potom môže túto vrstvu zabezpečenia využiť. Upozorňujeme však, že niektoré z mechanizmov môžu podporovať iba autentifikáciu.

Je dôležité tu pochopiť, že SASL poskytuje iba rámec pre výmenu výziev a odpovedí údaje. Neuvádza sa v ňom nič o samotných údajoch ani o tom, ako sa vymieňajú. Tieto podrobnosti sú ponechané na aplikácie, ktoré prijímajú používanie protokolu SASL.

3. Podpora SASL v Jave

V Jave sú API, ktoré podpora vývoja aplikácií na strane klienta aj na strane servera so SASL. API nezávisí od samotných samotných mechanizmov. Aplikácie používajúce rozhranie Java SASL API si môžu zvoliť mechanizmus na základe požadovaných bezpečnostných funkcií.

3.1. Rozhranie Java SASL API

Kľúčové rozhrania, ktoré si treba všimnúť, ako súčasť balíka „javax.security.sasl“, sú SaslServer a SaslClient.

SaslServer predstavuje mechanizmus SASL na strane servera.

Pozrime sa, ako môžeme vytvoriť inštanciu a SaslServer:

SaslServer ss = Sasl.createSaslServer (mechanizmus, protokol, serverName, rekvizity, callbackHandler);

Používame továrenskú triedu Sasl na inštanciu SaslServer. Metóda createSaslServer akceptuje niekoľko parametrov:

  • mechanizmus - registrovaný názov IANA mechanizmu podporovaného SASL
  • protokol - názov protokolu, pre ktorý sa vykonáva autentifikácia
  • názov servera - úplný názov hostiteľa servera
  • rekvizity - sada vlastností používaných na konfiguráciu výmeny autentifikácie
  • callbackHandler - obslužný program spätného volania, ktorý má vybraný mechanizmus použiť na získanie ďalších informácií

Z uvedeného sú povinné iba prvé dva a zvyšok má povolenú hodnotu Null.

SaslClient predstavuje mechanizmus SASL na strane klienta. Pozrime sa, ako môžeme vytvoriť inštanciu a SaslClient:

SaslClient sc = Sasl.createSaslClient (mechanizmy, autorizačné ID, protokol, serverName, rekvizity, callbackHandler);

Opäť tu používame továrenskú triedu Sasl na inštanciu nášho SaslClient. Zoznam parametrov, ktoré createSaslClient prijíma je skoro rovnaké ako predtým.

Existujú však určité jemné rozdiely:

  • mechanizmy - tu je zoznam mechanizmov, z ktorých je možné vyskúšať
  • autorizačné ID - toto je identifikácia závislá od protokolu, ktorá sa má použiť na autorizáciu

Ostatné parametre sú si významom a ich voliteľnosťou podobné.

3.2. Poskytovateľ zabezpečenia Java SASL

Pod rozhraním Java SASL API sú skutočné mechanizmy, ktoré poskytujú bezpečnostné funkcie. The implementáciu týchto mechanizmov zabezpečujú poskytovatelia bezpečnosti zaregistrovaný v Java Cryptography Architecture (JCA).

V JCA môže byť registrovaných viac poskytovateľov zabezpečenia. Každý z nich môže podporovať jeden alebo viac mechanizmov SASL.

Java sa dodáva so spoločnosťou SunSASL ako poskytovateľom zabezpečenia, ktorý sa predvolene registruje ako poskytovateľ JCA. Môže to však byť odstránené alebo zmenené poradie u iných dostupných poskytovateľov.

Navyše, vždy je možné poskytnúť vlastného poskytovateľa zabezpečenia. Bude to od nás vyžadovať implementáciu rozhraní SaslClient a SaslServer. Pritom môžeme implementovať aj náš vlastný bezpečnostný mechanizmus!

4. SASL prostredníctvom príkladu

Teraz, keď sme videli, ako vytvoriť SaslServer a a SaslClient, je čas pochopiť, ako ich používať. Budeme vyvíjať komponenty klienta a servera. Tieto si budú vymieňať výzvy a reakcie iteratívne s cieľom dosiahnuť autentifikáciu. V našom jednoduchom príklade tu použijeme mechanizmus DIGEST-MD5.

4.1. Klient a Server CallbackHandler

Ako sme už videli skôr, musíme zabezpečiť implementáciu CallbackHandler do SaslServer a SaslClient. Teraz, CallbackHandler je jednoduché rozhranie, ktoré definuje jednu metódu - zvládnuť. Táto metóda prijíma pole Zavolaj späť.

Tu, Zavolaj späť predstavuje spôsob, ako môže bezpečnostný mechanizmus zhromažďovať autentifikačné údaje z volajúcej aplikácie. Napríklad bezpečnostný mechanizmus môže vyžadovať užívateľské meno a heslo. Je ich dosť veľa Zavolaj späť implementácie ako NameCallback a PasswordCallback k dispozícii na použitie.

Pozrime sa, ako môžeme definovať a CallbackHandler pre server, začať s:

public class ServerCallbackHandler implementuje CallbackHandler {@Override public void handle (Callback [] cbs) hodí IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (cb instanceof AuthorizeCallback) {AuthorizeCallback ac = (AuthorizeCallback) cb; // Vykonajte autorizačnú akciu špecifickú pre aplikáciu ac.setAuthorized (true); } else if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb; // Zhromažďujte používateľské meno spôsobom špecifickým pre aplikáciu nc.setName ("používateľské meno"); } else if (cb instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb; // Zhromažďujte heslo špecifickým spôsobom pre aplikáciu pc.setPassword ("heslo" .toCharArray ()); } else if (cb instanceof RealmCallback) {RealmCallback rc = (RealmCallback) cb; // Zhromažďujte údaje o sfére špecifickým spôsobom pre aplikáciu rc.setText ("myServer"); }}}}

Teraz sa pozrime na našu klientskú stránku Callbackhandler:

verejná trieda ClientCallbackHandler implementuje CallbackHandler {@Override public void handle (Callback [] cbs) hodí IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb; // Zhromažďujte používateľské meno spôsobom špecifickým pre aplikáciu nc.setName ("používateľské meno"); } else if (cb instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb; // Zhromažďujte heslo špecifickým spôsobom pre aplikáciu pc.setPassword ("heslo" .toCharArray ()); } else if (cb instanceof RealmCallback) {RealmCallback rc = (RealmCallback) cb; // Zhromažďujte údaje o sfére špecifickým spôsobom pre aplikáciu rc.setText ("myServer"); }}}}

Aby sme to objasnili, sme slučka cez Zavolaj späť pole a narábanie iba s konkrétnymi. Tie, ktoré musíme zvládnuť, sú špecifické pre používaný mechanizmus, ktorý je tu DIGEST-MD5.

4.2. SASL autentifikácia

Takže sme napísali nášho klienta a server CallbackHandler. Tiež sme vytvorili inštanciu SaslClient a SaslServer pre mechanizmus DIGEST-MD5.

Teraz je ten správny čas vidieť ich v akcii:

@Test public void givenHandlers_whenStarted_thenAutenticationWorks () vyvolá výzvu SaslException {byte []; byte [] odpoveď; challenge = saslServer.evaluateResponse (nový bajt [0]); response = saslClient.evaluateChallenge (výzva); challenge = saslServer.evaluateResponse (odpoveď); response = saslClient.evaluateChallenge (výzva); assertTrue (saslServer.isComplete ()); assertTrue (saslClient.isComplete ()); }

Pokúsme sa pochopiť, čo sa tu deje:

  • Najskôr náš klient dostane predvolenú výzvu od servera
  • Klient potom vyhodnotí výzvu a pripraví odpoveď
  • Táto výmena výziev a reakcií pokračuje ešte jeden cyklus
  • V tomto procese klient a server využívajú obslužné rutiny spätného volania na zhromažďovanie akýchkoľvek ďalších údajov potrebných podľa mechanizmu
  • Týmto sa končí naša autentifikácia, ale v skutočnosti to môže opakovať niekoľko cyklov

A typická výmena bajtových polí s výzvou a odpoveďou sa deje v sieti. Ale pre jednoduchosť sme predpokladali miestnu komunikáciu.

4.3. SASL bezpečná komunikácia

Ako sme už diskutovali, SASL je rámec schopný podporovať bezpečnú komunikáciu nad rámec autentifikácie. Avšak je to možné, iba ak to podporuje základný mechanizmus.

Najskôr si najskôr skontrolujme, či sa nám podarilo vyjednať bezpečnú komunikáciu:

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

Tu, QOP znamená kvalitu ochrany. O tom klient a server počas autentifikácie rokujú. Hodnota „auth-int“ označuje autentifikáciu a integritu. Zatiaľ čo hodnota „auth-conf“ označuje autentifikáciu, integritu a dôvernosť.

Keď budeme mať vrstvu zabezpečenia, môžeme ju využiť na zabezpečenie našej komunikácie.

Pozrime sa, ako môžeme zabezpečiť odchádzajúcu komunikáciu v klientovi:

byte [] odchádzajúce = "Baeldung" .getBytes (); byte [] secureOutgoing = saslClient.wrap (odchádzajúce, 0, odchádzajúce.dĺžka); // Poslať secureOutgoing na server cez sieť

Podobne server dokáže spracovať prichádzajúcu komunikáciu:

// Príjem secureIncoming od klienta cez sieťový bajt [] incoming = saslServer.unwrap (secureIncoming, 0, netIn.length); assertEquals ("Baeldung", nový reťazec (prichádzajúci, StandardCharsets.UTF_8));

5. SASL v skutočnom svete

Teraz teda spravodlivo rozumieme tomu, čo je SASL a ako ho používať v prostredí Java. Ale zvyčajne to nie je to, na čo nakoniec použijeme SASL, prinajmenšom v našej každodennej rutine.

Ako sme videli skôr, SASL je primárne určený pre protokoly ako LDAP a SMTP. Aj keď stále viac aplikácií a prichádza na rad so SASL - napríklad Kafka. Ako teda použijeme SASL na autentifikáciu v týchto službách?

Predpokladajme, že sme nakonfigurovali Kafka Broker pre SASL s PLAIN ako mechanizmus voľby. PLAIN jednoducho znamená, že sa autentifikuje pomocou kombinácie používateľského mena a hesla v obyčajnom texte.

Pozrime sa teraz, ako môžeme nakonfigurovať klienta Java tak, aby používal SASL / PLAIN na autentizáciu proti Kafka Broker.

Začíname jednoduchou konfiguráciou JAAS „kafka_jaas.conf“:

KafkaClient {org.apache.kafka.common.security.plain.PlainLoginModule required username = "username" password = "password"; };

Túto konfiguráciu JAAS využívame pri spúšťaní JVM:

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

Nakoniec musíme pridať niekoľko vlastností, ktoré odovzdáme našim inštanciám výrobcov a spotrebiteľov:

security.protocol = SASL_SSL sasl.mechanism = PLAIN

To je všetko. Toto je však len malá časť konfigurácií klientov Kafka. Okrem PLAIN podporuje Kafka aj autentifikáciu GSSAPI / Kerberos.

6. SASL v porovnaní

Aj keď SASL je celkom efektívny v poskytovaní mechanizmom neutrálneho spôsobu autentifikácie a zabezpečenia komunikácie klienta a servera. Avšak SASL nie je jediné dostupné riešenie v tejto súvislosti.

Samotná Java poskytuje ďalšie mechanizmy na dosiahnutie tohto cieľa. Stručne o nich diskutujeme a pochopíme, ako sa im darí proti SASL:

  • Rozšírenie Java Secure Socket Extension (JSSE): JSSE je sada balíkov v Jave, ktorá implementuje SSL (Secure Sockets Layer) pre Javu. Poskytuje šifrovanie údajov, autentifikáciu klienta a servera a integritu správ. Na rozdiel od SASL sa pri fungovaní JSSE spolieha na infraštruktúru verejných kľúčov (PKI). Preto je SASL flexibilnejší a ľahší ako JSSE.
  • Java GSS API (JGSS): JGGS je väzba jazyka Java pre rozhranie GSS-API (Generic Security Service Application Programming Interface).. GSS-API je štandard IETF pre aplikácie, ktoré majú prístup k bezpečnostným službám. V Jave je pod GSS-API jediným podporovaným mechanizmom Kerberos. Kerberos opäť vyžaduje, aby fungovala Kerberizovaná infraštruktúra. V porovnaní so SASL sú zatiaľ možnosti obmedzené a ťažké.

Celkovo je SASL veľmi ľahký rámec a prostredníctvom zásuvných mechanizmov ponúka širokú škálu bezpečnostných funkcií. Aplikácie využívajúce SASL majú veľa možností pri implementácii správnej sady bezpečnostných funkcií, podľa potreby.

7. Záver

Ak to zhrnieme, v tomto návode sme pochopili základy rámca SASL, ktorý poskytuje autentifikáciu a bezpečnú komunikáciu. Diskutovali sme tiež o API dostupných v Jave na implementáciu SASL na strane klienta a servera.

Videli sme, ako používať bezpečnostný mechanizmus prostredníctvom poskytovateľa JCA. Nakoniec sme hovorili aj o využití SASL pri práci s rôznymi protokolmi a aplikáciami.

Ako vždy, kód nájdete na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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