В предыдущей статье мы подготовили все необходимое для настройки SSL в Kafka. Теперь займемся непосредственно настройкой Kafka и попробуем наше защищенное соединение в действии!
В и первой и второй статьях мы узнали, что указание протокола как SSL в настройках — это выбор протокола аутентификации. Это не совсем так. Указание этого протокола говорит лишь о том, что будет использоваться SSL. А уже от настройки самого SSL зависит будет ли проводиться аутентификация или нет. Конкретно в этой статье мы рассмотрим только защиту канала с помощью SSL. А уже в следующей добавим и аутентификацию.
Также не стоит путать указание протокола SSL с указанием протокола SASL_SSL. Во втором случае SSL используется для защиты SASL механизмов.
Предыдущая статья.Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.
Настройки сервера
Изменим описание протокола на 9093 порту в listeners и advertised.listeners на SSL:
1 2 |
listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093 advertised.listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093 |
Не забывайте заменять localhost на свой
Теперь нам необходимо указать сами настройки SSL на сервере.
Для настройки SSL у Вас должен быть сертификат для сервера и приватный ключ, дабы этим приватным ключом сервер Kafka мог подписывать свои ответы. В предыдущей статье мы подготовили хранилища. Если Вы не читали предыдущую статью, то вкратце — Kafka по умолчанию поддерживает — JKS и PKCS12 форматы хранилища сертификатов и ключей. Поэтому подготовьте сертификат и приватный ключ к нему в виде файла-хранилища JSK или PKCS12, а также пароль к хранилищу.
Итак, настройки:
1 2 |
ssl.keystore.location=/path/to/keystore/server.keystore.p12 ssl.keystore.password=password |
Тут все более-менее ясно.
- ssl.keystore.location — путь к хранилищу с сертификатом и приватном ключом на сервере
- ssl.keystore.password — пароль к хранилищу
Важно — имя сервера или IP, которые указаны в listeners и advertise.listeners должны совпадать с SAN в сертификате или с hostanem в CN в сертификате, если нет SAN. Подробнее о порядке совпадения в предыдущей статье.
Все, конфигурация сервера готова! Приведем полную конфигурацию:
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 |
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,SSL://localhost:9093 advertised.listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093 ssl.keystore.location=/path/to/keystore/server.keystore.p12 ssl.keystore.password=password |
Убедитесь, что Kafka имеет права на чтение server.keystore.jks иначе получите ошибку:
1 Caused by: java.nio.file.AccessDeniedException: /path/to/keystore/server.keystore.p12Если Вы получили такую ошибку, то сделайте владельцем файла server.keystore.jks пользователя, под которым запускается Kafka. Например, вот так:
1 sudo chown -R kafka:kafka /path/to/keystore/server.keystore.p12
Настройки клиента
Как мы узнали из второй статьи, выбор протокола SSL для клиента задается настройками:
1 |
security.protocol=SSL |
Также нам потребуется указать путь до хранилища доверенных сертификатов и пароль к этому хранилищу. В хранилище доверенных сертификатов клиента не должно быть приватного ключа! Как сформировать хранилище доверенных сертификатов для клиента — в предыдущей статье.
1 2 |
ssl.truststore.location=/path/to/keystore/client.truststore.jks ssl.truststore.password=password |
Думаю, тут все понятно!
Клиент будет работать даже с самоподписным сертификатом, поскольку мы заранее ему подсунули сертификат, которому нужно доверять в client.truststore.jks!
Теперь приведем пример кода запуска клиента.
Код самого клиента мы приводить тут и в следующих статьях не будем. Его можно посмотреть во второй статье. Приведем только код для запуска.
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.blockwit.kafka.security.examples; public class SimpleProducerTest_SSL_No_Client_Auth { public static void main(String[] args) throws InterruptedException { SimpleProducer.runProducer(Helper.of("security.protocol", "SSL", "ssl.truststore.location", "/path/to/keystore/client.truststore.jks", "ssl.truststore.password", "clientKeystorePassword"), "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 ... |
Резюме
В этой статье мы узнали как настроить SSL без аутентификации и попробовали на практике.
В следующей статье мы добавим аутентификацию к нашей настройке SSL.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.