Configurar a criptografia e autenticação TLS para um cluster não ESP do Apache Kafka no Azure HDInsight

Este artigo mostra como configurar a criptografia TLS, anteriormente conhecida como criptografia de protocolo SSL (SSL), entre clientes e agentes do Apache Kafka. Aqui, você também vai aprender a configurar a autenticação de clientes (às vezes chamados de TLS bidirecional).

Importante

Há dois clientes que você pode usar para aplicativos Kafka: um cliente Java e um de console. Somente o cliente Java ProducerConsumer.java pode usar o TLS para produção e consumo. O cliente do produtor do console console-producer.sh não funciona com o TLS.

Instalação do Apache Kafka Broker

A configuração do agente TLS do Kafka usa quatro VMs do cluster do HDInsight da seguinte maneira:

  • Nó de cabeçalho 0 - AC (Autoridade de Certificação)
  • nó de trabalho 0, 1 e 2 - agentes

Observação

Este guia usará certificados autoassinados, mas a solução mais segura é usar certificados emitidos por autoridades de certificação confiáveis.

O resumo do processo de configuração do agente é o seguinte:

  1. As etapas a seguir são repetidas em cada um dos três nós de trabalho:

    1. Gere um certificado.
    2. Criar uma solicitação de assinatura de certificado.
    3. Envie a solicitação de assinatura de certificado para a autoridade de certificação (CA).
    4. Entre na AC e assine a solicitação.
    5. SCP o certificado assinado de volta para o nó de trabalho.
    6. SCP o certificado público da autoridade de certificação para o nó de trabalho.
  2. Depois que você tiver todos os certificados, coloque-os no repositório de certificados.

  3. Acesse o Ambari e altere as configurações.

    Use as seguintes instruções detalhadas para concluir a configuração do agente:

    Importante

    Nos trechos de código a seguir, wnX é uma abreviação de um dos três nós de trabalho e deve ser substituído wn0 por wn1 ou wn2 conforme apropriado. WorkerNode0_Name e HeadNode0_Name devem ser substituídos pelos nomes dos respectivas máquinas.

  4. Execute a configuração inicial no nó de cabeçalho 0 que, para o HDInsight, preencherá a função da Autoridade de Certificação (CA).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Execute a mesma configuração inicial em cada um dos agentes (nós de trabalho 0, 1 e 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. Em cada um dos nós de trabalho, execute as etapas a seguir usando o trecho de código.

    1. Crie um repositório de chaves e popule-o com um novo certificado privado.
    2. Crie uma solicitação de assinatura de certificado
    3. SCP a solicitação de assinatura de certificado para a autoridade de certificação (nó de cabeçalho 0)
    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
    

    Observação

    FQDN_WORKER_NODE é o Nome de Domínio Totalmente Qualificado do computador do nó de trabalho. É possível obter esses detalhes no arquivo /etc/hosts no nó principal

    Por exemplo,

    wn0-espkaf.securehadooprc.onmicrosoft.com
    wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
    

    Captura de tela mostrando a saída do arquivo de host.

  7. No computador de AC, execute o seguinte comando para criar arquivos ca-cert e ca-key:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. Altere para a máquina da autoridade de certificação e assine todas as solicitações de assinatura de certificado recebidas:

    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. Envie os certificados assinados de volta para os nós de trabalho da autoridade de certificação (nó de cabeçalho 0).

    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. Envie o certificado público da autoridade de certificação para cada nó de trabalho.

    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. Em cada nó de trabalho, adicione o certificado público de autoridades de certificação ao truststore e ao repositório de chaves (KeyStore). Em seguida, adicione o próprio certificado assinado do nó de trabalho ao repositório de chaves

    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
    
    

Atualizar a configuração do Kafka para usar TLS e reiniciar os agentes

Agora você configurou cada agente do Kafka com um repositório de chaves e truststore e importou os certificados corretos. Em seguida, modifique as propriedades de configuração do Kafka relacionadas usando o Ambari e reinicie os agentes do Kafka.

Execute as seguintes etapas para concluir a modificação à configuração:

  1. Entre no portal do Azure e selecione seu cluster do Apache Kafka do Azure HDInsight.

  2. Vá para a interface do usuário do Ambari, clicando em Página Inicial do Ambari nos Painéis do cluster.

  3. Em Agente do Kafka, defina a propriedade ouvintes para PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. Sob Agente avançado do Kafka, defina a propriedade security.inter.broker.protocol para SSL

    Editar as propriedades de configuração de SSL do Kafka no Ambari

  5. Em Agente do Kafka personalizado, defina a propriedade ssl.client.auth para required.

    Observação

    Observação: essa etapa só é necessária se você estiver configurando a autenticação e a criptografia.

    Editar as propriedades de configuração de SSL do Kafka no Ambari

  6. Esta é a captura de tela que mostra a interface do usuário de configuração do Ambari com essas alterações.

    Observação

    1. ssl.keystore.location e ssl.truststore.location é o caminho completo do repositório de chaves, local do truststore na Autoridade de Certificação (hn0)
    2. ssl.keystore.password e ssl.truststore.password é a senha definida para o repositório de chaves e truststore. Nesse caso, como exemplo, temosMyServerPassword123
    3. ssl.key.password é o conjunto de chaves para o repositório de chaves e trust store. Nesse caso, como exemplo, temosMyServerPassword123
  7. Para usar o TLS 1.3 no Kafka

    Adicionar as configurações a seguir às configurações do Kafka no Ambari

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

    Importante

    1. O TLS 1.3 funciona apenas com a versão Kafka do HDI 5.1.
    2. Se você usar o TLS 1.3 no lado do servidor, deverá usar configurações TLS 1.3 no cliente também.
  8. Para HDI versão 4.0 ou 5.0

    1. Se você estiver configurando a autenticação e a criptografia, a captura de tela será semelhante a

    Editar a propriedade do modelo kafka-env no Ambari 4

    1. Se você estiver configurando apenas a criptografia, a captura de tela será semelhante a

    Captura de tela mostrando como editar o campo de propriedade do modelo kafka-env no Ambari somente para criptografia.

  9. Reinicie todos os agentes do Kafka.

Configuração do cliente (sem autenticação)

Se você não precisar de autenticação, o resumo das etapas para configurar somente a criptografia TLS será:

  1. Entre na autoridade de certificação (nó principal ativo).
  2. Do computador da autoridade de certificação (wn0), copie o certificado da autoridade de certificação para o computador cliente.
  3. Entre no computador cliente (hn1) e navegar até a pasta ~/ssl.
  4. Importe o certificado da autoridade de certificação para a truststore.
  5. Importe o certificado da autoridade de certificação para o repositório de chaves.

Essas etapas são detalhadas nos seguintes snippets de código.

  1. Entre no nó da autoridade de certificação.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Copiar o certificado da autoriade de certificação para o computador cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Entre no computador cliente (nó de cabeçalho em standby).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Importe o certificado da autoridade de certificação para a truststore.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Importe o certificado da autoridade de certificação para repositório de chaves.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Crie o arquivo client-ssl-auth.properties no computador cliente (hn1). Ele deve conter as seguintes linhas:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Para usar o TLS 1.3, adicione as seguintes configurações ao arquivo client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Inicie o cliente administrador com as opções produtor e consumidor para verificar se os produtores e os consumidores estão trabalhando na porta 9093. Consulte a seção Verificação para obter as etapas necessárias para verificar a configuração usando o produtor/consumidor do console.

Configuração do cliente (com autenticação)

Observação

As etapas a seguir são necessárias apenas se você está configurando a criptografia TLS e também a autenticação. Se você estiver configurando somente a criptografia, acesse Configuração do cliente sem autenticação.

As quatro etapas a seguir resumem as tarefas necessárias para concluir a configuração do cliente:

  1. Entre no computador cliente (nó de cabeçalho em standby).
  2. Crie um repositório de chaves Java e obtenha um certificado assinado para o agente. Em seguida, copie o certificado para a VM em que a autoridade de certificação está sendo executada.
  3. Alterne para a máquina da autoridade de certificação (wn0) para assinar o certificado do cliente.
  4. Vá para a máquina do cliente (nó de cabeçalho em standby) e navegue até a pasta ~/ssl. Copie o certificado autoassinado para o computador cliente.

Os detalhes de cada etapa são fornecidos.

  1. Entre no computador cliente (nó de cabeçalho em standby).

    ssh sshuser@HeadNode1_Name
    
  2. Remova qualquer diretório SSL existente.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Crie um repositório de chaves Java e crie uma solicitação de assinatura de certificado.

    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. Copie a solicitação de assinatura de certificado para a autoridade de certificação

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Alterne para a máquina da autoridade de certificação (wn0) e assine o certificado do cliente.

    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. Copie o certificado do cliente assinado da autoridade de certificação (nó principal ativo) para o computador do cliente.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Copiar o certificado da autoridade de certificação para o computador cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Acesse a máquina do cliente (nó de cabeçalho em standby) e navegue até o diretório SSL.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Crie um armazenamento de cliente com certificado assinado, importe a AC do certificado para o repositório de chaves e truststore no computador cliente (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. Crie um arquivo client-ssl-auth.properties no computador cliente (hn1). Ele deve conter as seguintes linhas:

    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. Para usar o TLS 1.3, adicione as seguintes configurações ao arquivo client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Verificação

Execute estas etapas no computador cliente.

Observação

Se o HDInsight 4.0 e o Kafka 2.1 estiverem instalados, você poderá usar o produtor do console/consumidores para verificar sua configuração. Caso contrário, execute o produtor do Kafka na porta 9092 e envie mensagens para o tópico e, em seguida, use o consumidor do Kafka na porta 9093 que usa TLS.

Kafka 2.1 ou superior

  1. Crie um tópico se ainda não existir nenhum.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Inicie o produtor do console e forneça o caminho para client-ssl-auth.properties como um arquivo de configuração para o produtor.

    /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. Abra outra conexão SSH com o computador cliente e inicie o consumidor do console. Forneça o caminho para client-ssl-auth.properties como um arquivo de configuração do consumidor.

    /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
    

Próximas etapas