Bevezetés a Java SASL-be

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben az oktatóanyagban áttekintjük az egyszerű hitelesítés és biztonsági réteg (SASL) alapjait. Megértjük, hogy a Java hogyan támogatja az SASL elfogadását a kommunikáció biztonsága érdekében.

Ennek során egyszerű kliens és szerver kommunikációt fogunk használni, biztonságossá téve azt SASL-lel.

2. Mi az SASL?

A SASL az a hitelesítés és az adatbiztonság kerete az internetes protokollokban. Célja az internetes protokollok elválasztása a meghatározott hitelesítési mechanizmusoktól. Jobban meg fogjuk érteni ennek a meghatározásnak egyes részeit, miközben elmegyünk.

A kommunikáció biztonságának szükségessége implicit. Próbáljuk meg értse meg ezt az ügyfél és szerver kommunikáció kontextusában. Az ügyfél és a szerver általában adatokat cserél a hálózaton. Elengedhetetlen, hogy mindkét fél megbízhasson egymásban és biztonságosan küldhessen adatokat.

2.1. Hol SASL Beilleszkedni?

Egy alkalmazásban használhatunk SMTP-t e-mailek küldésére, az LDAP-t pedig a címtárszolgáltatások elérésére. De mindegyik protokoll támogathat egy másik hitelesítési mechanizmust, például a Digest-MD5 vagy a Kerberos.

Mi lenne, ha lenne mód arra, hogy a protokollok deklaratívabban cseréljék a hitelesítési mechanizmusokat? Pontosan itt jön a képbe a SASL. Az SASL-t támogató protokollok változatlanul támogathatják bármelyik SASL-mechanizmust.

Ennélfogva, az alkalmazások tárgyalhatnak egy megfelelő mechanizmusról és fogadja el ezt a hitelesítés és a biztonságos kommunikáció érdekében.

2.2. Hogyan működik SASL Munka?

Most, hogy láttuk, hogy az SASL hol helyezkedik el az általános biztonsági rendszerben, értsük meg, hogyan működik.

SASL egy kihívás-válasz keretrendszer. Itt a kiszolgáló kihívást ad ki az ügyfélnek, és az ügyfél választ küld a kihívás alapján. A kihívás és a válasz tetszőleges hosszúságú bájt tömbök, és így bármilyen mechanizmus-specifikus adatot hordozhatnak.

Ez csere folytatódhat többszörös ismétlésekkel és végül akkor ér véget, amikor a szerver nem jelent további kihívást.

Ezenkívül az ügyfél és a szerver tárgyalhat egy biztonsági réteg utólagos hitelesítéséről. Minden későbbi kommunikáció kihasználhatja ezt a biztonsági réteget. Azonban vegye figyelembe, hogy egyes mechanizmusok csak a hitelesítést támogatják.

Fontos itt megérteni, hogy a SASL csak keretet nyújt a kihívás és a válasz cseréjéhez adat. Nem említ semmit sem az adatokról, sem azok cseréjéről. Ezeket a részleteket az SASL használatát átvevő alkalmazások számára hagyjuk.

3. SASL támogatás Java-ban

A Java-ban vannak olyan API-k, amelyek támogatja mind az ügyféloldali, mind a szerveroldali alkalmazások fejlesztését a SASL-lel. Az API nem függ a tényleges mechanizmusoktól. A Java SASL API-t használó alkalmazások a szükséges biztonsági funkciók alapján választhatnak mechanizmust.

3.1. Java SASL API

A „javax.security.sasl” csomag részeként észre kell venni a legfontosabb interfészeket SaslServer és SaslClient.

SaslServer a SASL kiszolgálóoldali mechanizmusát jelenti.

Lássuk, hogyan tudjuk példányosítani a SaslServer:

SaslServer ss = Sasl.createSaslServer (mechanizmus, protokoll, szerverNév, kellékek, callbackHandler);

A gyári osztályt használjuk Sasl hogy példányosítson SaslServer. A módszer, a metódus createSaslServer több paramétert fogad el:

  • gépezet - egy SASL által támogatott mechanizmus IANA bejegyzett neve
  • jegyzőkönyv - annak a protokollnak a neve, amelyhez hitelesítést végeznek
  • szerver név - a szerver teljesen minősített hosztneve
  • kellékek - a hitelesítési csere konfigurálásához használt tulajdonságok összessége
  • callbackHandler - visszahívás-kezelő, amelyet a kiválasztott mechanizmus használ, további információk megszerzéséhez

