В предыдущей статье мы рассмотрели настройки выбора механизма аутентификации. Запустили Kafka без аутентификации и написали клиент, который пишет сообщения в топик.
В этой статье мы запустим Kafka с аутентификацией через SASL с простым механизмом PLAIN.
Предыдущая статья.Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.
Настройки сервера
Как мы уже знаем, для выбора протокола SASL_PLAINTEXT и механизма SASL нужно указать на сервере
1 2 |
security.protocol=SASL_PLAINTEXT sasl.enabled.mechanisms=PLAIN |
Помимо этого, придется добавить описание (на 9092 у нас остается соединение для межброкерного взаимодействия) соединения на 9093 порту в listeners и в advertised.listeners на SASL_PLAINTEXT:
1 2 |
listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9093 advertised.listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9093 |
Не забывайте заменять localhost на свой адрес
Мы указали, что выбрали протокол SASL_PLAINTEXT с механизмом PLAIN. Теперь нам нужно указать настройки самого механизма! Из первой статьи мы помним что это делается с помощью JAAS. Давайте разберем на примере JAAS записи в конфигурации сервера:
1 2 3 4 5 6 |
listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="admin" \ password="admin-secret" \ user_admin="admin-secret" \ user_robin="robin-secret" \ user_alice="alice-secret"; |
Для разбора этой конфигурации достаточно понять три вещи
- Пользователи задаются как:
user_[имя_пользователя]=»[пароль_пользователя]»
Что мы и видим на примере пользователей, admin, robin и alice. Например:
user_alice=»alice-secret» — тут задан пользователь alice с паролем alice-secret. - username и password — это логин и пароль для так называемой inter-broker коммуникации. Т.е. для того чтобы узлы Kafka могли связываться между собой с помощью этого логина и пароля.
- Новая строка отделяется символом — \ , а конец конфигурации — ;
Все, конфигурация сервера готова! Приведем полную конфигурацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
broker.id=0 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/tmp/kafka-logs num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connect=localhost:2181 zookeeper.connection.timeout.ms=18000 group.initial.rebalance.delay.ms=0 delete.topic.enable=true advertised.host.name=localhost listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9093 advertised.listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9093 security.protocol=SASL_PLAINTEXT sasl.enabled.mechanisms=PLAIN listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="admin" \ password="admin-secret" \ user_admin="admin-secret" \ user_robin="robin-secret" \ user_alice="alice-secret"; |
Если забудете указать securityy.protocol и sasl.enabled.mechanisms, то получите двусмысленную ошибку, поскольку иногда она также выскакивает если не указать JAAS конфигурацию (т.е. параметр listener.name.sasl_plaintext.plain.sasl.jaas.config):
1 java.lang.IllegalArgumentException: Could not find a 'KafkaServer' or 'sasl_plaintext.KafkaServer' entry in the JAAS configВ конфигурации JAAS также важно обратить внимание чтобы после символов «\» не было никаких знаков в той же строке, например если добавить пробел, то получим такую, которая вводит в заблуждение. Поскольку говорит что не хватает символа «;» а он есть.
1 java.lang.IllegalArgumentException: JAAS config entry not terminated by semi-colon
Настройки клиента
Как мы узнали из второй статьи, выбор протокола SASL_PLAINTEXT и механизма PLAIN для клиента задается настройками:
1 2 |
sasl.mechanism=PLAIN security.protocol=SASL_PLAINTEXT |
Однако, нам же еще нужно указать конфигурацию логин и пароль пользователя, под которым мы будем аутентифицироваться на сервере. Указывается логин и пароль в виде JAAS конфигурации. Мы будем аутентифицироваться как alice. Тогда JAAS-конфиг будет выглядеть так:
1 2 3 4 |
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ serviceName="Kafka" \ username="alice" \ password="alice-secret"; |
Думаю, тут все понятно! Внимательный читатель заметит serviceName — это название клиента, оно необходимо, иначе получим ошибку.
Важно: Если не указать serviceName, то получим ошибку:
1 java.lang.IllegalArgumentException: No serviceName defined in either JAAS or Kafka configОднако, такая же ошибка может выскочить, если указать на сервере security.protocol=SASL_SSL, но не указать sasl.enabled.mechanism!
Теперь приведем пример кода запуска клиента с указанной конфигурацией
Код самого клиента мы приводить тут и в следующих статьях не будем. Его можно посмотреть во второй статье. Приведем только код для запуска.
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.blockwit.kafka.security.examples; public class SimpleProducerTest_SASL_PLAINTEXT_PLAIN { public static void main(String[] args) throws InterruptedException { SimpleProducer.runProducer(Helper.of("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required serviceName=\"Kafka\" username=\"alice\" password=\"alice-secret\";", "sasl.mechanism", "PLAIN", "security.protocol", "SASL_PLAINTEXT"), "localhost:9093", "stats.store"); } } |
Не забывайте менять localhost на свой!
Запустите Kafka, а затем клиент! Если все успешно, то клиент ознаменует успешный процесс отправки сообщений в топик следующим текстом:
1 2 3 4 5 6 7 |
Message sends 1 Message sends 2 Message sends 3 Message sends 4 Message sends 5 Message sends 6 ... |
Резюме
В этой статье мы узнали настраивать протокол SASL_PLAINTEXT c самым простым механизмом аутентификации PLAIN. Познакомились с JAAS конфигурацией. Запустили клиент и сервер Kafka с аутентификацией!
В следующей статье мы немного узнаем про протокол SSL и подготовим все необходимое для последующей настройки SSL в Kafka.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.