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:

  1. Los siguientes pasos se repiten en cada uno de los tres nodos de trabajo:

    1. Genere un certificado.
    2. Cree una solicitud de firma de certificado.
    3. Envíe la solicitud de firma del certificado a la entidad de certificación (CA).
    4. Inicie sesión en la entidad de certificación y firme la solicitud.
    5. SCP el certificado firmado de vuelta en el nodo de trabajo.
    6. SCP el certificado público de la entidad de certificación para el nodo de trabajo.
  2. Una vez que tenga todos los certificados, colóquelos en el almacén de certificados.

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

  4. 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
    
  5. 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
    
  6. En cada uno de los nodos de trabajo, ejecute los pasos siguientes mediante el fragmento de código.

    1. Cree un almacén de claves y rellénelo con un nuevo certificado privado.
    2. Cree una solicitud de firma de certificados.
    3. 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
    

    Captura de pantalla que muestra la salida del archivo hosts.

  7. 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
    
  8. 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"
    
  9. 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
    
  10. 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
    
  11. 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:

  1. Inicie sesión en Azure Portal y seleccione el clúster de Apache Kafka de Azure HDInsight.

  2. 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).

  3. En Kafka Broker (Agente de Kafka), establezca la propiedad listeners en PLAINTEXT://localhost:9092,SSL://localhost:9093.

  4. En Advanced kafka-broker (Agente de Kafka avanzado), establezca la propiedad security.inter.broker.protocol en SSL

    Edición de las propiedades de configuración de SSL de Kafka en Ambari.

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

    Edición de las propiedades de configuración de SSL de Kafka en Ambari.

  6. Esta captura de pantalla muestra la interfaz de usuario de configuración de Ambari con estos cambios.

    Nota

    1. 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)
    2. 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
    3. 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
  7. Para usar TLS 1.3 en Kafka, haga lo siguiente:

    Agregue estas configuraciones a las configuraciones de Kafka en Ambari:

    1. ssl.enabled.protocols=TLSv1.3
    2. ssl.protocol=TLSv1.3

    Importante

    1. TLS 1.3 solo funciona con la versión HDI 5.1 de Kafka.
    2. Si usa TLS 1.3 en el lado servidor, también debe usar las configuraciones de TLS 1.3 en el lado cliente.
  8. Para la versión 4.0 o 5.0 de HDI:

    1. Si va a configurar la autenticación y el cifrado, la captura de pantalla tiene el aspecto siguiente

    Edición de la propiedad de plantilla kafka-env en Ambari cuatro.

    1. Si solo configura el cifrado, la captura de pantalla será similar a la siguiente:

    Captura de pantalla que muestra cómo editar el campo de propiedad de plantilla kafka-env en Ambari solo para el cifrado.

  9. 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:

  1. Inicie sesión en la entidad de certificación (nodo principal activo).
  2. Copie el certificado de CA en la máquina cliente de la máquina de CA (wn0).
  3. Inicie sesión en la máquina cliente (hn1) y desplácese hasta la carpeta ~/ssl.
  4. Importe el certificado de CA en el almacén de confianza.
  5. Importe el certificado de CA en el almacén de claves.

Estos pasos se describen en los siguientes fragmentos de código.

  1. Inicie sesión en el nodo de CA.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Copia del certificado de CA en la máquina cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Inicie sesión en la máquina cliente (nodo principal en espera).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. 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
    
  5. 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
    
  6. 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
    
    1. Para usar TLS 1.3, agregue las siguientes configuraciones al archivo client-ssl-auth.properties.
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. 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:

  1. Inicie sesión en la máquina cliente (nodo principal en espera).
  2. 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.
  3. Cambie a la máquina de la entidad de certificación (nodo principal activo) para firmar el certificado de cliente.
  4. 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.

  1. Inicie sesión en la máquina cliente (nodo principal en espera).

    ssh sshuser@HeadNode1_Name
    
  2. Quite todos los directorios de SSL existentes.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. 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"
    
  4. Copia de la solicitud de firma de certificado en la CA

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. 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
    
  6. 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
    
  7. Copia del certificado de CA en la máquina cliente

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. 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
    
  8. 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
    
  9. 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
    
    1. Para usar TLS 1.3, agregue las siguientes configuraciones al archivo client-ssl-auth.properties.
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

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

  1. 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
    
  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
    
  3. 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
    

Pasos siguientes