Pengenalan SASL Java

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membahas asas-asas Simple Authentication and Security Layer (SASL). Kami akan memahami bagaimana Java menyokong penggunaan SASL untuk mendapatkan komunikasi.

Dalam prosesnya, kami akan menggunakan komunikasi pelanggan dan pelayan yang mudah, selamatkannya dengan SASL.

2. Apa itu SASL ?

SASL adalah kerangka kerja untuk pengesahan dan keselamatan data dalam protokol Internet . Ini bertujuan untuk memutuskan protokol internet dari mekanisme pengesahan tertentu. Kami akan lebih memahami bahagian-bahagian definisi ini semasa kami mengikutinya.

Keperluan keselamatan dalam komunikasi adalah tersirat. Mari cuba memahami ini dalam konteks komunikasi pelanggan dan pelayan . Biasanya data pertukaran pelanggan dan pelayan melalui rangkaian. Adalah mustahak bahawa kedua-dua pihak boleh saling mempercayai dan menghantar data dengan selamat.

2.1. Di mana SASL Sesuai?

Dalam aplikasi, kami mungkin menggunakan SMTP untuk mengirim e-mel dan menggunakan LDAP untuk mengakses perkhidmatan direktori. Tetapi setiap protokol ini mungkin menyokong mekanisme pengesahan lain, seperti Digest-MD5 atau Kerberos.

Bagaimana jika ada cara agar protokol menukar mekanisme pengesahan lebih deklaratif? Di sinilah SASL masuk ke dalam gambar. Protokol yang menyokong SASL selalu dapat menyokong mana-mana mekanisme SASL.

Oleh itu, aplikasi dapat merundingkan mekanisme yang sesuai dan menggunakannya untuk pengesahan dan komunikasi yang selamat.

2.2. Bagaimana SASL Berfungsi?

Sekarang, setelah kita melihat di mana SASL sesuai dengan keseluruhan skema keselamatan, mari kita fahami bagaimana ia berfungsi.

SASL adalah kerangka tindak balas cabaran . Di sini, pelayan memberikan cabaran kepada klien, dan klien menghantar respons berdasarkan cabaran tersebut. Cabaran dan tindak balas adalah susunan bait panjang sewenang-wenang dan, dengan itu, dapat membawa data khusus mekanisme.

Ini pertukaran boleh terus untuk beberapa lelaran dan akhirnya berakhir apabila isu pelayan cabaran-cari lagi.

Selanjutnya, pelanggan dan pelayan dapat merundingkan lapisan keselamatan selepas pengesahan. Semua komunikasi seterusnya dapat memanfaatkan lapisan keselamatan ini. Namun, perhatikan bahawa beberapa mekanisme hanya dapat menyokong pengesahan.

Penting untuk difahami di sini bahawa SASL hanya menyediakan kerangka untuk pertukaran data cabaran dan tindak balas . Ia tidak menyebut apa-apa mengenai data itu sendiri atau bagaimana data tersebut ditukar. Maklumat tersebut dibiarkan untuk aplikasi yang menggunakan SASL.

3. Sokongan SASL di Java

Ada API di Java yang mendukung pengembangan aplikasi sisi klien dan sisi pelayan dengan SASL. API tidak bergantung pada mekanisme sebenar itu sendiri. Aplikasi yang menggunakan Java SASL API dapat memilih mekanisme berdasarkan fitur keselamatan yang diperlukan.

3.1. API SASL Java

Antara muka utama yang perlu diperhatikan, sebagai sebahagian daripada pakej "javax.security.sasl", adalah SaslServer dan SaslClient .

SaslServer mewakili mekanisme sisi pelayan SASL.

Mari lihat bagaimana kita dapat mewujudkan SaslServer :

SaslServer ss = Sasl.createSaslServer( mechanism, protocol, serverName, props, callbackHandler);

Kami menggunakan kelas kilang Sasl untuk mewujudkan SaslServer. Kaedah createSaslServer menerima beberapa parameter:

  • mekanisme - nama berdaftar IANA dari mekanisme yang disokong oleh SASL
  • protokol - nama protokol yang mana pengesahannya sedang dilakukan
  • serverName - nama hos pelayan yang berkelayakan sepenuhnya
  • alat peraga - sekumpulan sifat yang digunakan untuk mengkonfigurasi pertukaran pengesahan
  • callbackHandler - pengendali panggilan balik yang akan digunakan oleh mekanisme yang dipilih untuk mendapatkan maklumat lebih lanjut

Daripada perkara di atas, hanya dua yang pertama sahaja yang wajib dilakukan, dan selebihnya boleh dibatalkan.

SaslClient mewakili mekanisme sisi pelanggan SASL. Mari lihat bagaimana kita dapat mewujudkan SaslClient :

SaslClient sc = Sasl.createSaslClient( mechanisms, authorizationId, protocol, serverName, props, callbackHandler);

Di sini sekali lagi, kami menggunakan kelas kilang Sasl untuk mewujudkan SaslClient kami . Senarai parameter yang diterima oleh createSaslClient hampir sama seperti sebelumnya.

