Configuración del cifrado y la autenticación TLS para Apache Kafka en Azure HDInsight
En este artículo se muestra cómo configurar el cifrado de Seguridad de la capa de transporte (TLS), conocido anteriormente como cifrado de Capa de sockets seguros (SSL), entre los clientes de Apache Kafka y los agentes de Apache Kafka. También se muestra cómo configurar la autenticación de los clientes (lo que a veces se conoce como TLS bidireccional).
Importante
Existen dos clientes que se pueden usar para las aplicaciones de Kafka: uno de Java y otro de consola. Solo el cliente de Java ProducerConsumer.java puede utilizar TLS para producir y consumir. El cliente de productor de consola console-producer.sh no funciona con TLS.
Nota
El productor de la consola de HDInsight Kafka con la versión 1.1 no admite SSL.
Programa de instalación de Apache Kafka Broker
El programa de instalación del agente de TLS de Kafka usará cuatro máquinas virtuales del clúster de HDInsight de la siguiente manera:
- Nodo principal 0: entidad de certificación (CA)
- nodo de trabajo 0, 1 y 2: agentes
Nota
En esta guía se usarán los certificados autofirmados, pero la solución más segura es usar certificados emitidos por entidades de certificación de confianza.
El resumen del proceso de instalación de agente es como sigue:
Los siguientes pasos se repiten en cada uno de los tres nodos de trabajo:
- Genere un certificado.
- Cree una solicitud de firma de certificado.
- Envíe la solicitud de firma del certificado a la entidad de certificación (CA).
- Inicie sesión en la entidad de certificación y firme la solicitud.
- SCP el certificado firmado de vuelta en el nodo de trabajo.
- SCP el certificado público de la entidad de certificación para el nodo de trabajo.
Una vez que tenga todos los certificados, colóquelos en el almacén de certificados.
Vaya a Ambari y cambie las configuraciones.
Utilice las siguientes instrucciones detalladas para completar la instalación del agente:
Importante
En los siguientes fragmentos de código, wnX es una abreviatura de uno de los tres nodos de trabajo y debe sustituirse por wn0, wn1 o wn2, según corresponda. WorkerNode0_Name y HeadNode0_Name deben sustituirse por los nombres de las máquinas respectivas.
Realice la instalación inicial en un nodo principal 0, lo que, para HDInsight, rellenará el rol de la entidad de certificación (CA).
# Create a new directory 'ssl' and change into it mkdir ssl cd sslRealice la misma configuración inicial en cada uno de los agentes (nodos de trabajo 0, 1 y 2).
# Create a new directory 'ssl' and change into it mkdir ssl cd sslEn cada uno de los nodos de trabajo, ejecute los pasos siguientes con el siguiente fragmento de código.
- Cree un almacén de claves y rellénelo con un nuevo certificado privado.
- Cree una solicitud de firma de certificados.
- SCP la solicitud de firma de certificado a la entidad de certificación (headnode0)
keytool -genkey -keystore kafka.server.keystore.jks -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=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-requestEn el equipo de la entidad de certificación, ejecute el siguiente comando para crear los archivos ca-cert y ca-key:
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodesCambie a la máquina de la entidad de certificación y firme todas las solicitudes de firma de certificado recibidas:
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"Envíe de vuelta los certificados firmados a los nodos de trabajo de la entidad de certificación (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-signedSCP el certificado público de la entidad de certificación para cada nodo de trabajo.
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-certEn cada nodo de trabajo, agregue el certificado público de la entidad de certificación al almacén de claves y truststore. A continuación, agregue el certificado firmado del nodo de trabajo al almacén de claves.
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
Actualización de la configuración de Kafka para usar TLS y reiniciar los agentes
Ya ha configurado cada agente de Kafka con un almacén de claves y truststore, y ha importado los certificados correctos. A continuación, modifique las propiedades de la configuración de Kafka relacionadas mediante Ambari y luego reinicie los agentes de Kafka.
Realice los pasos siguientes para completar la modificación de la configuración:
Inicie sesión en Azure Portal y seleccione el clúster de Apache Kafka de Azure HDInsight.
Vaya a la interfaz de usuario de Ambari; para ello, haga clic en Ambari home (Inicio de Ambari) en Cluster dashboards (Paneles del clúster).
En Kafka Broker (Agente de Kafka), establezca la propiedad listeners en
PLAINTEXT://localhost:9092,SSL://localhost:9093.En Advanced kafka-broker (Agente de Kafka avanzado), establezca la propiedad security.inter.broker.protocol en
SSL
En Custom kafka-broker (Agente de Kafka personalizado), establezca la propiedad ssl.client.auth en
required. Este paso solo es necesario si va a configurar la autenticación y el cifrado.
Para HDI 3.6, vaya a la interfaz de usuario de Ambari y agregue las siguientes configuraciones en las propiedades Advanced kafka-env y kafka-env template.
# Configure Kafka to advertise IP addresses instead of FQDN IP_ADDRESS=$(hostname -i) echo advertised.listeners=$IP_ADDRESS sed -i.bak -e '/advertised/{/advertised@/!d;}' /usr/hdp/current/kafka-broker/conf/server.properties echo "advertised.listeners=PLAINTEXT://$IP_ADDRESS:9092,SSL://$IP_ADDRESS:9093" >> /usr/hdp/current/kafka-broker/conf/server.properties echo "ssl.keystore.location=/home/sshuser/ssl/kafka.server.keystore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties echo "ssl.keystore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties echo "ssl.key.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties echo "ssl.truststore.location=/home/sshuser/ssl/kafka.server.truststore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties echo "ssl.truststore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.propertiesEsta captura de pantalla muestra la interfaz de usuario de configuración de Ambari con estos cambios.
Para la versión 3.6 de HDI:
Para la versión 4.0 de HDI:
Reinicie todos los agentes de Kafka.
Configuración del cliente (sin autenticación)
Si no necesita realizar la autenticación, el resumen de los pasos para configurar solamente el cifrado TLS es:
- Inicie sesión en la entidad de certificación (nodo principal activo).
- Copie el certificado de CA en la máquina cliente de la máquina de CA (wn0).
- Inicie sesión en la máquina cliente (hn1) y desplácese hasta la carpeta
~/ssl. - Importe el certificado de CA al almacén de confianza.
- Importe el certificado de CA al almacén de claves.
Estos pasos se describen en los siguientes fragmentos de código.
Inicie sesión en el nodo de CA.
ssh sshuser@HeadNode0_Name cd sslCopia del certificado de CA en la máquina cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-certInicie sesión en la máquina cliente (nodo principal en espera).
ssh sshuser@HeadNode1_Name cd sslImporte el certificado de CA en el almacén de confianza.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -nopromptImporte el certificado de CA en el almacén de claves.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -nopromptCree el archivo
client-ssl-auth.propertiesen la máquina cliente (hn1). Debe tener las siguientes líneas:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123Inicie el cliente de administración con las opciones de productor y consumidor para comprobar que tanto los productores como los consumidores están en funcionamiento en el puerto 9093. Consulte la sección Comprobación siguiente para ver los pasos necesarios para comprobar la configuración mediante el productor o consumidor de consola.
Configuración del cliente (con autenticación)
Nota
Los pasos siguientes solo son necesarios si va a configurar el cifrado y la autenticación TLS. Si simplemente va a configurar el cifrado, continúe con Configuración del cliente sin autenticación.
En los cuatro pasos siguientes se resumen las tareas necesarias para completar la configuración del cliente:
- Inicie sesión en la máquina cliente (nodo principal en espera).
- Cree un almacén de claves Java y obtenga un certificado firmado para el agente. A continuación, copie el certificado en la máquina virtual donde se ejecuta la entidad de certificación.
- Cambie a la máquina de la entidad de certificación (nodo principal activo) para firmar el certificado de cliente.
- Vaya a la máquina cliente (nodo principal en espera) y desplácese hasta la carpeta
~/ssl. Copie el certificado firmado en la máquina cliente.
A continuación se proporcionan los detalles de cada paso.
Inicie sesión en la máquina cliente (nodo principal en espera).
ssh sshuser@HeadNode1_NameQuite todos los directorios de SSL existentes.
rm -R ~/ssl mkdir ssl cd sslCree un almacén de claves de Java y una solicitud de firma 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"Copia de la solicitud de firma de certificado en la CA
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-requestCambie a la máquina de la entidad de certificación (nodo principal activo) y firme el certificado de 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:MyClientPassword123Copie el certificado de cliente firmado de la entidad de certificación (nodo principal activo) en la máquina cliente.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-certCopia del certificado de CA en la máquina cliente
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert- Inicie sesión en la máquina cliente (nodo principal en espera) y desplácese hasta el directorio ssl.
ssh sshuser@HeadNode1_Name cd sslCree un almacén de cliente con el certificado firmado e importe el certificado de CA en el almacén de claves y el almacén de confianza en la 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" -nopromptCree un archivo
client-ssl-auth.propertiesen la máquina cliente (hn1). Debe tener las siguientes líneas: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
Comprobación
Ejecute estos pasos en la máquina cliente.
Nota
Si se instala HDInsight 4.0 y Kafka 2.1, puede usar el productor o los consumidores de la consola para comprobar la configuración. Si no, ejecute el productor Kafka en el puerto 9092 y envíe mensajes al tema; luego, use el consumidor Kafka en el puerto 9093, que usa TLS.
Kafka 2.1 o superior
Cree un tema, si todavía no existe.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2Inicie el productor de la consola y proporcione la ruta de acceso a
client-ssl-auth.propertiescomo archivo de configuración para el productor./usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.propertiesAbra otra conexión SSH a la máquina cliente, inicie el consumidor de consola y proporcione la ruta de acceso a
client-ssl-auth.propertiescomo archivo de configuración para el 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
Kafka 1.1
Cree un tema, si todavía no existe.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE_0>:2181 --create --topic topic1 --partitions 2 --replication-factor 2Inicie el productor de la consola y proporcione la ruta de acceso a client-ssl-auth.properties como archivo de configuración para el productor.
/usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9092 --topic topic1Abra otra conexión SSH a la máquina cliente, inicie el consumidor de consola y proporcione la ruta de acceso a
client-ssl-auth.propertiescomo archivo de configuración para el 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