Настройка шифрования и проверки подлинности 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 — брокеры.

Примечание.

В этом руководстве используются самозаверяемые сертификаты, но наиболее безопасным решением является использование сертификатов, выданных доверенными центрами сертификации.

Ниже приведена сводка процесса настройки брокера.

  1. Следующие действия повторяются в каждом из трех рабочих узлов.

    1. Создайте сертификат.
    2. Создайте запрос на подпись сертификата.
    3. Отправьте запрос подписи сертификата в центр сертификации (ЦС).
    4. Войдите в ЦС и подпишите запрос.
    5. С помощью команды SCP отправьте подписанный сертификат обратно на рабочий узел.
    6. С помощью команды SCP отправьте открытый сертификат ЦС на рабочий узел.
  2. Получив все сертификаты, поместите их в хранилище сертификатов.

  3. Перейдите в Ambari и измените настройки.

    Используйте следующие подробные инструкции для завершения настройки брокера.

    Внимание

    В следующих фрагментах кода wnX представляет собой сокращенное обозначение одного из трех рабочих узлов, которое необходимо заменить на wn0, wn1 или wn2 соответственно. WorkerNode0_Name и HeadNode0_Name следует заменить на имена соответствующих машин.

  4. Выполните начальную настройку на головном узле 0, который для HDInsight заполняет роль центра сертификации (ЦС).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Выполните ту же начальную настройку в каждом брокере (на рабочих узлах 0, 1 и 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. На каждом рабочем узле выполните следующие действия с помощью фрагмента кода.

    1. Создайте хранилище ключей и заполните его новым закрытым сертификатом.
    2. Создайте запрос на подпись сертификата.
    3. С помощью 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
    

    Снимок экрана: выходные данные файла узлов.

  7. На компьютере ЦС выполните следующую команду, чтобы создать файлы 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
    
  8. Перейдите на машину ЦС и подпишите все полученные запросы на подпись сертификатов:

    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"
    
  9. Отправьте подписанные сертификаты из центра сертификации (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
    
  10. Отправьте общий сертификат ЦС на каждый рабочий узел.

    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
    
  11. На каждом рабочем узле добавьте общий сертификат ЦС в хранилище доверия и хранилище ключей. Затем добавьте собственный подписанный сертификат рабочего узла в хранилище ключей.

    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.

Выполните следующие действия для завершения конфигурации:

  1. Войдите на портал Azure и выберите свой кластер Azure HDInsight Apache Kafka.

  2. Перейдите в пользовательский интерфейс Ambari, щелкнув домашнюю страницу Ambari в разделе Панели мониторинга кластера.

  3. В разделе Kafka Broker (Брокер Kafka) задайте для свойства listeners значение PLAINTEXT://localhost:9092,SSL://localhost:9093.

  4. В разделе Advanced kafka-broker (Расширенный брокер Kafka) задайте для свойства security.inter.broker.protocol значение SSL.

    Изменение свойств конфигурации SSL Kafka в Ambari.

  5. В разделе Custom kafka-broker (Пользовательский брокер Kafka) задайте для свойства ssl.client.auth значение required.

    Примечание.

    Примечание. Этот шаг требуется только в том случае, если вы настраиваете проверку подлинности и шифрование.

    Изменение свойств конфигурации SSL kafka в Ambari.

  6. Ниже показан снимок экрана, на котором показан пользовательский интерфейс конфигурации Ambari с этими изменениями.

    Примечание.

    1. ssl.keystore.location и ssl.truststore.location — полный путь к хранилищу ключей, расположению truststore в центре сертификации (hn0)
    2. ssl.keystore.password и ssl.truststore.password — это пароль для хранилища ключей и truststore. В этом случае в качестве примера MyServerPassword123
    3. ssl.key.password — это набор ключей для хранилища ключей и хранилища доверия. В этом случае в качестве примера MyServerPassword123
  7. Использование TLS 1.3 в Kafka

    Добавьте следующие конфигурации в конфигурации kafka в Ambari

    1. ssl.enabled.protocols=TLSv1.3
    2. ssl.protocol=TLSv1.3

    Внимание

    1. TLS 1.3 работает только с версией HDI 5.1 kafka.
    2. При использовании TLS 1.3 на стороне сервера также следует использовать конфигурации TLS 1.3 в клиенте.
  8. Для HDI версии 4.0 или 5.0

    1. Если вы настраиваете проверку подлинности и шифрование, снимок экрана выглядит следующим образом.

    Изменение свойства шаблона kafka-env в Ambari четыре.

    1. Если вы настраиваете только шифрование, снимок экрана выглядит следующим образом.

    Снимок экрана: изменение поля свойства шаблона kafka-env в Ambari только для шифрования.

  9. Перезапустите все брокеры Kafka.

Установка клиента (без проверки подлинности)

Если проверка подлинности не требуется, то сводка действий по настройке только шифрования TLS выглядит следующим образом.

  1. Войдите в ЦС (активный головной узел).
  2. Скопируйте сертификат ЦС на клиентский компьютер с компьютера ЦС (wn0).
  3. Войдите на клиентский компьютер (hn1) и перейдите в папку ~/ssl.
  4. Импортируйте сертификат ЦС в хранилище доверия.
  5. Импортируйте сертификат ЦС в хранилище ключей.

Эти действия подробно показаны в следующих фрагментах кода.

  1. Войдите на узел ЦС.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Скопируйте сертификат ca-cert на клиентский компьютер.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Войдите на клиентский компьютер (резервный головной узел).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Импортируйте сертификат ЦС в хранилище доверия.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Импортируйте сертификат ЦС в хранилище ключей.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Создайте файл client-ssl-auth.properties на клиентском компьютере (hn1). В нем должны присутствовать следующие строки.

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Запустите клиент администрирования с параметрами producer и consumer, чтобы убедиться, что как производители, так и потребители работают через порт 9093. Ознакомьтесь с разделом проверки подлинности , чтобы проверить настройку с помощью производителя консоли или потребителя.

Установка клиента (с проверкой подлинности)

Примечание.

Следующие действия требуются только в том случае, если вы настраиваете как проверку подлинности, так и шифрование TLS. Если вы настраиваете только шифрование, см. раздел Настройка клиента без проверки подлинности.

Следующие четыре шага охватывают задачи, необходимые для завершения настройки клиента.

  1. Войдите на клиентский компьютер (резервный головной узел).
  2. Создайте хранилище ключей Java и получите подписанный сертификат для брокера. Затем скопируйте сертификат на виртуальную машину, где запущен центр сертификации.
  3. Переключитесь на машину ЦС (активный головной узел), чтобы подписать этот сертификат клиента.
  4. Войдите на клиентский компьютер (резервный головной узел) и перейдите в папку ~/ssl. Скопируйте подписанный сертификат на клиентский компьютер.

Даны сведения о каждом шаге.

  1. Войдите на клиентский компьютер (резервный головной узел).

    ssh sshuser@HeadNode1_Name
    
  2. Удалите все существующие каталоги SSL.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Создайте хранилище ключей 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"
    
  4. Скопируйте запрос подписи сертификата в ЦС.

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Переключитесь на машину ЦС (активный головной узел) и подпишите сертификат клиента.

    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
    
  6. Скопируйте подписанный сертификат клиента из ЦС (активного головного узла) на клиентский компьютер.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Скопируйте сертификат ca-cert на клиентский компьютер.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Войдите на клиентский компьютер (резервный головной узел) и перейдите в каталог ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Создайте клиентское хранилище с подписанным сертификатом, импортируйте сертификат ЦС в хранилище ключей и 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
    
  9. Создайте файл 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
    
    1. Чтобы использовать TLS 1.3, добавьте в файл следующие конфигурации client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Проверка

Выполните эти действия на клиентском компьютере.

Примечание.

Если установлены HDInsight 4.0 и Kafka 2.1, для проверки настройки можно использовать производителя/потребителей консоли. В противном случае запустите производитель Kafka в порте 9092 и отправьте сообщения в раздел, а затем используйте потребитель Kafka на порте 9093, который использует TLS.

Kafka 2.1 или более поздней версии

  1. Создайте раздел, если он еще не существует.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  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
    
  3. Откройте другое 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
    

Следующие шаги