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:
As etapas a seguir são repetidas em cada um dos três nós de trabalho:
- Gere um certificado.
- Criar uma solicitação de assinatura de certificado.
- Envie a solicitação de assinatura de certificado para a autoridade de certificação (CA).
- Entre na AC e assine a solicitação.
- SCP o certificado assinado de volta para o nó de trabalho.
- SCP o certificado público da autoridade de certificação para o nó de trabalho.
Depois que você tiver todos os certificados, coloque-os no repositório de certificados.
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
porwn1
ouwn2
conforme apropriado.WorkerNode0_Name
eHeadNode0_Name
devem ser substituídos pelos nomes dos respectivas máquinas.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
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
Em cada um dos nós de trabalho, execute as etapas a seguir usando o trecho de código.
- Crie um repositório de chaves e popule-o com um novo certificado privado.
- Crie uma solicitação de assinatura de certificado
- 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
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
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"
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
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
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:
Entre no portal do Azure e selecione seu cluster do Apache Kafka do Azure HDInsight.
Vá para a interface do usuário do Ambari, clicando em Página Inicial do Ambari nos Painéis do cluster.
Em Agente do Kafka, defina a propriedade ouvintes para
PLAINTEXT://localhost:9092,SSL://localhost:9093
Sob Agente avançado do Kafka, defina a propriedade security.inter.broker.protocol para
SSL
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.
Esta é a captura de tela que mostra a interface do usuário de configuração do Ambari com essas alterações.
Observação
- ssl.keystore.location e ssl.truststore.location é o caminho completo do repositório de chaves, local do truststore na Autoridade de Certificação (hn0)
- ssl.keystore.password e ssl.truststore.password é a senha definida para o repositório de chaves e truststore. Nesse caso, como exemplo, temos
MyServerPassword123
- ssl.key.password é o conjunto de chaves para o repositório de chaves e trust store. Nesse caso, como exemplo, temos
MyServerPassword123
Para usar o TLS 1.3 no Kafka
Adicionar as configurações a seguir às configurações do Kafka no Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Importante
- O TLS 1.3 funciona apenas com a versão Kafka do HDI 5.1.
- Se você usar o TLS 1.3 no lado do servidor, deverá usar configurações TLS 1.3 no cliente também.
Para HDI versão 4.0 ou 5.0
- Se você estiver configurando a autenticação e a criptografia, a captura de tela será semelhante a
- Se você estiver configurando apenas a criptografia, a captura de tela será semelhante a
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á:
- Entre na autoridade de certificação (nó principal ativo).
- Do computador da autoridade de certificação (wn0), copie o certificado da autoridade de certificação para o computador cliente.
- Entre no computador cliente (hn1) e navegar até a pasta
~/ssl
. - Importe o certificado da autoridade de certificação para a truststore.
- 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.
Entre no nó da autoridade de certificação.
ssh sshuser@HeadNode0_Name cd ssl
Copiar o certificado da autoriade de certificação para o computador cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Entre no computador cliente (nó de cabeçalho em standby).
ssh sshuser@HeadNode1_Name cd ssl
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
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
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
- 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
- Para usar o TLS 1.3, adicione as seguintes configurações ao arquivo
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:
- Entre no computador cliente (nó de cabeçalho em standby).
- 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.
- Alterne para a máquina da autoridade de certificação (wn0) para assinar o certificado do cliente.
- 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.
Entre no computador cliente (nó de cabeçalho em standby).
ssh sshuser@HeadNode1_Name
Remova qualquer diretório SSL existente.
rm -R ~/ssl mkdir ssl cd ssl
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"
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
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
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
Copiar o certificado da autoridade de certificação para o computador cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- 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
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
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
- 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
- Para usar o TLS 1.3, adicione as seguintes configurações ao arquivo
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
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
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
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