Рубрики
Без рубрики

Введение в Java SASL

Краткий и практический обзор Java SASL – простой аутентификации и уровня безопасности.

Автор оригинала: Kumar Chandrakant.

Введение в Java SASL

1. Обзор

В этом учебнике мы пройдемся по основам Простая аутентификация и уровень безопасности (SASL). Мы поймем, как Java поддерживает принятие SASL для обеспечения безопасности связи.

При этом мы будем использовать простую клиентскую и серверную связь, обеспечивая ее с помощью SASL.

2. Что такое SASL?

SASL рамки для проверки подлинности и безопасности данных в интернет- . Она направлена на отделение интернет-протоколов от конкретных механизмов аутентификации. Мы будем лучше понимать части этого определения, как мы идем вместе.

Потребность в безопасности в общении неявная. Давайте попробуем понять это в контексте клиентских и серверных услуг . Обычно данные обмена клиентами и серверами по сети. Крайне важно, чтобы обе стороны могли доверять друг другу и безопасно отправлять данные.

2.1. Где вписывается SASL?

В приложении мы можем использовать SMTP для отправки электронных писем и использования LDAP для доступа к службам каталогов. Но каждый из этих протоколов может поддерживать другой механизм аутентификации, такой как Digest-MD5 или Kerberos.

Что делать, если существует способ для протоколов, чтобы поменять механизмы проверки подлинности более декларативно? Это именно то, где SASL вступает в картину. Протоколы, поддерживающие SASL, неизменно могут поддерживать любой из механизмов SASL.

Следовательно, приложения могут договориться о подходящем механизме и принять это для проверки подлинности и безопасной связи.

2.2. Как работает SASL?

Теперь, когда мы видели, где SASL вписывается в общую схему безопасности, давайте поймем, как это работает.

SASL является основой реагирования на вызовы . Здесь сервер выдает вызов клиенту, и клиент отправляет ответ, основанный на вызове. Задача и ответные меры являются рядами произвольных длин и, следовательно, могут нести любые данные, специфичные для конкретного механизма.

Этот обмен может продолжаться в течение нескольких итераций и, наконец, заканчивается, когда сервер не выдает никаких дальнейших проблем.

Кроме того, клиент и сервер могут вести переговоры о уровне безопасности после проверки подлинности. Вся последующая коммуникация может использовать этот уровень безопасности. Однако обратите внимание, что некоторые механизмы могут поддерживать только аутентификацию.

Здесь важно понимать, что SASL только обеспечивает основу для обмена вызовами и ответных данные. В нем ничего не говорится о самом данных или о том, как они обмениваются. Эти сведения остаются для приложений, которые принимаются для использования SASL.

3. Поддержка SASL в Java

Есть API в Java, которые поддержка разработки как клиентских, так и серверных приложений с SASL. API не зависит от самих механизмов. Приложения, использующие Java SASL API, могут выбрать механизм, основанный на требуемых функциях безопасности.

3.1. Java SASL API

Ключевые интерфейсы, которые можно заметить в рамках пакета “javax.security.sasl”, СаслСервер и СаслКлиент .

СаслСервер представляет серверный механизм SASL.

Давайте посмотрим, как мы можем мгновенно СаслСервер :

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

Мы используем заводский класс Сасл мгновенное СаслСервер. Метод создатьSaslServer принимает несколько параметров:

  • механизм – зарегистрированное IANA название поддерживаемого SASL механизма
  • протокол – название протокола, для которого проводится проверка подлинности
  • serverName – полностью квалифицированный хост-имя сервера
  • реквизит — набор свойств, используемых для настройки обмена аутентификацией
  • обратный вызовHandler – обработчик обратного вызова, который будет использоваться выбранным механизмом для получения дополнительной информации

Из вышеперечисленных, только первые два являются обязательными, а остальные являются недействительными.

СаслКлиент представляет механизм sasL со стороны клиента. Давайте посмотрим, как мы можем мгновенно СаслКлиент :

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

