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:
As etapas a seguir são repetidas em cada um dos três nós de trabalho:
- Gere um certificado.
- Crie uma solicitação de assinatura de certificado.
- Envie a solicitação de assinatura de certificado para a Autoridade de Certificação (CA).
- Inicie sessão na AC e assine o pedido.
- 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 de ter todos os certificados, coloque-os no armazenamento de certificados.
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
ouwn2
conforme apropriado.WorkerNode0_Name
eHeadNode0_Name
deve ser substituído pelos nomes das respetivas máquinas.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
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
Em cada um dos nós de trabalho, execute as seguintes etapas usando o trecho de código.
- Crie um keystore e preencha-o com um novo certificado privado.
- Crie uma solicitação de assinatura de certificado.
- 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
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
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"
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
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 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:
Entre no portal do Azure e selecione seu cluster Apache Kafka do Azure HDInsight.
Vá para a interface do usuário do Ambari clicando em Página inicial do Ambari em Painéis de cluster.
Sob Kafka Broker defina a propriedade listeners como
PLAINTEXT://localhost:9092,SSL://localhost:9093
Em Advanced kafka-broker , defina a propriedade security.inter.broker.protocol como
SSL
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.
Aqui está a captura de tela que mostra a interface do usuário de configuração do Ambari com essas alterações.
Nota
- ssl.keystore.location e ssl.truststore.location é o caminho completo do seu keystore, local de armazenamento confiável na Autoridade de Certificação (hn0)
- ssl.keystore.password e ssl.truststore.password é a senha definida para o keystore e truststore. Neste caso, a título de exemplo,
MyServerPassword123
- ssl.key.password é o conjunto de chaves para o armazenamento de chaves e armazenamento confiável. Neste caso, a título de exemplo,
MyServerPassword123
Para usar TLS 1.3 em Kafka
Adicione as seguintes configurações às configurações 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 as configurações do 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 terá a aparência de
- Se estiver a configurar apenas encriptação, a captura de ecrã tem o aspeto de
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:
- Faça login na autoridade de certificação (nó principal ativo).
- Copie o certificado da autoridade de certificação para a máquina cliente da máquina da autoridade de certificação (wn0).
- Entre na máquina cliente (hn1) e navegue até a
~/ssl
pasta. - Importe o certificado da autoridade de certificação para o armazenamento confiável.
- 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.
Faça login no nó da autoridade de certificação.
ssh sshuser@HeadNode0_Name cd ssl
Copie o ca-cert para a máquina cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Inicie sessão na máquina cliente (nó principal em espera).
ssh sshuser@HeadNode1_Name cd ssl
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
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
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
- 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 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:
- Inicie sessão na máquina cliente (nó principal em espera).
- 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.
- Mude para a máquina CA (nó principal ativo) para assinar o certificado do cliente.
- 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.
Inicie sessão na máquina cliente (nó principal em espera).
ssh sshuser@HeadNode1_Name
Remova qualquer diretório ssl existente.
rm -R ~/ssl mkdir ssl cd ssl
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"
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 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
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
Copie o ca-cert para a máquina cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Entre na máquina cliente (nó principal em espera) e navegue até o diretório ssl.
ssh sshuser@HeadNode1_Name cd ssl
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
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
- 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 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
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
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 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