Configuración del cifrado y la autenticación TLS para clústeres no ESP de 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.
Programa de instalación de Apache Kafka Broker
El programa de instalación del agente de TLS de Kafka usa 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 usan 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
own2
, según corresponda.WorkerNode0_Name
yHeadNode0_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, rellena el rol de la entidad de certificación (CA).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
Realice 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 ssl
En cada uno de los nodos de trabajo, ejecute los pasos siguientes mediante el 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 -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 es el nombre de dominio completo de la máquina del nodo de trabajo. Puede obtener esos detalles del archivo /etc/hosts del nodo principal.
Por ejemplo,
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
En 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 -nodes
Cambie 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-signed
SCP 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-cert
En 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
.Nota
Nota: este paso solo es necesario si va a configurar la autenticación y el cifrado.
Esta captura de pantalla muestra la interfaz de usuario de configuración de Ambari con estos cambios.
Nota
- ssl.keystore.location y ssl.truststore.location es la ruta de acceso completa del almacén de claves, la ubicación del almacén de confianza en la entidad de certificación (hn0)
- ssl.keystore.password y ssl.truststore.password es la contraseña establecida para el almacén de claves y el almacén de confianza. En este caso como ejemplo,
MyServerPassword123
- ssl.key.password es la clave establecida para el almacén de claves y el almacén de confianza. En este caso como ejemplo,
MyServerPassword123
Para usar TLS 1.3 en Kafka, haga lo siguiente:
Agregue estas configuraciones a las configuraciones de Kafka en Ambari:
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Importante
- TLS 1.3 solo funciona con la versión HDI 5.1 de Kafka.
- Si usa TLS 1.3 en el lado servidor, también debe usar las configuraciones de TLS 1.3 en el lado cliente.
Para la versión 4.0 o 5.0 de HDI:
- Si va a configurar la autenticación y el cifrado, la captura de pantalla tiene el aspecto siguiente
- Si solo configura el cifrado, la captura de pantalla será similar a la siguiente:
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 en el almacén de confianza.
- Importe el certificado de CA en el 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 ssl
Copia 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).
ssh sshuser@HeadNode1_Name cd ssl
Importe 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" -noprompt
Importe 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" -noprompt
Cree el archivo
client-ssl-auth.properties
en 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
- Para usar TLS 1.3, agregue las siguientes configuraciones al archivo
client-ssl-auth.properties
.
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Para usar TLS 1.3, agregue las siguientes configuraciones al archivo
Inicie 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 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.
Se ofrecen los detalles de cada paso.
Inicie sesión en la máquina cliente (nodo principal en espera).
ssh sshuser@HeadNode1_Name
Quite todos los directorios de SSL existentes.
rm -R ~/ssl mkdir ssl cd ssl
Cree 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-request
Cambie 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:MyClientPassword123
Copie 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-cert
Copia 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 ssl
Cree 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" -noprompt
Cree un archivo
client-ssl-auth.properties
en 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
- Para usar TLS 1.3, agregue las siguientes configuraciones al archivo
client-ssl-auth.properties
.
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Para usar TLS 1.3, agregue las siguientes configuraciones al archivo
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 2
Inicie 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>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.properties
Abra otra conexión SSH a la máquina cliente, inicie el consumidor de consola y proporcione la ruta de acceso a
client-ssl-auth.properties
como 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