И здесь мы используем заводской класс Сасл мгновенное воспроизведение нашей СаслКлиент . Перечень параметров, которые создатьСасльКлиент принимает в значительной степени так же, как и раньше.

Тем не менее, есть некоторые тонкие различия:

  • механизмы – вот, это список механизмов, чтобы попробовать от
  • авторизацияИ – это протокольная идентификация, которая будет использоваться для авторизации

Остальные параметры схожи по смыслу и факультативности.

3.2. Поставщик безопасности Java SASL

Под API Java SASL находятся фактические механизмы, которые обеспечивают функции безопасности. внедрение этих механизмов обеспечивается поставщиками услуг по обеспечению зарегистрированы в Архитектура криптографии Java (JCA).

Там может быть несколько поставщиков безопасности, зарегистрированных в JCA. Каждый из этих может поддерживать один или несколько механизмов SASL .

Java поставляется с SunSASL в качестве поставщика безопасности, который регистрируется в качестве поставщика JCA по умолчанию. Тем не менее, это может быть удалено или изменено с любыми другими доступными поставщиками.

Более того, это всегда возможно предоставление пользовательского поставщика услуг по обеспечению . Это потребует от нас реализации интерфейсов СаслКлиент и СаслСервер . Поступая таким образом, мы можем реализовать наш пользовательский механизм безопасности, а также!

4. SASL на примере

Теперь, когда мы видели, как создать СаслСервер и СаслКлиент , пришло время понять, как их использовать. Мы будем разрабатывать клиентские и серверные компоненты. Они будут обмениваться вызов и ответ итеративно для достижения подлинности. Мы будем использовать механизм DIGEST-MD5 в нашем простом примере здесь.

4.1. Клиент и сервер CallbackHandler

Как мы видели ранее, мы должны обеспечить осуществление Обратный вызовХэндлер СаслСервер и СаслКлиент . Теперь, Обратный вызовХэндлер это простой интерфейс, который определяет один метод – ручка . Этот метод принимает массив Обратный вызов .

Вот, Обратный вызов представляет собой способ для механизма безопасности для сбора данных аутентификации из приложения вызова . Например, механизм безопасности может потребовать имя пользователя и пароль. Есть довольно много Обратный вызов реализации, такие как NameCallback и ПарольВызов доступны для использования.

Давайте посмотрим, как мы можем определить Обратный вызовХэндлер для сервера, для начала:

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"); 
            }
        }
    }
}

Теперь давайте посмотрим на нашу клиентскую сторону Обратный вызов :

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"); 
            }
        }
    }
}

Чтобы прояснить, мы цикл через Обратный вызов массива и обработки только конкретных . Те, которые мы должны обрабатывать специфичен для механизма в использовании, который DIGEST-MD5 здесь.

4.2. Проверка подлинности SASL

Итак, мы написали наш клиент и сервер Обратный вызовХэндлер . Мы также мгновенно СаслКлиент и СаслСервер для механизма DIGEST-MD5.

Настало время увидеть их в действии:

@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());
}

Давайте попробуем понять, что здесь происходит:

  • Во-первых, наш клиент получает вызов по умолчанию с сервера
  • Затем клиент оценивает вызов и готовит ответ
  • Этот обмен ответами на вызовы продолжается еще один цикл
  • В процессе клиент и сервер используют обработчики обратных вызовов для сбора любых дополнительных данных по мере необходимости механизмом
  • Это завершает нашу аутентификацию здесь, но на самом деле, он может итерировать в течение нескольких циклов

типичный обмен массивами вызова и ответа происходит по сети . Но, здесь для простоты, мы взяли на себя местное общение.

4.3. Безопасная связь SASL

Как мы уже говорили ранее, SASL является структурой, способной поддерживать безопасную связь, помимо простой аутентификации. Тем не менее, это возможно только в том случае, если базовый механизм поддерживает его .

Во-первых, давайте сначала проверим, удалось ли нам договориться о безопасном сообщении:

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

Вот, ЗОП означает качество защитных . Это то, что клиент и сервер переговоры во время проверки подлинности. Значение “auth-int” указывает на аутентификацию и целостность. В то время как значение “auth-conf” указывает на аутентификацию, целостность и конфиденциальность.

Если у нас есть уровень безопасности, мы можем использовать это для обеспечения нашей связи.

Давайте посмотрим, как мы можем обеспечить исходящие связи в клиенте:

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

Аналогичным образом сервер может обрабатывать входящую связь:

// 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 в реальном мире

Итак, теперь у нас есть справедливое понимание того, что такое SASL и как его использовать в Java. Но, как правило, это не то, что мы в конечном итоге с помощью SASL для, по крайней мере в нашей повседневной жизни.

Как мы видели ранее, SASL предназначен в первую очередь для таких протоколов, как LDAP и SMTP . Хотя, все больше и больше приложений и ближайшие на борту с SASL – например, Кафка. Итак, как мы используем SASL для проверки подлинности с помощью таких услуг?

Допустим, мы настроили Kafka Broker для SASL с PLAIN в качестве механизма выбора. PLAIN просто означает, что он аутентичен с помощью комбинации имени пользователя и пароля простым текстом.

Давайте теперь посмотрим, как мы можем настроить Java клиента для использования SASL/PLAIN для проверки подлинности против Kafka Broker.

Мы начинаем с предоставления простой конфигурации JAAS, “kafka_jaas.conf”:

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

Мы используем эту конфигурацию JAAS при запуске JVM:

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

Наконец, мы должны добавить несколько свойств, чтобы перейти к нашим производителем и потребителем экземпляров:

security.protocol=SASL_SSL
sasl.mechanism=PLAIN

Это все, что нужно сделать. Это лишь малая часть конфигураций клиентов Kafka, однако. Помимо PLAIN, Kafka также поддерживает GSSAPI/Kerberos для проверки подлинности.

6. SASL в сравнении

Хотя SASL достаточно эффективен в обеспечении нейтрального механизма способа аутентификации и обеспечения безопасности клиентской и серверной связи. Тем не менее, SASL не единственное решение, доступное в этой связи.

Java сама предоставляет другие механизмы для достижения этой цели. Мы кратко обсудим их и поймем, как они тариф против SASL:

  • Java Безопасный розетка расширение (JSSE): JSSE — это набор пакетов на Java, который реализует Secure Sockets Layer (SSL) для Java . Он обеспечивает шифрование данных, проверку подлинности клиентов и серверов, а также целостность сообщений. В отличие от SASL, JSSE полагается на инфраструктуру публичных ключей (PKI) для работы. Таким образом, SASL работает, чтобы быть более гибким и легким, чем JSSE.
  • Java GSS API (JGSS): JGGS является обязательным языком Java для общего интерфейса программирования приложений Службы безопасности (GSS-API) . GSS-API является стандартом IETF для приложений для доступа к службам безопасности. На Java, в соответствии с GSS-API, Kerberos является единственным поддерживаемым механизмом. Kerberos снова требует Kerberised инфраструктуры для работы. По сравнению с SASL, здесь еще, выбор ограничен и тяжеловес.

В целом, SASL является очень легкой структурой и предлагает широкий спектр функций безопасности через подключаемые механизмы. Приложения, внедряющие SASL, имеют большой выбор в реализации правильного набора функций безопасности, в зависимости от необходимости.

7. Заключение

Подводя итог, в этом учебнике мы поняли основы инфраструктуры SASL, которая обеспечивает аутентификацию и безопасную связь. Мы также обсудили API, доступные в Java для реализации клиентской и серверной стороны SASL.

Мы видели, как использовать механизм безопасности через поставщика JCA. Наконец, мы также говорили об использовании SASL в работе с различными протоколами и приложениями.

Как всегда, код можно найти более на GitHub .