Walau bagaimanapun, terdapat beberapa perbezaan yang halus:

  • mekanisme - di sini, ini adalah senarai mekanisme untuk dicuba
  • authorityId - ini adalah pengenalan yang bergantung kepada protokol yang akan digunakan untuk kebenaran

Parameter selebihnya sama makna dan pilihan mereka.

3.2. Penyedia Keselamatan Java SASL

Di bawah Java SASL API adalah mekanisme sebenar yang menyediakan ciri keselamatan. The pelaksanaan mekanisme ini disediakan oleh penyedia keselamatan yang berdaftar dengan Architecture Kriptografi Java (JCA).

Terdapat banyak penyedia keselamatan yang berdaftar dengan JCA. Masing-masing boleh menyokong satu atau lebih mekanisme SASL .

Java dihantar dengan SunSASL sebagai penyedia keselamatan, yang secara lalai didaftarkan sebagai penyedia JCA. Walau bagaimanapun, ini mungkin dikeluarkan atau disusun semula dengan penyedia lain yang tersedia.

Lebih-lebih lagi, selalu dapat menyediakan penyedia keselamatan khusus . Ini memerlukan kita untuk melaksanakan antara muka SaslClient dan SaslServer . Dengan berbuat demikian, kami juga dapat menerapkan mekanisme keselamatan khusus kami!

4. SASL Melalui Contoh

Sekarang setelah kita melihat bagaimana membuat SaslServer dan SaslClient , sudah tiba masanya untuk memahami cara menggunakannya. Kami akan mengembangkan komponen pelanggan dan pelayan. Ini akan bertukar cabaran dan tindak balas secara berulang untuk mencapai pengesahan. Kami akan menggunakan mekanisme DIGEST-MD5 dalam contoh mudah kami di sini.

4.1. Pemegang Panggilan Balik Pelanggan dan Pelayan

Seperti yang kita lihat sebelumnya, kita perlu memberikan implementasi CallbackHandler kepada SaslServer dan SaslClient . Sekarang, CallbackHandler adalah antara muka mudah yang menentukan kaedah tunggal - menangani . Kaedah ini menerima pelbagai Callback .

Di sini, Callback memberikan cara mekanisme keselamatan untuk mengumpulkan data pengesahan dari aplikasi panggilan . Sebagai contoh, mekanisme keselamatan mungkin memerlukan nama pengguna dan kata laluan. Terdapat beberapa implementasi Callback seperti NameCallback dan PasswordCallback yang tersedia untuk digunakan.

Mari lihat bagaimana kita dapat menentukan CallbackHandler untuk pelayan, untuk bermula dengan:

public class ServerCallbackHandler implements CallbackHandler { @Override public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException { for (Callback cb : cbs) { if (cb instanceof AuthorizeCallback) { AuthorizeCallback ac = (AuthorizeCallback) cb; //Perform application-specific authorization action ac.setAuthorized(true); } else if (cb instanceof NameCallback) { NameCallback nc = (NameCallback) cb; //Collect username in application-specific manner nc.setName("username"); } else if (cb instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback) cb; //Collect password in application-specific manner pc.setPassword("password".toCharArray()); } else if (cb instanceof RealmCallback) { RealmCallback rc = (RealmCallback) cb; //Collect realm data in application-specific manner rc.setText("myServer"); } } } }

Sekarang, mari lihat bahagian pelanggan Callbackhandler kami :

public class ClientCallbackHandler implements CallbackHandler { @Override public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException { for (Callback cb : cbs) { if (cb instanceof NameCallback) { NameCallback nc = (NameCallback) cb; //Collect username in application-specific manner nc.setName("username"); } else if (cb instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback) cb; //Collect password in application-specific manner pc.setPassword("password".toCharArray()); } else if (cb instanceof RealmCallback) { RealmCallback rc = (RealmCallback) cb; //Collect realm data in application-specific manner rc.setText("myServer"); } } } }

Untuk menjelaskan, kami melengkapkan array Callback dan hanya mengendalikan yang khusus . Yang harus kita tangani adalah khusus untuk mekanisme yang digunakan, iaitu DIGEST-MD5 di sini.

4.2. Pengesahan SASL

Oleh itu, kami telah menulis CallbackHandler pelanggan dan pelayan kami . Kami juga menunjukkan mekanisme SaslClient dan SaslServer untuk DIGEST-MD5.

Sekarang adalah masa untuk melihat mereka beraksi:

@Test public void givenHandlers_whenStarted_thenAutenticationWorks() throws SaslException { byte[] challenge; byte[] response; challenge = saslServer.evaluateResponse(new byte[0]); response = saslClient.evaluateChallenge(challenge); challenge = saslServer.evaluateResponse(response); response = saslClient.evaluateChallenge(challenge); assertTrue(saslServer.isComplete()); assertTrue(saslClient.isComplete()); }

Mari cuba memahami apa yang berlaku di sini:

