В предыдущей статье настроили и проверили SSL в Kafka. Теперь настало время добавить аутентификацию к нашей настройке!
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.
Аутентификация по SSL
Как мы уже знаем из этой статьи о SSL, во время создания соединения клиента к серверу одна аутентификация уже точно есть. Это когда клиент аутентифицирует сервер, т.е. убеждается, что сервер — этот тот, за кого он себя выдает. Эта аутентификация выполняется клиентом посредством проверки сертификата сервера. А именно:
- Клиент получает сертификат от сервера
- Проверяет, что CN поле сертификата совпадает с адресом, по которому клиент подключается.
- Клиент проверяет, что сертификат есть в хранилище доверенных сертификатов (наш случай), либо проверяет, что сертификат подписан с помощью сертификата авторизованного центра.
Однако, под аутентификацией в контексте настройки сервера Kafka подразумевается именно аутентификация клиента на сервере. Поэтому добавлением этой аутентификации мы и займемся.
Аутентификация клиента на сервере будет работать почти точно также, как и сервера на клиенте. Только клиент и сервер поменяются ролями! И да, проверка сертификата будет только по наличию его в хранилище.
Поэтому, чтобы настроить аутентификацию клиента на сервере, нам нужно выполнить следующие шаги:
- Выпустить приватный ключ и сертификат для клиента
- Создать хранилище сертификатов клиента и поместить туда приватный ключ и сертификат клиента
- Положить в хранилище доверенных сертификатов сервера сертификат клиента
- Настроить клиент и сервер
Подготовка сертификатов и хранилищ
Для выпуска сертификата и приватного ключа клиента выполним такую же, как в этой статье, команду:
1 |
openssl req -subj "/CN=clientname/" -newkey rsa:2048 -nodes -keyout client.key -x509 -days 365 -out client.pem |
Вместо clientname подставьте имя, под которым хотите, чтобы Kafka аутентифицировал клиента. Поскольку мы будем проверять клиента по хранилищу доверенных сертификатов, то имя может быть любое.
После выполнения команды у нас появятся файлы сертификата client.pem и ключа client.key.
Создадим хранилище сертификатов и ключей клиента такой же, как в этой статье, командой:
1 |
openssl pkcs12 -export -out client.keystore.p12 -in client.pem -inkey client.key |
Теперь у нас появилось хранилище сертификатов и приватных ключей клиента client.keystore.p12 и пароль к нему.
Не путайте хранилища сертификатов клиента client.keystore.p12 и хранилище доверенных сертификатов клиента client.truststore.p12, которое мы создавали ранее. В хранилище доверенных сертификатов хранятся сертификаты серверов, которым доверяет клиент.
Теперь создадим хранилище доверенных сертификатов для сервера:
1 |
keytool -import -alias clientname -file client.pem -keystore server.truststore.p12 -storetype PKCS12 |
Не забудьте заменить clientname на удобное Вам.
После выполнения команды появится файл с доверенными сертификатами сервера. Не забудьте сохранить к нему пароль.
Все готово для настройки клиента и сервера!
Настройки сервера
Поскольку мы добавляем аутентификацию к уже настроенному в предыдущей статье соединению SSL, укажем только те настройки, которые нужно добавить!
Итак, нам нужно добавить путь до хранилища доверенных сертификатов и пароль к этому хранилищу!
1 2 |
ssl.truststore.location=/path/to/truststore/server.truststore.p12 ssl.truststore.password=password |
И еще добавим опцию:
1 |
ssl.client.auth=required |
Эта опция говорит о том, что у нас проверка сертификата клиента обязательна!
Это все! Приведем полную конфигурацию:
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 |
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=SSL://localhost:9092 advertised.listeners=SSL://localhost:9092 ssl.keystore.location=/path/to/keystore//server.keystore.jks ssl.keystore.password=serverKeystorePassword ssl.truststore.location=/path/to/truststore/server.truststore.p12 ssl.truststore.password=serverTruststorePassword ssl.client.auth=required |
Убедитесь, что Kafka имеет права на чтение server.truststore.jks, иначе получите ошибку:
1 Caused by: java.nio.file.AccessDeniedException: /path/to/truststore/server.truststore.p12Если Вы получили такую ошибку, то сделайте владельцем файла server.keystore.jks пользователя, под которым запускается Kafka. Например, вот так:
1 sudo chown kafka:kafka /path/to/truststore/server.truststore.p12
Настройки клиента
Для клиента нужно добавить путь до хранилища сертификата и приватного ключа клиента и пароль к хранилищу.
1 2 |
ssl.keystore.location=/path/to/keystore/client.keystore.p12 ssl.keystore.password=password |
Теперь приведем пример кода запуска клиента.
Код самого клиента мы приводить тут и в следующих статьях не будем. Его можно посмотреть во второй статье. Приведем только код для запуска.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.blockwit.kafka.security.examples; public class SimpleProducerTest_SSL_With_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.keystore.location", "/path/to/keystore/client.keystore.p12", "ssl.keystore.password", "clientKeystorePassword", "ssl.truststore.password", "clientTruststorePassword"), "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 аутентификацию клиента на сервере Kafka.
В следующей статье мы настроим и запустим протокол SASL с механизмом аутентификации PLAIN и с защитой по SSL.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.