A fentiek közül csak az első kettő kötelező, a többi pedig érvénytelen.

SaslClient a SASL ügyféloldali mechanizmusát jelenti. Lássuk, hogyan tudunk példányt adni a SaslClient:

SaslClient sc = Sasl.createSaslClient (mechanizmusok, authenticationId, protokoll, serverName, props, callbackHandler);

Itt is a gyári osztályt használjuk Sasl hogy példázza a mi SaslClient. A paraméterek listája, amely createSaslClient elfogadja nagyjából ugyanaz, mint korábban.

Van azonban néhány finom különbség:

  • mechanizmusok - itt van egy lista a kipróbálandó mechanizmusokról
  • autorizációs azonosító - ez egy protokollfüggő azonosítás, amelyet az engedélyezéshez kell használni

A többi paraméter jelentése és opciója hasonló.

3.2. Java SASL biztonsági szolgáltató

A Java SASL API alatt találhatók a tényleges mechanizmusok, amelyek biztosítják a biztonsági funkciókat. A E mechanizmusok végrehajtását a biztonsági szolgáltatók biztosítják regisztrált a Java Cryptography Architecture (JCA).

Több biztonsági szolgáltató is lehet regisztrálva a JCA-nál. Ezek mindegyike támogathat egy vagy több SASL mechanizmust.

A Java biztonsági szolgáltatóként a SunSASL szolgáltatást szállítja, amely alapértelmezés szerint JCA szolgáltatóként regisztrálódik. Ezt azonban eltávolíthatjuk vagy átrendezhetjük bármely más elérhető szolgáltatóval.

Sőt, mindig az egyedi biztonsági szolgáltató biztosítása. Ehhez meg kell valósítanunk az interfészeket SaslClient és SaslServer. Ezzel megvalósíthatjuk egyedi biztonsági mechanizmusunkat is!

4. SASL egy példán keresztül

Most, hogy láttuk, hogyan lehet a SaslServer és a SaslClient, itt az ideje megérteni, hogyan kell használni őket. Fejleszteni fogjuk kliens és szerver összetevőket. Ezek iteratív módon kicserélik a kihívást és a választ a hitelesítés elérése érdekében. Itt a DIGEST-MD5 mechanizmust használjuk fel egyszerű példánkban.

4.1. Kliens és szerver CallbackHandler

Amint azt korábban láthattuk, biztosítanunk kell a CallbackHandler nak nek SaslServer és SaslClient. Most, CallbackHandler egy egyszerű felület, amely egyetlen módszert határoz meg - fogantyú. Ez a módszer elfogadja a Visszahív.

Itt, Visszahív bemutatja a biztonsági mechanizmus módját, hogy hitelesítési adatokat gyűjtsön a hívó alkalmazásból. Például egy biztonsági mechanizmushoz szükség lehet felhasználónévre és jelszóra. Elég sok van Visszahív megvalósítások, mint NameCallback és PasswordCallback használható.

Lássuk, hogyan definiálhatjuk a CallbackHandler a kiszolgáló számára, kezdje:

