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 — название опции.

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

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

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

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

А сервер будет отвечать 200 Ok — если у него такая учетка есть. Давайте напишем логику метода authenticate:

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

 

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

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

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

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

  1. Выполнить mvn install — тогда проект соберется и появится файл targetesh-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.

 

 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *