Apache Kafka является ключевым продуктом не только для преобразования сообщений, но и при обработке данных в реальном времени, а также для многих других случаев использования. Архитектуры, размещенные в облаке, утверждают, что они безопасны с точки зрения коммуникации и обеспечения общей безопасности. Но когда дело доходит до частого взаимодействия клиента/потребителя с сервером/производителем, Kafka обеспечивает встроенную поддержку SSL, а также пользовательскую аутентификацию. В этой статье мы шаг за шагом настроим такой механизм аутентификации.

Решение состоит из трех частей: 

  1. Поддержка SSL для одного или нескольких брокеров: Сгенерируйте ключ и сертификат для каждой машины в кластере. Чтобы выполнить эту задачу, можно использовать утилиту Java KeyTool. Первоначально мы сгенерируем ключ во временное хранилище KeyStore, чтобы позже экспортировать и заверить его с помощью CA (Certificate Authority).

  2. Конфигурации Kafka (мы использовали Kafka 2.11-2.3.0).

  3. Запуск всей установки.

Инструкции по установке данного варианта использования

Поддержка SSL для одного или нескольких брокеров. Для выполнения этой задачи мы будем использовать утилиту Java KeyTool. Изначально мы сгенерируем ключ во временное хранилище KeyStore, чтобы позже экспортировать и заверить его подписью CA.

Мы будем использовать один сервер Kafka и два клиента (потребителя). Кроме того, здесь мы применяем самозаверенные сертификаты. В противном случае нам необходимо иметь TrustStore и KeyStore JKS для каждого сервера.

Обратите внимание: 

  1. Пожалуйста, создайте папку для создания и хранения всех файлов сертификатов.

  2. Предоставьте идентичные данные и пароли для всех. В моем случае я использовал:

issuer=C = de, ST = RF, L = Mainz, O = Technaura, OU = consulting, CN = swarnava.c, emailAddress =

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

keytool -keystore kafka.server.keystore.jks -alias localhost -validity 365 -genkey -keyalg RSA


openssl req -new -x509 -keyout ca-key -out ca-cert -days 365


keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert 


keytool -keystore kafka.client1.truststore.jks -alias CARoot -import -file ca-cert


keytool -keystore kafka.client2.truststore.jks -alias CARoot -import -file ca-cert


keytool -keystore kafka.server.keystore.jks -alias localhost -certreq -file cert-file


openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial 


keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert


keytool -keystore kafka.server.keystore.jks -alias localhost -import -file cert-signed


keytool -keystore kafka.client1.keystore.jks -alias localhost -validity 365 -genkey -keyalg RSA


keytool -keystore kafka.client1.keystore.jks -alias localhost -certreq -file cert-file


openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial


keytool -keystore kafka.client1.keystore.jks -alias CARoot -import -file ca-cert


keytool -keystore kafka.client1.keystore.jks -alias localhost -import -file cert-signed


keytool -keystore kafka.client2.keystore.jks -alias localhost -validity 365 -genkey -keyalg RSA


keytool -keystore kafka.client2.keystore.jks -alias localhost -certreq -file cert-file


openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial 


keytool -keystore kafka.client2.keystore.jks -alias CARoot -import -file ca-cert


keytool -keystore kafka.client2.keystore.jks -alias localhost -import -file cert-signed

Когда все будет сгенерировано, вы сможете увидеть созданные файлы:

λ ls

ca-cert ca-key cert-signed kafka.client1.truststore.jks kafka.client2.truststore.jks kafka.server.truststore.jks ca-cert.srl cert-file kafka.client1.keystore.jks kafka.client2.keystore.jks kafka.server.keystore.jks

Конфигурация Kafka

Измените файл server.properties, добавив в него следующие строки:

listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093

Также добавьте:

ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.endpoint.identification.algorithm=
ssl.keymanager.algorithm=SunX509
ssl.keystore.location=<p>/kafka.server.keystore.jks
ssl.keystore.password=<p>
ssl.keystore.type=JKS
ssl.protocol=TLS
ssl.trustmanager.algorithm=PKIX
ssl.truststore.location=<p>/kafka.server.truststore.jks
ssl.truststore.password=<p>
ssl.truststore.type=JKS
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
ssl.client.auth=required

