Kafka: Часть 12 — Кастомная аутентификация — пишем свой модуль аутентификации

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

В этой статье мы создадим свой простой механизм аутентификации и попробуем его в деле!

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

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

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

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

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

 

Подготовка к реализации кастомной аутентификации

Прежде чем писать кастомную аутентификацию, давайте подготовим конфигурацию сервера на которой будем тестировать.

Возьмем простую конфигурацию сервера из 3-ей статьи.

Эта конфигурация содержит:

  1. Описание соединение с протоколом SASL без SSL с механизмом аутентификации PLAIN и Jaas конфигурацию для PLAIN.
  2. Соединение для межброкерного взаимодействия без аутентификации, т.е. PLAINTEXT

Давайте внесем кое-какие изменения:

  1. Уберем всех пользователей из JAAS конфигурации, кроме пользователя для межброкерного взаимодействия.
  2. Настроим соединение для межброкерного взаимодействия по протоколу SASL_PLAINTEXT.

Зачем мы это сделали?

Такая конфигурация позволит нам тестировать нашу кастомную аутентификацию без запуска клиента. Как мы уже знаем, в JAAS конфигурации есть пользователь для межброкерной коммуникации. Задается он с помощью username и password. Мы также знаем, что когда мы запускаем сервер Kafka, то помимо самого сервера, запускается контроллер — KafkaController (подробнее об этом тут). Этот контроллер будет пытаться соединиться с Kafka сервером с помощью указанного в JAAS пользователя username. И, если в логах Kafka не будет ошибок, то будем нашу кастомную атуентификацию считать работающей.

Если Вы устанавливали и настраивали Kafka по этой статье, то логи Kafka лежат тут — /tmp/kafka-logs/kafka.log . Иначе, чтобы узнать, где Kafka складывает логи, посмотрите описание сервиса /etc/systemd/syste/kafka.service.

Получим следующий конфиг:

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

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

Конфигурация у нас готова, теперь преступим к написанию нашей кастомной аутентификации.

Кастомная аутентификая

Наш аутентификатор будет выполнять простую задачу — он будет проверять, что имя клиента совпадает с «admin» а пароль с «admin-secret». Этого вполне достаточно для примера.

Чтобы сделать кастомную аутентификацию нужно:

  1. Создать класс, реализующий интерфейс AuthenticateCallbackHandler
  2. Подсунуть этот класс Kafka, чтобы Kafka знала где его искать
  3. Указать в конфигурации Kafka использовать наш класс
  4. Перезапустить Kafka

Начнем с создания класса.

Для работы создайте Java Maven проект и добавьте туда зависимости:

Тут у нас три зависимости:

  1. Kafka библиотека
  2. Slf4J — для удобного логирования
  3. Lombok — чтобы не писать лишнего кода (например, чтобы не создавать логер ручками мы просто прописываем аннотацию над классом)

Также в pom.xml нужно добавить следующий код:

Этот код добавляет к конечному Jar все зависимые библиотеки. Дело в том, что наш jar будет подсовываться Kafka в том виде, в котором он есть. Поэтому Kafka не будет скачивать зависимости.

Теперь создадим наш класс аутентификатора:

Это шаблонный код. Вся логика сосредоточена в методе authenticate. Ничего сложного там нет. Как мы и хотели, мы сравниваем username с «admin» а password с «admin-secret» и возвращаем результат. Вы можете логику authenticate заменить на ту, которая Вам необходима. Например, Вы можете соединяться с LDAP сервером и проверять на нем, что предоставленные username и password валидны, и затем возвращать результат.

Отлично, с классом мы закончили. Теперь соберите проект. Для этого в корне проекта выполните

После того как maven соберет проект, он напишет где лежит готовый jar. Для нашего проекта это:

target/esh-kse-12-1.0-SNAPSHOT-jar-with-dependencies.jar

Теперь нам нужно сделать так, чтобы Kafka узнала о нашем jar. Для этого есть два пути:

  1. Указать в Classpath
  2. Скопировать в директорию плагинов Kafka. Если Вы устанавливали Kafka по этой статьей, то директория плагинов у нас тут  /opt/kafka/libs/

Мы пойдем по второму пути и скопируем в директорию плагинов (директорию замените на свою)

И сделайте Kafka владельцем нашего jar, чтобы Kafka имела к нему доступ:

Осталось указать в конфиге Kafka, что мы хотим использовать наш класс кастомной аутентификации:

Обратите внимание, что название опции содержит имя протокола — sasl_plaintext и механизма plain: listener.name.sasl_plaintext.plain.sasl.server.callback.handler.class. В случае протокола SASL_SSL опция будет выглядеть по-другому: listener.name.sasl_ssl.plain.sasl.server.callback.handler.class

Теперь наш конфиг будет выглядеть так:

Запускаем Kafka и ищем в логах ERROR. Если их там нет, то наш кастомный механизм аутентификации прижился!

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

А теперь проверим и клиент! Для этого достаточно взять клиент из этой статьи и заменить имя пользователя и пароль на  «admin» и «admin-secret» соответственно:

Запустим и увидим:

Наш клиент успешно аутентифицировался и отправляет сообщения!

Резюме

В этой статье мы узнали, как написать свою собственную аутентификацию. В следующей статье мы узнаем, как задавать настройки нашему аутентификатору.

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

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

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

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

 

 

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