Kafka: Часть 13 — Кастомная аутентификация — как задавать и читать настройки

В предыдущей статье мы узнали, как написать свою собственную логику аутентификации для Kafka PLAIN. Это был класс CustomAuthenticationCallbackHandler, который запускался Kafka. Вся логика заключалась в том, что мы сверяли предоставленный нам пароль и логин с тем, который записан в нашем классе.

Но, как Вы понимаете, жестко задавать пароли в классе небезопасно и такой подход лишен гибкости. Проще говоря, так в промышленном коде делать нельзя!

Репозиторий примера к текущей статье — https://github.com/BlockWit/esh-kse-13 .

Предыдущая статья. Следующая статья.

Полный список статей по теме тут.

Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.

Репозитории с примерам из статей по способам аутентификаци и авторизации https://github.com/BlockWit/kafka-security-examples.

 

Задача

Давайте представим реальную задачу, в которой нам потребуется кастомный аутентификатор. Например, когда у нас пользователи должны аутентифицироваться через Active Directory сервер. Т.е. с помощью LDAP. В этом случае логика работы такая:

  1. Клиент пытается присоединиться к Kafka и отдает ей логин и пароль
  2. Kafka отправляет логин и пароль кастомному аутентификатору
  3. Кастомный аутентификатор читает из настроек адрес сервера LDAP
  4. Кастомный аутентификатор соединяется с Active Directory сервером и отправляет запрос на проверку логина и пароля
  5. Active Directory сервер отправляет ответ о результате проверки
  6. Кастомный аутентификатор отдает результат Kafka

Достать и сконфигурировать Active Directory сервер не каждому под силу. Да и слишком сложно для нашего примера. Поэтому мы упростим задачу. Вместо Active Directory сервера мы будем использовать простой самописный сервер, в котором есть учетные данные для admin и для alice. Не бойтесь, писать Вам его не придется. Он уже есть в репозитории проекта.

В итоге, что нам нужно сделать:

  1. Добавить опцию в JAAS конфигурацию, в которой будет указан адрес сервера с учетками
  2. Научить кастомный аутентификатор читать опцию из конфигурации JASS
  3. Научить кастомный аутентификатор соединяться с сервером учетных данных и на основе ответа от сервера принимать решение

Чтение из конфига

Пусть опция, которая отвечает за адрес сервера аутентификации будет называться auth_server. Сервер будем запускать на локальной машине на порту 8001. Добавим опцию к конфигурации JAAS конфига Kafka из предыдущей статьи. Тогда конфиг Kafka будет выглядеть так:

Не забывайте менять localhost на свой, если это необходимо

Давайте теперь посмотрим, где и как читать JAAS  конфигурацию в нашем аутентификаторе. Посмотрите на код аутентификатора из предыдущей статьи. Там есть пустой метод configure, в который и передается список JAAS конфигураций jaasConfigEntries:

В jaasConfigEntries могут храниться несколько конфигураций для разных механизмов и протоколов. Как узнать нужную конфигурацию? Очень просто. У AppConfigurationEntry есть метод getLoginModuleName. Он и возвращает название класса конфигурации. В нашем случае указан класс:

Поэтому сравнивать мы будем так:

И, если найдем удовлетворяющую этому условию entry, то дальше прочесть нужную нам опцию можно так:

Где OPTION_NAME — название опции.

Давайте в наш класс добавим поле

Оно будет хранить прочитанную опцию. Теперь мы знаем, как написать код, который читает нашу опцию в методе configure:

Отлично! Осталось только написать код, который соединяется с сервером по адресу authServer и отправляет запрос на проверку пользователя. Для этого мы используем Apache HTTP Client. Мы будем отправлять такой GET запрос на сервер с учетками:

http://localhost:8001/?username=ИМЯ_ПОЛЬЗОВАТЛЯ&password=ПАРОЛЬ

А сервер будет отвечать 200 Ok — если у него такая учетка есть. Для того чтобы написать логику клиента нам потребуется зависимость Apache HttpClient. Добавьте ее в в dependencies в pom.xml:

Теперь давайте напишем логику метода authenticate:

Полный код будет теперь выглядеть так:

 

Теперь можете перезапустить Kafka и убедиться, что в логах Kafka нет ошибок (нет строк со словом ERROR).

Проверка работы аутентификатора

Для проверки работы примера можете воспользоваться репозиторием https://github.com/BlockWit/esh-kse-13

Для того, чтобы наш пример заработал, необходимо (команды справедливы, если ставили Kafka по этой статье):

  1. Выполнить mvn install. Проект соберется и появится файл target/esh-kse-13-jar-with-dependencies.jar
  2. Скопировать наш файл в папку с плагинами Kafka
  3. Назначить Kafka владельцем нашего плагина, чтобы Kafka имела к нему доступ

В составе репозитория есть скрипт deploy.sh, который выполняет компиляцию, сборку, копирование конфига из примера и перезапуск Kafka. Но делает он это при условии, что Вы запускаете скрипт из той же директории, где он лежит и, что настройка Kafka выполнена по этой статье. Обратите внимание, что скрипт меняет конфиг Kafka! Скрипт можно выполнять только после запуска сервера учеток!

И если Вы уже обновили конфигурацию, как указано в предыдущей главе, то не спешите перезапускать Kafka. Сначала нам нужно запустить наш сервер учеток. В репозитории он находится тут https://github.com/BlockWit/esh-kse-13/blob/master/src/test/java/com/blockwit/kafka/security/examples/credserver/CredentialsServer.java.

Это обычный запускаемый Java класс. Поэтому Вы его без труда запустите в своей среде разработки. Запуск сервера ознаменуется строкой:

Проверьте, что учетки работают:

В ответе должен содержаться код 200.

Такую же процедуру выполните для пользователя admin с паролем admin-secret.

Теперь очистите консоль сервера и перезапустите Kafka. Проверьте, что в логах Kafka нет ERROR. Через какое-то время в консоли сервера появится сообщение:

Это значит что контроллер Kafka успешно аутентифицировался через наш кастомный аутентификатор.

Теперь можете попробовать запустить клиент с учеткой Алисы. В репозитории он тут — https://github.com/BlockWit/esh-kse-13/blob/master/src/test/java/com/blockwit/kafka/security/examples/SimpleProducerTest_SASL_SSL_PLAIN.java

Код:

После запуска клиента должна начаться отправка сообщений:

А в консоли сервера должно появиться сообщение об успешной аутентификации Алисы:

Резюме

Поздравляю! Мы научились не только писать свою атутентиифкацию, но и читать JAAS конфиг и проверять учетки на стороннем сервере!

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

Репозиторий примера к текущей статье — https://github.com/BlockWit/esh-kse-13 .

Предыдущая статья. Следующая статья.

Полный список статей по теме тут.

Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.

Репозитории с примерам из статей по способам аутентификаци и авторизации https://github.com/BlockWit/kafka-security-examples.

 

 

Добавить комментарий