Затем мы можем создать все необходимые новые файлы: client-ssl.properties, client-ssl1.properties и client-ssl2.properties внутри kafka_2.11-2.3.0\config.

security.protocol=SSL
ssl.truststore.location=<p>/kafka.client1.truststore.jks
ssl.truststore.password=<p>
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=
ssl.keystore.location=<p>/kafka.client1.keystore.jks
ssl.keystore.password=<p>
ssl.key.password=<p>
security.protocol=SSL
ssl.truststore.location=<p>/kafka.client1.truststore.jks
ssl.truststore.password=<p>
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=
ssl.keystore.location=<p>/kafka.client1.keystore.jks
ssl.keystore.password=<p>
ssl.key.password=<p>
security.protocol=SSL
ssl.truststore.location=<p>/kafka.client2.truststore.jks
ssl.truststore.password=<p>
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=
ssl.keystore.location=<p>/kafka.client2.keystore.jks
ssl.keystore.password=<p>
ssl.key.password=<p>

Сначала запустите Kafka и ZooKeeper:

Zkserver

 .\bin\windows\kafka-server-start.bat .\config\server.properties

Затем откройте новый терминал и создайте новую тему:

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --topic test1 --partitions 1 --replication-factor 1

.\bin\windows\kafka-topics.bat --list --zookeeper localhost:2181

После этого проверьте созданный сертификат:

openssl s_client -debug -connect localhost:9093 -tls1

В конце он вернет следующие данные. Это означает, что ваш сертификат сгенерирован правильно.

Wtmz24ChQdgNcygKXLq1AHgDetoHz57hrx5f75/gh31nDdgHpv4xKyO40TSIH+8v

PqgvvrogH0lgLCwsJfqwPEJbWZjL6pvLsBfPB8NMICMXpL50ZA==

-----END CERTIFICATE-----

subject=C = de, ST = RF, L = Mainz, O = Technaura, OU = consulting, CN = swarnava.c

issuer=C = de, ST = RF, L = Mainz, O = Technaura, OU = consulting, CN = swarnava.c, emailAddress = swarnava.c@technaura.com

 ---

Acceptable client certificate CA names

C = de, ST = RF, L = Mainz, O = Technaura, OU = consulting, CN = swarnava.c, emailAddress = swarnava.c@technaura.com

Client Certificate Types: ECDSA sign, RSA sign, DSA sign

Мы выполним настройку для трех различных сценариев, т.е. без аутентификации, только аутентификация на стороне сервера, аутентификация на стороне сервера и клиента.

Запуск полной установки

Команда для производства с использованием консольного продюсера:

.\bin\windows\kafka-console-producer.bat --broker-list <broker host:port> --topic <topic-name> --producer.config config&lt;config file>

Команда для потребления с помощью консольного потребителя:

.\bin\windows\kafka-console-consumer.bat --bootstrap-server <server host:port> --topic <topic-name> --consumer.config config&lt;config file>

Без аутентификации

Продюсер

Потребитель

Аутентификация только на стороне сервера

Создана еще одна тема "test2".

Продюсер

Потребитель 1

Потребитель 2

Примечание: Пожалуйста, проверьте используемые файлы конфигурации.

Аутентификация на стороне сервера и клиента

Для авторизации темы - 'test2' только для пользователя - swarnava.c, используйте две следующие команды:

.\bin\windows\kafka-acls.bat --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:"CN=swarnava.c,OU=consulting,O=Technaura,L=Mainz,ST=RF,C=de" --cluster --producer --topic test2
.\bin\windows\kafka-acls.bat --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:"CN=swarnava.c,OU=consulting,O=Technaura,L=Mainz,ST=RF,C=de" --group=* --consumer --topic test2

Продюсер

Потребитель 1 (с пользователем - swarnava.c)

Потребитель 2 (без пользователя - swarnava.c)

Поздравляю. Вы закончили. Это полное выполнение имплементации SSL в Kafka.

Материал подготовлен в преддверии старта курса "Spark Developer".

Комментарии (0)