  • Pertama, pelanggan kami mendapat cabaran lalai dari pelayan
  • Pelanggan kemudian menilai cabaran dan menyiapkan tindak balas
  • Pertukaran cabaran-cabaran ini berterusan untuk satu lagi kitaran
  • Dalam prosesnya, klien dan pelayan menggunakan pengendali panggilan balik untuk mengumpulkan data tambahan yang diperlukan oleh mekanisme
  • Ini menyimpulkan pengesahan kami di sini, tetapi pada kenyataannya, ia dapat berulang selama beberapa kitaran

A pertukaran tipikal cabaran dan sambutan bait tatasusunan berlaku melalui rangkaian . Tetapi, di sini untuk kesederhanaan, kami menganggap komunikasi tempatan.

4.3. Komunikasi Selamat SASL

Seperti yang telah kita bincangkan sebelumnya, SASL adalah kerangka yang mampu menyokong komunikasi yang selamat di luar hanya pengesahan. Namun, ini hanya mungkin dilakukan jika mekanisme yang mendasari menyokongnya .

Pertama, mari kita periksa sama ada kita dapat merundingkan komunikasi yang selamat:

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

Di sini, QOP bermaksud kualiti perlindungan . Ini adalah sesuatu yang dirundingkan oleh pelanggan dan pelayan semasa pengesahan. Nilai "auth-int" menunjukkan pengesahan dan integriti. Sementara itu, nilai "auth-conf" menunjukkan pengesahan, integriti, dan kerahsiaan.

Setelah kita mempunyai lapisan keselamatan, kita dapat memanfaatkannya untuk melindungi komunikasi kita.

Mari lihat bagaimana kita dapat melindungi komunikasi keluar dengan pelanggan:

byte[] outgoing = "Baeldung".getBytes(); byte[] secureOutgoing = saslClient.wrap(outgoing, 0, outgoing.length); // Send secureOutgoing to the server over the network

Begitu juga, pelayan dapat memproses komunikasi masuk:

// Receive secureIncoming from the client over the network byte[] incoming = saslServer.unwrap(secureIncoming, 0, netIn.length); assertEquals("Baeldung", new String(incoming, StandardCharsets.UTF_8));

5. SASL di Dunia Sebenar

Jadi, kita sekarang mempunyai pemahaman yang baik tentang apa itu SASL dan bagaimana menggunakannya di Java. Tetapi, biasanya, bukan itu yang akhirnya kita gunakan untuk menggunakan SASL, sekurang-kurangnya dalam rutin harian kita.

As we saw earlier, SASL is primarily meant for protocols like LDAP and SMTP. Although, more and more applications and coming on board with SASL — for instance, Kafka. So, how do we use SASL to authenticate with such services?

Let's suppose we've configured Kafka Broker for SASL with PLAIN as the mechanism of choice. PLAIN simply means that it authenticates using a combination of username and password in plain text.

Let's now see how can we configure a Java client to use SASL/PLAIN to authenticate against the Kafka Broker.

We begin by providing a simple JAAS configuration, “kafka_jaas.conf”:

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

We make use of this JAAS configuration while starting the JVM:

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

Finally, we have to add a few properties to pass to our producer and consumer instances:

security.protocol=SASL_SSL sasl.mechanism=PLAIN

That's all there is to it. This is just a small part of Kafka client configurations, though. Apart from PLAIN, Kafka also supports GSSAPI/Kerberos for authentication.

6. SASL in Comparision

Although SASL is quite effective in providing a mechanism-neutral way of authenticating and securing client and server communication. However, SASL is not the only solution available in this regard.

Java itself provides other mechanisms to achieve this objective. We'll briefly discuss them and understand how they fare against SASL:

  • Java Secure Socket Extension (JSSE): JSSE is a set of packages in Java that implements Secure Sockets Layer (SSL) for Java. It provides data encryption, client and server authentication, and message integrity. Unlike SASL, JSSE relies on a Public Key Infrastructure (PKI) to work. Hence, SASL works out to be more flexible and lightweight than JSSE.
  • Java GSS API (JGSS): JGGS is the Java language binding for Generic Security Service Application Programming Interface (GSS-API). GSS-API is an IETF standard for applications to access security services. In Java, under GSS-API, Kerberos is the only mechanism supported. Kerberos again requires a Kerberised infrastructure to work. Compared to SASL, here yet, choices are limited and heavyweight.

Secara keseluruhan, SASL adalah rangka kerja yang sangat ringan dan menawarkan pelbagai ciri keselamatan melalui mekanisme pluggable. Aplikasi yang menggunakan SASL memiliki banyak pilihan dalam menerapkan set fitur keselamatan yang tepat, bergantung pada kebutuhannya.

7. Kesimpulannya

Kesimpulannya, dalam tutorial ini, kami memahami asas-asas kerangka SASL, yang menyediakan pengesahan dan komunikasi yang selamat. Kami juga membincangkan API yang ada di Java untuk menerapkan SASL klien dan pelayan.

Kami melihat bagaimana menggunakan mekanisme keselamatan melalui penyedia JCA. Akhirnya, kami juga membincangkan penggunaan SASL dalam bekerja dengan pelbagai protokol dan aplikasi.

Seperti biasa, kodnya boleh didapati di GitHub.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS