В предыдущей статье мы настроили и проверили аутентификацию SSL в Kafka. Давайте теперь разберемся, как добавлять защиту соединения SSL к SASL протоколу аутентификации! Разбираться будем на примере простого механизма аутентификации PLAIN.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.
Комбинация SSL с SASL
Давайте вспомним, что мы уже умеем:
- Мы умеем конфигурировать аутентификацию с SASL_PLAINTEXT с механизмом PLAIN
- Также мы уже умеем конфигурировать SSL для защиты соединения
Выходит, что мы уже все знаем. Остается только объединить конфигурации!
Итак, вспомним: чтобы протокол SASL работал через SSL, необходимо это указать явным образом. Вспомним диаграмму из первой статьи и отметим наш выбор конфигурации:
Таким образом, выбор протокола аутентификации на сервере будет такой:
1 2 |
listeners=PLAINTEXT://localhost:9092,SASL_SSL://localhost:9093 advertised.listeners=PLAINTEXT://localhost:9092,SASL_SSL://localhost:9093 |
И такой на клиенте соответственно:
1 2 |
security.protocol=SASL_SSL sasl.mechanism=PLAIN |
Остальные настройки протоколов для сервера мы скомбинируем из настроек SASL_PLAINTEXT PLAIN и SSL и вот, что получится для сервера:
1 2 3 4 5 6 7 8 9 10 11 |
# Настройки как для протокола SASL_PLAINTEXT с механизмом PLAIN listener.name.sasl_ssl.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"; # Настройки как для протокола SSL ssl.keystore.location=/path/to/keystore/server.keystore.jks ssl.keystore.password=password |
Обратите внимание, что мы заменили
listener.name.sasl_plaintext.plain.sasl.jaas.config
на
listener.name.sasl_ssl.plain.sasl.jaas.config
Потому что поменялся протокол!
А для клиента:
1 2 3 4 5 6 7 8 9 |
# Настройки как для протокола SASL_PLAINTEXT с механизмом PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ serviceName="Kafka" \ username="alice" \ password="alice-secret"; # Настройки как для протокола SSL ssl.truststore.location=/path/to/keystore/client.truststore.jks ssl.truststore.password=password |
Итак, мы на клиенте и на сервере:
- Поправили выбор протокола
- Добавили настройки протокола SASL_PLAINTEXT + PLAIN
- Добавили настройки протокола SSL
Теперь приведем итоговую конфигурацию сервера:
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 34 35 36 |
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_ssl.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"; ssl.keystore.location=/path/to/server/keystore/server.keystore.jks ssl.keystore.password=serverKeystorePassword |
И клиента
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.blockwit.kafka.security.examples; public class SimpleProducerTest_SASL_SSL_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_SSL", "ssl.truststore.location", "/path/to/client/truststore/client.truststore.jks", "ssl.truststore.password", "clientTruststorePassword"), "localhost:9093", "stats.store"); } } |
Не забывайте менять localhost, ssl.keystore.location, ssl.keystore.password на свои!
Запустите 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 ... |
SSL для других механизмов SASL протокола
Мы рассмотрели защиту соединения с помощью SSL для протокола SASL и его механизма аутентификации PLAIN. Из первой статьи мы знаем что у SASL сейчас как минимум четыре механизма аутентификации:
Можно рассмотреть добавление SSL к каждому механизму, а можно просто понять принцип добавления SSL к каждому механизму.
А принцип простой
- В соединении указываем SASL_SSL
- Добавляем выбор самого механизма SASL
- Добавляем настройки выбранного механизма аутентификации SASL
- Добавляем настройки SSL
Следуя этой инструкции, Вы сможете настроить любой механизм аутентификации SASL с SSL.
Резюме
В этой статье мы добавили SSL к протоколу SASL с PLAIN аутентификацией, а также разобрали принцип добавления SSL к другим механизмам аутентификации SASL.
В следующей статье мы познакомимся с ACL.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.