Tutorial: Configuración de directivas de Apache Kafka en HDInsight con Enterprise Security Package

Obtenga información sobre cómo configurar directivas de Apache Ranger para los clústeres de Apache Kafka de Enterprise Security Package (ESP). Los clústeres de ESP se conectan a un dominio, lo que permite a los usuarios autenticarse con credenciales de dominio. En este tutorial, creará dos directivas de Ranger para restringir el acceso a los temas sales y marketingspend.

En este tutorial, aprenderá a:

  • Crear usuarios de dominio.
  • Creación de directivas de Ranger.
  • Crear temas en un clúster de Kafka.
  • Probar directivas de Ranger.

Requisito previo

Un clúster de Kafka de HDInsight con Enterprise Security Package.

Conexión a la interfaz de usuario administrador de Apache Ranger

  1. En un explorador, conéctese a la interfaz de usuario administrador de Ranger desde la dirección URL https://ClusterName.azurehdinsight.net/Ranger/. No olvide cambiar ClusterName por el nombre del clúster de Kafka. Las credenciales del guardabosques no son las mismas que las del cluster Hadoop. Para evitar que los exploradores usen credenciales almacenadas en caché de Hadoop, use una nueva ventana del explorador InPrivate para conectarse a la interfaz de usuario administrador de Ranger.

  2. Inicie sesión con sus credenciales de administrador de Microsoft Entra. Las credenciales de administrador de Microsoft Entra no son las mismas que las credenciales del clúster de HDInsight ni las credenciales SSH del nodo de HDInsight Linux.

    Screenshot that shows the HDInsight Apache Ranger Admin UI.

Crear usuarios de dominio

Visite Create a HDInsight cluster with Enterprise Security Package (Creación de un clúster de HDInsight con Enterprise Security Package) para aprender a crear los usuario del dominio sales_user y marketing_user. En un escenario de producción, los usuarios del dominio proceden de su inquilino de Microsoft Entra ID.

Creación de directiva de Ranger

Cree una directiva de Ranger para sales_user y marketing_user.

  1. Abra la Interfaz de usuario administrador de Ranger.

  2. En Kafka, seleccione <ClusterName>_kafka. Puede aparecer una directiva configurada previamente.

  3. Seleccione Agregar nueva directiva y escriba los siguientes valores:

    Configuración Valor sugerido
    Nombre de la directiva hdi sales* policy
    Tema sales*
    Seleccionar usuario sales_user1
    Permisos publicar, consumir, crear

    Los siguientes caracteres comodín se pueden incluir en el nombre del tema:

    • * indica ninguna o más repeticiones de caracteres.
    • ? indica cualquier carácter individual.

    Screenshot that shows the Apache Ranger Admin UI Create Policy1.

    Espere unos instantes para que Ranger se sincronice con Microsoft Entra ID si un usuario del dominio no se rellena automáticamente en Seleccionar usuario.

  4. Seleccione Agregar para guardar la directiva.

  5. Seleccione Agregar nueva directiva y escriba los siguientes valores:

    Configuración Valor sugerido
    Nombre de la directiva hdi marketing policy
    Tema marketingspend
    Seleccionar usuario marketing_user1
    Permisos publicar, consumir, crear

    Screenshot that shows the Apache Ranger Admin UI Create Policy2.

  6. Seleccione Agregar para guardar la directiva.

Creación de temas en un clúster de Kafka con ESP

Para crear dos temas salesevents y marketingspend:

  1. Utilice el siguiente comando para abrir una conexión Secure Shell (SSH) con el cluster:

    ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.net
    

    Reemplace a DOMAINADMIN por el usuario administrador de su clúster configurado durante la creación del clúster. Reemplace CLUSTERNAME por el nombre del clúster. Si se le solicita, escriba la contraseña de la cuenta de usuario administrador. Para obtener más información sobre cómo usar SSH con HDInsight, consulte Conexión a través de SSH con HDInsight.

  2. Use los siguientes comandos para guardar el nombre del clúster en una variable e instalar una utilidad de análisis de JSON jq. Cuando se le solicite, escriba el nombre del clúster de Kafka.

    sudo apt -y install jq
    read -p 'Enter your Kafka cluster name:' CLUSTERNAME
    
  3. Use los siguientes comandos para obtener los hosts del agente de Kafka. Cuando se le solicite, escriba la contraseña de la cuenta de administrador del clúster.

    export KAFKABROKERS=`curl -sS -u admin -G https://$CLUSTERNAME.azurehdinsight.net/api/v1/clusters/$CLUSTERNAME/services/KAFKA/components/KAFKA_BROKER | jq -r '["\(.host_components[].HostRoles.host_name):9092"] | join(",")' | cut -d',' -f1,2`; \
    

    Antes de proceder, puede que necesite configurar su entorno de desarrollo si aún no lo ha hecho. Necesitará componentes como el JDK de Java, Apache Maven y un cliente SSH con copia segura (SCP). Para obtener más información, consulte las instrucciones de configuración.

  4. Descargue los ejemplos de consumidor de productor unido al dominio de Apache Kafka.

  5. Siga los pasos 2 y 3 de Compilación e implementación del ejemplo en Tutorial: Uso de Producer API y Consumer API de Apache Kafka.

    Nota:

    Para este tutorial, utilice kafka-producer-consumer.jar bajo el proyecto DomainJoined-Producer-Consumer. No use el que se encuentra en el proyecto de Producer-Consumer, que es para escenarios que no están unidos a un dominio.

  6. Ejecute los comandos siguientes:

    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar create salesevents $KAFKABROKERS
    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar create marketingspend $KAFKABROKERS
    

Prueba de las directivas de Ranger

