Поделиться через


Настройка шифрования и проверки подлинности TLS для кластера Apache Kafka non-ESP в Azure HDInsight

В этой статье показано, как настроить шифрование ПРОТОКОЛА TLS, ранее известное как шифрование SSL между клиентами Apache Kafka и брокерами Apache Kafka. В нем также показано, как настроить проверку подлинности клиентов (иногда называется двусторонним TLS).

Это важно

Существует два клиента, которые можно использовать для приложений Kafka: клиент Java и консольный клиент. Только клиент ProducerConsumer.java Java может использовать TLS для производства и использования. Клиент console-producer.sh производителя консоли не работает с TLS.

Настройка брокера Apache Kafka

Настройка брокера TLS Kafka использует четыре виртуальных машины кластера HDInsight следующим образом:

  • headnode 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
    

    Снимок экрана: содержимое файла hosts.

  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" задайте для свойства прослушивателей значение PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. В разделе Advanced kafka-broker задайте для свойства security.inter.broker.protocol значение SSL

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

  5. В разделе Custom kafka-broker задайте для свойства ssl.client.auth значение required.

    Примечание.

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

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

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

    Примечание.

    1. ssl.keystore.location и ssl.truststore.location — это полный путь к вашему хранилищу ключей и хранилищу доверенных сертификатов в центре сертификации (hn0)
    2. ssl.keystore.password и ssl.truststore.password — это пароли, установленные для хранилища ключей и хранилища доверия. В этом случае в качестве примера 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 4.

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

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

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

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

Если вам не нужна проверка подлинности, сводка действий по настройке только шифрования TLS:

  1. Войдите в CA (активный управляющий узел).
  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. Запустите клиент администратора с параметрами производителя и потребителя, чтобы убедиться, что оба производителя и потребители работают над портом 9093. Обратитесь к разделу Verification, чтобы узнать шаги, необходимые для проверки настройки с помощью консольного продюсера/консюмера.

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

Примечание.

Следующие действия необходимы, только если вы настраиваете шифрование 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. Переключитесь на машину CA (активный головной узел) и подпишите клиентский сертификат.

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

Дальнейшие действия