Kafka: Часть 2 — Конфигурация Kafka, запуск без аутентификации

В предыдущей статье мы рассмотрели базовые понятия, поверхностно разобрали механизмы безопасности и узнали, в каком виде они есть в Kafka.

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

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

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

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

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

 

Настройки безопасности Kafka

Прежде всего напомним понятия:

  • аутентификация — проверка что клиент является тем за кого себя выдает
  • авторизация — проверка прав клиента на доступ к ресурсу

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

  1. Без аутентификации
  2. SSL
  3. SASL

При этом канал может быть защищен SSL.

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

  1. Без аутентификации — по умолчанию, можно ничего не указывать
  2. SSL — необходимо в конфиге сервера и клиента указать
  3. SASL — необходимо в конфиге сервера и клиента указать:
    если без SSL:

    если c SSL:

    А затем нам необходимо уточнить SASL механизм аутентификации (мы рассмотрим только два):

    1. встроенный механизм:
      На сервере


      На клиенте
    2. Для GSSAPI (Kerberos):
      На сервере


      На клиенте

Для наглядности приведем диаграмму с настройками выбора

 

Помните, что security.protocol=SASL_SSL — это аутентификация протоколами SASL по каналу, защищенному SSL. А security.protocol=SSL — это аутентификация с помощью SSL по каналу защищенному SSL.

Важно: если указать на сервере  security.protocol=SASL_SSL, но не указать sasl.enabled.mechanism, то мы получим ошибку при запуске сервера: 

Однако, такая же ошибка может выскочить, если мы не указали serviceName в конфигурации JAAS клиента (с JAAS начнем знакомиться в следующей статье)

Затем на сервере указываем адрес и порт и протокол аутентификации:

listeners=[security_protocol]://[domain]:[port]

advertised.listeners=[security_protocol]://[domain]:[port]

Где [port], [domain] — порт и домен на котором Kafka будет работать с протоколом аутентификации [security_protocol]. При этом [security_protocol] — это то что Вы писали в свойстве security.protocol на сервере.

Например:

Kafka умеет работать с несколькими протоколами аутентификации одновременно, но на разных портах и IP, для этого просто необходимо через запятую в listeners,  например:

Kafka также умеет работать с несколькими SASL механизмами, для этого их достаточно перечислить в sasl.enabled.mechanisms через запятую.

В Kafka можно выделить два типа соединений:

  1. Соединения с обычными клиентами
  2. Межброкерное взаимодейтсвие. Т.е. взаимодействие между узлами Kafka. Зачем это нужно? Kafka — это масштабируемая отказоустойчивая система. Вкратце. Для обеспечения масштабируемости и отказоустойчивости Kafkа запускают на нескольких серверах. Грубо говоря, чтобы дублировать сообщения. Если один сервер выйдет из строя, то его заменит другой. В этом случае, каждый сервер Kafka должен уметь общаться с остальными, чтобы получать копии сообщений и держать актуальное состояние! Это и есть межброкерное или inter-broker взаимодействие.

В listeners описываются параметры всех соединений, как для обычных соединений так и для соединений межброкерного взаимодействия!

Вдаваться в подробности зачем нужен advertised.listeners мы пока не будем. Просто примем за правило что advertised.listeners дублирует listeners.

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

Если Kafka не найдет описание соединения для межброкерного взаимодействия в listeners, то может быть такая ошибка:

Тут упоминается SASL_PLAINTEXT. Дело в том что протокол межброкерного взаимодействия указывается отдельно. А если не указан, то ставится по умолчанию PLAINTEXT. Поэтому в listeners и должно быть описано одно соединение с PLAINTEXT. В данном случае пользователь про это забыл и указал только соединение SASL_PLAINTEXT.

Пока что, в наших статьях, мы будем настраивать защиту именно для внешних клиентов!

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

Конфигурация для работы

Работать мы будем с Kafka 2.6. Установка и настройка выходит за рамки данной статьи.

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

Дальше в статьях в качестве сервера будет фигурировать localhost, соответственно Вы должны заменять его на свой, , если нужно.

Свойства для сервера:

PLAINTEXT работает у Kafka по умолчанию, поэтому нет необходимости указывать какой протокол выбран. По этой причине мы не отметили на изображении выше опцию и не указали ее в настройках сервера или клиента:

Мы не стали добавлять новое соединение в listeners на порту 9093, поскольку оно будет отличаться только портом. Т.е. банально бы дублировало первое соединений по протоколу и IP или имени. Но если все же мы бы добавили соединение то получили бы от Kakfa такую ошибку:

Тестировать соединение мы будем с помощью клиента написанного на Java. Клиент запускает отправку сообщений в топик stats.store.

Для клиента создайте maven проект на Java, пропишите туда зависимость

И создайте класс SimpleProducer следующего содержания:

Затем создайте класс Helper (работаем мы с JDK 1.8, а там нет некоторых удобных фич, типа Map.of как в JDK 1.9, поэтому мы их добавляем самостоятельно):

Запускать клиент мы будем так (не забывайте заменять localhost на свой, если нужно):

Запустите Kafka, а затем клиент!  Если все успешно, то клиент ознаменует успешный процесс отправки сообщений в топик следующим текстом:

Резюме

В этой статье мы узнали как выбирать протокол и механизм аутентификации в конфигурациях клиента и сервера Kafka. Настроили Kafka на работу без аутентификации и запустили клиент, который отправляет сообщения в топик без аутентификации.

В следующей статье мы узнаем как настраивать SASL_PLAINTEXT и со встроенным механизмом PLAIN. Проще говоря настроим в Kafka самую простую встроенную аутентификацию!

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

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

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

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

 

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