Según las directivas de Ranger configuradas, sales_user puede producir o consumir el tema salesevents, pero no el tema marketingspend. Por el contrario, marketing_user puede producir/consumir el tema marketingspend pero no el tema salesevents.

  1. Abra una nueva conexión SSH al clúster. Use el siguiente comandos para iniciar sesión como sales_user1:

    ssh sales_user1@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Use los nombres de agente de la sección anterior para establecer la siguiente variable de entorno:

    export KAFKABROKERS=<brokerlist>:9092
    

    Ejemplo: export KAFKABROKERS=<brokername1>.contoso.com:9092,<brokername2>.contoso.com:9092

  3. Siga el paso 3 de Compilación e implementación de ejemplo en Tutorial: Uso de las API Apache Kafka Producer y Consumer para asegurarse de que kafka-producer-consumer.jar también está disponible para sales_user.

    Nota:

    Para este tutorial, use kafka-producer-consumer.jar en el proyecto "DomainJoined-Producer-Consumer". No utilice el que se encuentra bajo el proyecto "Productor-Consumidor", que es para escenarios sin unión de dominios.

  4. Compruebe que sales_user1 puede producir en el tema salesevents ejecutando el comando siguiente:

    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar producer salesevents $KAFKABROKERS
    
  5. Ejecute el siguiente comando para consumir del tema salesevents:

    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar consumer salesevents $KAFKABROKERS
    

    Compruebe que puede leer los mensajes.

  6. Verifique que el sales_user1 no puede producir al tema marketingspend ejecutando el siguiente comando en la misma ventana SSH:

    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar producer marketingspend $KAFKABROKERS
    

    Se produce un error de autorización y se puede omitir.

  7. Observe que marketing_user1 no puede consumir del tema salesevents.

    Repita los pasos anteriores de 1 a 3, pero esta vez como marketing_user1.

    Ejecute el siguiente comando para consumir del tema salesevents:

    java -jar -Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf kafka-producer-consumer.jar consumer salesevents $KAFKABROKERS
    

    No se pueden ver los mensajes anteriores.

  8. Vea los eventos de acceso de auditoría desde la interfaz de usuario de Ranger.

    Screenshot that shows the Ranger UI policy audit access events.

Producción y consumo de temas en Kafka de ESP mediante la consola

Nota

No puede usar comandos de consola para crear temas; debe usar el código Java que se muestra en la sección anterior. Para obtener más información, consulte Creación de temas en un clúster de Kafka con ESP.

Para producir y consumir temas en Kafka de ESP mediante la consola:

  1. Use kinit con el nombre de usuario del usuario. Escriba la contraseña cuando se le solicite.

    kinit sales_user1
    
  2. Establezca variables de entorno:

    export KAFKA_OPTS="-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf"
    export KAFKABROKERS=<brokerlist>:9092
    
  3. Produzca mensajes para el tema salesevents:

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --topic salesevents --broker-list $KAFKABROKERS --producer-property security.protocol=SASL_PLAINTEXT
    
  4. Consumir mensajes del tema salesevents:

    /usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --topic salesevents --from-beginning --bootstrap-server $KAFKABROKERS --consumer-property security.protocol=SASL_PLAINTEXT
    

Producir y consumir pistas de sesión de larga duración en ESP Kafka

La caché de tickets de Kerberos tiene una limitación de caducidad. Para una sesión de larga duración, utilice un keytab en lugar de renovar manualmente la caché de tickets.

Para usar keytab en una sesión de larga duración sin kinit:

  1. Cree un archivo keytab para el nombre de usuario del dominio:

    ktutil
    addent -password -p <user@domain> -k 1 -e RC4-HMAC
    wkt /tmp/<user>.keytab
    q
    
    
  2. Cree /home/sshuser/kafka_client_jaas.conf. Debe tener las siguientes líneas:

    KafkaClient {
     com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
     storeKey=true
     keyTab="/tmp/<user>.keytab"
     useTicketCache=false
     serviceName="kafka"
     principal="<user@domain>";
    };
    
  3. Reemplace java.security.auth.login.config por /home/sshuser/kafka_client_jaas.conf y genere o consuma un tema mediante la consola o la API:

    export KAFKABROKERS=<brokerlist>:9092
    
    # console tool
    export KAFKA_OPTS="-Djava.security.auth.login.config=/home/sshuser/kafka_client_jaas.conf"
    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --topic salesevents --broker-list $KAFKABROKERS --producer-property security.protocol=SASL_PLAINTEXT
    /usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --topic salesevents --from-beginning --bootstrap-server $KAFKABROKERS --consumer-property security.protocol=SASL_PLAINTEXT
    
    # API
    java -jar -Djava.security.auth.login.config=/home/sshuser/kafka_client_jaas.conf kafka-producer-consumer.jar producer salesevents $KAFKABROKERS
    java -jar -Djava.security.auth.login.config=/home/sshuser/kafka_client_jaas.conf kafka-producer-consumer.jar consumer salesevents $KAFKABROKERS
    

Limpieza de recursos

Si no va a seguir utilizando esta aplicación, elimine el cluster Kafka que creó:

  1. Inicie sesión en Azure Portal.
  2. En el cuadro Búsqueda en la parte superior, escriba HDInsight.
  3. Seleccione Clústeres de HDInsight en Servicios.
  4. En la lista de clústeres de HDInsight que aparece, seleccione el signo ... situado junto al clúster que ha creado para este tutorial.
  5. Seleccione Eliminar>.

Solución de problemas

Si kafka-producer-consumer.jar no funciona en un clúster unido a un dominio, asegúrese de que usa kafka-producer-consumer.jar en el proyecto de DomainJoined-Producer-Consumer. No use el que se encuentra en el proyecto de Producer-Consumer, que es para escenarios que no están unidos a un dominio.

Pasos siguientes