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

Este artigo mostra como configurar a criptografia Transport Layer Security (TLS), anteriormente conhecida como criptografia SSL (Secure Sockets Layer), entre clientes Apache Kafka e corretores Apache Kafka. Ele também mostra como configurar a autenticação de clientes (às vezes referida como TLS bidirecional).

Importante

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

Configuração do corretor Apache Kafka

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

  • headnode 0 - Autoridade de certificação (CA)
  • nó de trabalhador 0, 1 e 2 - corretores

Nota

Este guia usa 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 broker é 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. Crie uma solicitação de assinatura de certificado.
    3. Envie a solicitação de assinatura de certificado para a Autoridade de Certificação (CA).
    4. Inicie sessão na AC e assine o pedido.
    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 de ter todos os certificados, coloque-os no armazenamento de certificados.

  3. Vá para Ambari e altere as configurações.

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

    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 por wn0, wn1 ou wn2 conforme apropriado. WorkerNode0_Name e HeadNode0_Name deve ser substituído pelos nomes das respetivas máquinas.

  4. Execute a configuração inicial no nó principal 0, que para o HDInsight preenche 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 brokers (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 seguintes etapas usando o trecho de código.

    1. Crie um keystore e preencha-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 CA (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
    

    Nota

    FQDN_WORKER_NODE é o nome de domínio totalmente qualificado da máquina do nó de trabalho. Você pode obter esses detalhes do 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 hosts.

  7. Na máquina CA, 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. Mude 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 (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. 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 das autoridades de certificação ao armazenamento confiável e ao armazenamento de chaves. Em seguida, adicione o próprio certificado assinado do nó de trabalho ao keystore

    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
    
    

Atualize a configuração do Kafka para usar TLS e reiniciar corretores

Agora você configurou cada corretor Kafka com um keystore e truststore e importou os certificados corretos. Em seguida, modifique as propriedades de configuração Kafka relacionadas usando Ambari e, em seguida, reinicie os corretores Kafka.

Para concluir a modificação da configuração, execute as seguintes etapas:

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

  2. Vá para a interface do usuário do Ambari clicando em Página inicial do Ambari em Painéis de cluster.

  3. Sob Kafka Broker defina a propriedade listeners como PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. Em Advanced kafka-broker , defina a propriedade security.inter.broker.protocol como SSL

    Editando propriedades de configuração do Kafka ssl no Ambari.

  5. Em Custom kafka-broker , defina a propriedade ssl.client.auth como required.

    Nota

    Nota: Este passo só é necessário se estiver a configurar a autenticação e encriptação.

    Editando propriedades de configuração kafka ssl no Ambari.

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

    Nota

    1. ssl.keystore.location e ssl.truststore.location é o caminho completo do seu keystore, local de armazenamento confiável na Autoridade de Certificação (hn0)
    2. ssl.keystore.password e ssl.truststore.password é a senha definida para o keystore e truststore. Neste caso, a título de exemplo, MyServerPassword123
    3. ssl.key.password é o conjunto de chaves para o armazenamento de chaves e armazenamento confiável. Neste caso, a título de exemplo, MyServerPassword123
  7. Para usar TLS 1.3 em Kafka

    Adicione as seguintes configurações às configurações 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 as configurações do 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 terá a aparência de

    Editando a propriedade do modelo kafka-env no Ambari quatro.

    1. Se estiver a configurar apenas encriptação, a captura de ecrã tem o aspeto de

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

  9. Reinicie todos os corretores Kafka.

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

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

  1. Faça login na autoridade de certificação (nó principal ativo).
  2. Copie o certificado da autoridade de certificação para a máquina cliente da máquina da autoridade de certificação (wn0).
  3. Entre na máquina cliente (hn1) e navegue até a ~/ssl pasta.
  4. Importe o certificado da autoridade de certificação para o armazenamento confiável.
  5. Importe o certificado da autoridade de certificação para o armazenamento de chaves.

Essas etapas são detalhadas nos trechos de código a seguir.

  1. Faça login no nó da autoridade de certificação.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Copie o ca-cert para a máquina cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Inicie sessão na máquina cliente (nó principal em espera).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Importe o certificado da autoridade de certificação para o armazenamento confiável.

    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 keystore.

    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 na máquina cliente (hn1). Deve ter 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 do produtor e do consumidor para verificar se os produtores e os consumidores estão trabalhando na porta 9093. Consulte a seção Verificação para conhecer as etapas necessárias para verificar a configuração usando o produtor/consumidor do console.

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

Nota

As etapas a seguir são necessárias somente se você estiver configurando a criptografia e a autenticação TLS. Se você estiver apenas configurando a criptografia, consulte 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. Inicie sessão na máquina cliente (nó principal em espera).
  2. Crie um keystore Java e obtenha um certificado assinado para o broker. Em seguida, copie o certificado para a VM onde a autoridade de certificação está sendo executada.
  3. Mude para a máquina CA (nó principal ativo) para assinar o certificado do cliente.
  4. Vá para a máquina cliente (nó principal em espera) e navegue até a ~/ssl pasta. Copie o certificado assinado para a máquina cliente.

Os detalhes de cada etapa são fornecidos.

  1. Inicie sessão na máquina cliente (nó principal em espera).

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

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Crie um keystore 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 CA (nó principal ativo) 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 de cliente assinado da autoridade de certificação (nó principal ativo) para a máquina cliente.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Copie o ca-cert para a máquina cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Entre na máquina cliente (nó principal em espera) e navegue até o diretório ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Crie armazenamento de cliente com certificado assinado, importe certificado de CA para o keystore e armazenamento confiável na máquina 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 na máquina cliente (hn1). Deve ter 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 na máquina cliente.

Nota

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

Kafka 2.1 ou superior

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

    /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 a máquina cliente e inicie o consumidor do console e forneça o caminho para client-ssl-auth.properties como um arquivo de configuração para o 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óximos passos