public class ServerCallbackHandler végrehajtja a CallbackHandler {@Orride public void hand (Callback [] cbs) dobja az IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (cb instanceof AuthorizeCallback) {AuthorizeCallback ac = (AuthorizeCallback) cb; // Alkalmazás-specifikus engedélyezési művelet végrehajtása ac.setAuthorized (true); } else if (cb NameCallback példánya) {NameCallback nc = (NameCallback) cb; // Gyűjtse össze a felhasználónevet alkalmazás-specifikus módon nc.setName ("felhasználónév"); } else if (a PasswordCallback cb példánya) {PasswordCallback pc = (PasswordCallback) cb; // Jelszó gyűjtése alkalmazás-specifikus módon pc.setPassword ("jelszó" .toCharArray ()); } else if (RealmCallback cb példánya) {RealmCallback rc = (RealmCallback) cb; // Gyűjtse a birodalom adatait alkalmazás-specifikus módon rc.setText ("myServer"); }}}}

Most nézzük meg a Visszahívó:

public class ClientCallbackHandler hajtja végre a CallbackHandler {@Orride public void hand (Callback [] cbs) dobja az IOException, UnsupportedCallbackException {for (Callback cb: cbs) {if (NameCallback cb példánya) {NameCallback nc = (NameCallback) cb; // Gyűjtse össze a felhasználónevet alkalmazás-specifikus módon nc.setName ("felhasználónév"); } else if (a PasswordCallback cb példánya) {PasswordCallback pc = (PasswordCallback) cb; // Jelszó gyűjtése alkalmazás-specifikus módon pc.setPassword ("jelszó" .toCharArray ()); } else if (RealmCallback cb példánya) {RealmCallback rc = (RealmCallback) cb; // Gyűjtse a birodalom adatait alkalmazás-specifikus módon rc.setText ("myServer"); }}}}

Hogy tisztázzuk, mi vagyunk végighurkolni a Visszahív tömb és csak meghatározottak kezelése. Azokkal, amelyeket kezelnünk kell, a használt mechanizmusra jellemző, ami itt a DIGEST-MD5.

4.2. SASL-hitelesítés

Tehát megírtuk kliensünket és szerverünket CallbackHandler. Mi is példáztunk SaslClient és SaslServer a DIGEST-MD5 mechanizmushoz.

Itt az ideje, hogy cselekvés közben lássuk őket:

@Test public void givenHandlers_whenStarted_thenAutenticationWorks () SaslException {byte [] kihívást dob; bájt [] válasz; challenge = saslServer.evaluateResponse (új bájt [0]); válasz = saslClient.evaluateChallenge (kihívás); kihívás = saslServer.evaluateResponse (válasz); válasz = saslClient.evaluateChallenge (kihívás); assertTrue (saslServer.isComplete ()); assertTrue (saslClient.isComplete ()); }

Próbáljuk megérteni, mi történik itt:

