Настройка шифрования и проверки подлинности TLS для кластера Apache Kafka non-ESP в Azure HDInsight
В этой статье показывается, как настроить шифрование TLS, ранее называемое шифрованием SSL, между клиентами Apache Kafka и брокерами Apache Kafka. Здесь также показывается, как настроить проверку подлинности клиентов (иногда называемую двусторонней проверкой подлинности TLS).
Внимание
Для приложений Kafka можно использовать два клиента: клиент Java и клиент консоли. Только клиент Java ProducerConsumer.java
может использовать TLS как для создания, так и для потребления. Клиент производителя консоли console-producer.sh
не работает с TLS.
Настройка брокера Apache Kafka
Настройка брокера TLS Kafka использует четыре виртуальных машины кластера HDInsight следующим образом:
- головной узел 0 — центр сертификации (ЦС);
- рабочие узлы 0, 1 и 2 — брокеры.
Примечание.
В этом руководстве используются самозаверяемые сертификаты, но наиболее безопасным решением является использование сертификатов, выданных доверенными центрами сертификации.
Ниже приведена сводка процесса настройки брокера.
Следующие действия повторяются в каждом из трех рабочих узлов.
- Создайте сертификат.
- Создайте запрос на подпись сертификата.
- Отправьте запрос подписи сертификата в центр сертификации (ЦС).
- Войдите в ЦС и подпишите запрос.
- С помощью команды SCP отправьте подписанный сертификат обратно на рабочий узел.
- С помощью команды SCP отправьте открытый сертификат ЦС на рабочий узел.
Получив все сертификаты, поместите их в хранилище сертификатов.
Перейдите в Ambari и измените настройки.
Используйте следующие подробные инструкции для завершения настройки брокера.
Внимание
В следующих фрагментах кода wnX представляет собой сокращенное обозначение одного из трех рабочих узлов, которое необходимо заменить на
wn0
,wn1
илиwn2
соответственно.WorkerNode0_Name
иHeadNode0_Name
следует заменить на имена соответствующих машин.Выполните начальную настройку на головном узле 0, который для HDInsight заполняет роль центра сертификации (ЦС).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
Выполните ту же начальную настройку в каждом брокере (на рабочих узлах 0, 1 и 2).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
На каждом рабочем узле выполните следующие действия с помощью фрагмента кода.
- Создайте хранилище ключей и заполните его новым закрытым сертификатом.
- Создайте запрос на подпись сертификата.
- С помощью SCP отправьте запрос подписи сертификата в ЦС (headnode0).
keytool -genkey -keystore kafka.server.keystore.jks -keyalg RSA -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=FQDN_WORKER_NODE" -ext SAN=DNS:FQDN_WORKER_NODE -storetype pkcs12 keytool -keystore kafka.server.keystore.jks -certreq -file cert-file -storepass "MyServerPassword123" -keypass "MyServerPassword123" scp cert-file sshuser@HeadNode0_Name:~/ssl/wnX-cert-sign-request
Примечание.
FQDN_WORKER_NODE — полное доменное имя компьютера рабочего узла. Эти сведения можно получить из файла /etc/hosts в головном узле
Например,
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
На компьютере ЦС выполните следующую команду, чтобы создать файлы ca-cert и ca-key:
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
Перейдите на машину ЦС и подпишите все полученные запросы на подпись сертификатов:
openssl x509 -req -CA ca-cert -CAkey ca-key -in wn0-cert-sign-request -out wn0-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn1-cert-sign-request -out wn1-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn2-cert-sign-request -out wn2-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
Отправьте подписанные сертификаты из центра сертификации (headnode0) назад на рабочие узлы.
scp wn0-cert-signed sshuser@WorkerNode0_Name:~/ssl/cert-signed scp wn1-cert-signed sshuser@WorkerNode1_Name:~/ssl/cert-signed scp wn2-cert-signed sshuser@WorkerNode2_Name:~/ssl/cert-signed
Отправьте общий сертификат ЦС на каждый рабочий узел.
scp ca-cert sshuser@WorkerNode0_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode1_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode2_Name:~/ssl/ca-cert
На каждом рабочем узле добавьте общий сертификат ЦС в хранилище доверия и хранилище ключей. Затем добавьте собственный подписанный сертификат рабочего узла в хранилище ключей.
keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -import -file cert-signed -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
Обновление конфигурации Kafka для использования TLS и перезапуска брокеров
Теперь вы настроили в каждом брокере Kafka хранилище ключей и хранилище доверия, а также импортировали правильные сертификаты. Далее измените связанные свойства конфигурации Kafka с помощью Ambari, а затем перезапустите брокеры Kafka.
Выполните следующие действия для завершения конфигурации:
Войдите на портал Azure и выберите свой кластер Azure HDInsight Apache Kafka.
Перейдите в пользовательский интерфейс Ambari, щелкнув домашнюю страницу Ambari в разделе Панели мониторинга кластера.
В разделе Kafka Broker (Брокер Kafka) задайте для свойства listeners значение
PLAINTEXT://localhost:9092,SSL://localhost:9093
.В разделе Advanced kafka-broker (Расширенный брокер Kafka) задайте для свойства security.inter.broker.protocol значение
SSL
.В разделе Custom kafka-broker (Пользовательский брокер Kafka) задайте для свойства ssl.client.auth значение
required
.Примечание.
Примечание. Этот шаг требуется только в том случае, если вы настраиваете проверку подлинности и шифрование.
Ниже показан снимок экрана, на котором показан пользовательский интерфейс конфигурации Ambari с этими изменениями.
Примечание.
- ssl.keystore.location и ssl.truststore.location — полный путь к хранилищу ключей, расположению truststore в центре сертификации (hn0)
- ssl.keystore.password и ssl.truststore.password — это пароль для хранилища ключей и truststore. В этом случае в качестве примера
MyServerPassword123
- ssl.key.password — это набор ключей для хранилища ключей и хранилища доверия. В этом случае в качестве примера
MyServerPassword123
Использование TLS 1.3 в Kafka
Добавьте следующие конфигурации в конфигурации kafka в Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Внимание
- TLS 1.3 работает только с версией HDI 5.1 kafka.
- При использовании TLS 1.3 на стороне сервера также следует использовать конфигурации TLS 1.3 в клиенте.
Для HDI версии 4.0 или 5.0
- Если вы настраиваете проверку подлинности и шифрование, снимок экрана выглядит следующим образом.
- Если вы настраиваете только шифрование, снимок экрана выглядит следующим образом.
Перезапустите все брокеры Kafka.
Установка клиента (без проверки подлинности)
Если проверка подлинности не требуется, то сводка действий по настройке только шифрования TLS выглядит следующим образом.
- Войдите в ЦС (активный головной узел).
- Скопируйте сертификат ЦС на клиентский компьютер с компьютера ЦС (wn0).
- Войдите на клиентский компьютер (hn1) и перейдите в папку
~/ssl
. - Импортируйте сертификат ЦС в хранилище доверия.
- Импортируйте сертификат ЦС в хранилище ключей.
Эти действия подробно показаны в следующих фрагментах кода.
Войдите на узел ЦС.
ssh sshuser@HeadNode0_Name cd ssl
Скопируйте сертификат ca-cert на клиентский компьютер.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Войдите на клиентский компьютер (резервный головной узел).
ssh sshuser@HeadNode1_Name cd ssl
Импортируйте сертификат ЦС в хранилище доверия.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Импортируйте сертификат ЦС в хранилище ключей.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Создайте файл
client-ssl-auth.properties
на клиентском компьютере (hn1). В нем должны присутствовать следующие строки.security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123
- Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации
Запустите клиент администрирования с параметрами producer и consumer, чтобы убедиться, что как производители, так и потребители работают через порт 9093. Ознакомьтесь с разделом проверки подлинности , чтобы проверить настройку с помощью производителя консоли или потребителя.
Установка клиента (с проверкой подлинности)
Примечание.
Следующие действия требуются только в том случае, если вы настраиваете как проверку подлинности, так и шифрование TLS. Если вы настраиваете только шифрование, см. раздел Настройка клиента без проверки подлинности.
Следующие четыре шага охватывают задачи, необходимые для завершения настройки клиента.
- Войдите на клиентский компьютер (резервный головной узел).
- Создайте хранилище ключей Java и получите подписанный сертификат для брокера. Затем скопируйте сертификат на виртуальную машину, где запущен центр сертификации.
- Переключитесь на машину ЦС (активный головной узел), чтобы подписать этот сертификат клиента.
- Войдите на клиентский компьютер (резервный головной узел) и перейдите в папку
~/ssl
. Скопируйте подписанный сертификат на клиентский компьютер.
Даны сведения о каждом шаге.
Войдите на клиентский компьютер (резервный головной узел).
ssh sshuser@HeadNode1_Name
Удалите все существующие каталоги SSL.
rm -R ~/ssl mkdir ssl cd ssl
Создайте хранилище ключей Java и создайте запрос подписи сертификата.
keytool -genkey -keystore kafka.client.keystore.jks -validity 365 -storepass "MyClientPassword123" -keypass "MyClientPassword123" -dname "CN=HEADNODE1_FQDN" -storetype pkcs12 keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -storepass "MyClientPassword123" -keypass "MyClientPassword123"
Скопируйте запрос подписи сертификата в ЦС.
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
Переключитесь на машину ЦС (активный головной узел) и подпишите сертификат клиента.
ssh sshuser@HeadNode0_Name cd ssl openssl x509 -req -CA ca-cert -CAkey ca-key -in ~/ssl/client-cert-sign-request -out ~/ssl/client-cert-signed -days 365 -CAcreateserial -passin pass:MyClientPassword123
Скопируйте подписанный сертификат клиента из ЦС (активного головного узла) на клиентский компьютер.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
Скопируйте сертификат ca-cert на клиентский компьютер.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Войдите на клиентский компьютер (резервный головной узел) и перейдите в каталог ssl.
ssh sshuser@HeadNode1_Name cd ssl
Создайте клиентское хранилище с подписанным сертификатом, импортируйте сертификат ЦС в хранилище ключей и truststore на клиентском компьютере (hn1):
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -import -file client-signed-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Создайте файл
client-ssl-auth.properties
на клиентском компьютере (hn1). В нем должны присутствовать следующие строки.security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123 ssl.keystore.location=/home/sshuser/ssl/kafka.client.keystore.jks ssl.keystore.password=MyClientPassword123 ssl.key.password=MyClientPassword123
- Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации
Проверка
Выполните эти действия на клиентском компьютере.
Примечание.
Если установлены HDInsight 4.0 и Kafka 2.1, для проверки настройки можно использовать производителя/потребителей консоли. В противном случае запустите производитель Kafka в порте 9092 и отправьте сообщения в раздел, а затем используйте потребитель Kafka на порте 9093, который использует TLS.
Kafka 2.1 или более поздней версии
Создайте раздел, если он еще не существует.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
Запустите производителя консоли и укажите путь к
client-ssl-auth.properties
как к файлу конфигурации для производителя./usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.properties
Откройте другое SSH-подключение к клиентскому компьютеру, запустите потребителя консоли и укажите путь к
client-ssl-auth.properties
как к файлу конфигурации для потребителя./usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --bootstrap-server <FQDN_WORKER_NODE>:9093 --topic topic1 --consumer.config ~/ssl/client-ssl-auth.properties --from-beginning