  • Először az ügyfelünk kapja meg az alapértelmezett kihívást a szervertől
  • Ezután az ügyfél értékeli a kihívást és előkészíti a választ
  • Ez a kihívás-válasz csere még egy ciklusig folytatódik
  • Ennek során az ügyfél és a kiszolgáló visszahívás-kezelőt használ fel a mechanizmus által igényelt további adatok gyűjtésére
  • Ez itt lezárja a hitelesítésünket, de a valóságban több cikluson keresztül is iterálhat

A a kihívás és a válasz bájt tömbök tipikus cseréje a hálózaton keresztül történik. De itt az egyszerűség kedvéért feltételeztük a helyi kommunikációt.

4.3. SASL biztonságos kommunikáció

Amint arról korábban beszéltünk, az SASL egy olyan keret, amely képes a biztonságos kommunikáció támogatására a hitelesítésen túl. Azonban, ez csak akkor lehetséges, ha az alapul szolgáló mechanizmus támogatja.

Először ellenőrizzük először, hogy sikerült-e tárgyalnunk egy biztonságos kommunikációról:

Karakterlánc qop = (String) saslClient.getNegotiatedProperty (Sasl.QOP); assertEquals ("auth-conf", qop);

Itt, A QOP a védelem minőségét jelenti. Ezt az ügyfél és a szerver tárgyalja a hitelesítés során. Az „auth-int” értéke a hitelesítést és az integritást jelzi. Míg az „auth-conf” értéke hitelesítést, integritást és titoktartást jelez.

Miután rendelkezünk biztonsági réteggel, ezt felhasználhatjuk kommunikációnk biztonsága érdekében.

Nézzük meg, hogyan tudjuk biztosítani a kimenő kommunikációt az ügyfélben:

byte [] outgoing = "Baeldung" .getBytes (); byte [] secureOutgoing = saslClient.wrap (kimenő, 0, kimenő.hossz); // SecureOutgoing küldése a szerverre a hálózaton keresztül

És hasonló módon a szerver képes feldolgozni a bejövő kommunikációt:

// secureIncoming fogadása az ügyféltől a hálózati bájton keresztül [] bejövő = saslServer.unwrap (secureIncoming, 0, netIn.length); assertEquals ("Baeldung", új String (bejövő, StandardCharsets.UTF_8));

5. SASL a való világban

Tehát most már tisztában vagyunk azzal, hogy mi a SASL, és hogyan kell használni a Java-ban. De általában nem erre fogjuk használni a SASL-t, legalábbis a mindennapjainkban.

Ahogy korábban láttuk, A SASL elsősorban olyan protokollok számára készült, mint az LDAP és az SMTP. Bár egyre több alkalmazás érkezik a SASL-lel - például a Kafka. Tehát hogyan használjuk a SASL-t az ilyen szolgáltatásokkal történő hitelesítéshez?

Tegyük fel, hogy a Kafka Brokert beállítottuk a SASL számára a PLAIN-nal, mint választott mechanizmust. A PLAIN egyszerűen azt jelenti, hogy a felhasználónév és a jelszó egyszerű szöveges kombinációjával hitelesít.

Most nézzük meg, hogyan konfigurálhatunk egy Java klienst a SASL / PLAIN használatára a Kafka Broker elleni hitelesítéshez.

Kezdjük egy egyszerű JAAS konfigurációval, a “kafka_jaas.conf”:

KafkaClient {org.apache.kafka.common.security.plain.PlainLoginModule szükséges felhasználónév = "felhasználónév" jelszó = "jelszó"; };

Ezt a JAAS konfigurációt használjuk a JVM indítása közben:

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

Végül hozzá kell adnunk néhány tulajdonságot, amelyeket átadhatunk termelői és fogyasztói példányainknak:

security.protocol = SASL_SSL sasl.mechanizmus = PLAIN

Ennyi van benne. Ez azonban csak egy kis része a Kafka kliens konfigurációinak. A PLAIN mellett a Kafka is támogatja a GSSAPI / Kerberos hitelesítést.

6. SASL összehasonlításban

Bár a SASL elég hatékony az ügyfél- és szerver-kommunikáció hitelesítésének és biztonságának mechanizmus-semleges módjának biztosításában. Azonban, A SASL nem az egyetlen elérhető megoldás ebben a tekintetben.

A Java maga más mechanizmusokat biztosít e cél elérésére. Röviden megbeszéljük őket, és megértjük, hogy áll a SASL ellen:

  • Java Secure Socket kiterjesztés (JSSE): A JSSE a Java csomagcsomagja, amely a Secure Sockets Layer (SSL) Java-t valósítja meg. Biztosítja az adatok titkosítását, az ügyfél és a szerver hitelesítését, valamint az üzenet integritását. A SASL-től eltérően a JSSE egy nyilvános kulcsú infrastruktúrára (PKI) támaszkodik. Ezért a SASL rugalmasabb és könnyebb, mint a JSSE.
  • Java GSS API (JGSS): A JGGS a Java nyelvi kötés a Generic Security Service Application Programming Interface (GSS-API) számára. A GSS-API egy IETF szabvány a biztonsági szolgáltatások elérésére szolgáló alkalmazások számára. A Java-ban a GSS-API alatt a Kerberos az egyetlen támogatott mechanizmus. A Kerberos működéséhez ismét Kerberised infrastruktúra szükséges. A SASL-hez képest itt még korlátozottak és nehézek a választási lehetőségek.

Összességében elmondható, hogy a SASL nagyon könnyű keretrendszer, és plug-in mechanizmusok révén a biztonsági funkciók széles választékát kínálja. Az SASL-t alkalmazó alkalmazásoknak a szükséglet függvényében sok választási lehetőségük van a megfelelő biztonsági funkciók megvalósításában.

7. Következtetés

Összefoglalva, ebben az oktatóanyagban megértettük a hitelesítést és biztonságos kommunikációt biztosító SASL keretrendszer alapjait. Megvitattuk a Java-ban elérhető API-kat is a SASL kliens- és szerveroldalának megvalósításához.

Láttuk, hogyan kell egy biztonsági mechanizmust használni egy JCA szolgáltatón keresztül. Végül beszéltünk az SASL használatáról a különféle protokollokkal és alkalmazásokkal való munkában.

Mint mindig, a kód megtalálható a GitHubon.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT