Tutorial: Configurar políticas do Apache Kafka no HDInsight com o Enterprise Security Package

Saiba como configurar políticas do Apache Ranger para clusters Apache Kafka do Enterprise Security Package (ESP). Os clusters ESP estão conectados a um domínio, permitindo que os usuários se autentiquem com credenciais de domínio. Neste tutorial, você cria duas políticas do Ranger para restringir o acesso aos tópicos sales e marketingspend.

Neste tutorial, você aprenderá a:

  • Crie usuários de domínio.
  • Crie políticas do Ranger.
  • Crie tópicos em um cluster do Kafka.
  • Teste as políticas do Ranger.

Pré-requisito

Um cluster do Kafka do HDInsight com o Enterprise Security Package.

Conectar-se à interface do usuário de Administração do Apache Ranger

  1. Em um navegador, conecte-se à interface do usuário do administrador do Ranger usando o URL https://ClusterName.azurehdinsight.net/Ranger/. Lembre-se de alterar ClusterName para o nome do seu cluster Kafka. As credenciais do Ranger não são as mesmas que as credenciais de cluster do Hadoop. Para impedir que os navegadores usem credenciais do Hadoop em cache, use uma nova janela do navegador InPrivate para se conectar à interface de administração do Ranger Admin.

  2. Entre usando suas credenciais de administrador do Microsoft Entra. As credenciais de administrador do Microsoft Entra não são as mesmas que as credenciais do cluster HDInsight ou as credenciais SSH do nó HDInsight do Linux.

    Screenshot that shows the HDInsight Apache Ranger Admin UI.

Crie usuários de domínio

Para saber como criar os usuários de domínio sales_user e marketing_user, confira Criar um cluster do HDInsight com o Enterprise Security Package. Em um cenário de produção, os usuários de domínio vêm do seu locatário do Microsoft Entra ID.

Criar uma política do Ranger

Crie uma política de Ranger para sales_user e marketing_user.

  1. Abra o interface do usuário administrador do Ranger.

  2. Em Kafka, selecione <ClusterName>_kafka. Uma política pré-configurada pode ser listada.

  3. Selecione Adicionar nova política e insira os seguintes valores:

    Configuração Valor sugerido
    Nome da política política de vendas * hdi
    Tópico vendas *
    Selecionar usuário sales_user1
    Permissões publicar, consumir, criar

    Os curingas a seguir podem ser incluídos no nome do tópico:

    • * indica zero ou mais ocorrências de caracteres.
    • ? indica um caractere único.

    Screenshot that shows the Apache Ranger Admin UI Create Policy1.

    Aguarde alguns instantes para que o Ranger sincronize com o Microsoft Entra ID se um usuário de domínio não for preenchido automaticamente para Selecionar usuário.

  4. Selecione Adicionar para salvar a política.

  5. Selecione Adicionar nova política e, em seguida, insira os seguintes valores:

    Configuração Valor sugerido
    Nome da política política de marketing do hdi
    Tópico marketingspend
    Selecionar usuário marketing_user1
    Permissões publicar, consumir, criar

    Screenshot that shows the Apache Ranger Admin UI Create Policy2.

  6. Selecione Adicionar para salvar a política.

Criar tópicos em um cluster do Kafka com ESP

Para criar dois tópicos, salesevents e marketingspend:

  1. Use o seguinte comando para abrir uma conexão SSH (Secure Shell) com o cluster:

    ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.net
    

    Substitua DOMAINADMIN pelo usuário administrador do cluster configurado durante a criação do cluster. Substitua CLUSTERNAME pelo nome do cluster. Se solicitado, insira a senha da conta de usuário administrador. Para saber mais sobre como usar o SSH com HDInsight, confira Usar SSH com HDInsight.

  2. Use os seguintes comandos para salvar o nome do cluster em uma variável e instalar um utilitário de análise JSON jq. Quando solicitado, insira o nome do cluster Kafka.

    sudo apt -y install jq
    read -p 'Enter your Kafka cluster name:' CLUSTERNAME
    
  3. Use os comandos a seguir para obter os hosts do broker do Kafka. Quando solicitado, digite a senha da conta de administrador do cluster.

    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 continuar, talvez seja necessário configurar seu ambiente de desenvolvimento se ainda não tiver feito isso. Você precisa de componentes como o JDK do Java, o Apache Maven e um cliente SSH com o Secure Copy (SCP). Para obter mais informações, confira Instruções de configuração.

  4. Baixe os exemplos de consumidor do produtor ingressado no domínio do Apache Kafka.

  5. Siga as etapas 2 e 3 em Compilar e implantar o exemplo em Tutorial: Usar as APIs de produtor e consumidor do Apache Kafka.

    Observação

    Para este tutorial, use kafka-producer-consumer.jar no projeto DomainJoined-Producer-Consumer. Não use aquele no projeto Producer-Consumer, que é para cenários não conectados ao domínio.

  6. Execute os comandos a seguir:

    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
    

Testar as políticas do Ranger

Com base nas políticas do Ranger configuradas, sales_user pode produzir/consumir o tópico salesevents, mas não o tópico marketingspend. Por outro lado, marketing_user pode produzir/consumir o tópico marketingspend, mas não o tópico salesevents.

  1. Abra uma nova conexão de SSH ao cluster. Use o seguinte comando para entrar como sales_user1:

    ssh sales_user1@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Use os nomes de broker da seção anterior para definir a seguinte variável de ambiente:

    export KAFKABROKERS=<brokerlist>:9092
    

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

  3. Siga a etapa 3 em Compilar e implantar o exemplo no Tutorial: Usar as APIs de Produtor e Consumidor do Apache Kafka para garantir que o kafka-producer-consumer.jar também esteja disponível para sales_user.

    Observação

    Para este tutorial, use kafka-producer-consumer.jar no projeto "DomainJoined-Producer-Consumer". Não use aquele no projeto "Produtor-Consumidor", que é para cenários não conectados ao domínio.

  4. Verifique se sales_user1 pode produzir para o tópico salesevents executando o seguinte comando:

    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. Execute o seguinte comando para consumir do tópico 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
    

    Verifique se você pode ler as mensagens.

  6. Verifique se o sales_user1 não pode produzir para o tópico marketingspend executando o seguinte comando na mesma janela 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
    

    Ocorre um erro de autorização e ele pode ser ignorado.

  7. Observe que marketing_user1 não pode consumir do tópico salesevents.

    Repita as etapas anteriores de 1 a 3, mas desta vez como marketing_user1.

    Execute o seguinte comando para consumir do tópico 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
    

    As mensagens anteriores não podem ser vistas.

  8. Exiba os eventos de auditoria de acesso da interface do usuário do Ranger.

    Screenshot that shows the Ranger UI policy audit access events.

Produzir e consumir tópicos no Kafka do ESP usando o console

Observação

Você não pode usar comandos de console para criar tópicos. Em vez disso, você deve usar o código Java demonstrado na seção anterior. Para obter mais informações, confira Criar tópicos em um cluster Kafka com ESP.

Para produzir e consumir tópicos no Kafka do ESP usando o console:

  1. Use kinit com o nome de usuário. Insira a senha quando solicitado.

    kinit sales_user1
    
  2. Defina variáveis de ambiente:

    export KAFKA_OPTS="-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf"
    export KAFKABROKERS=<brokerlist>:9092
    
  3. Gere mensagens para o tópico salesevents:

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --topic salesevents --broker-list $KAFKABROKERS --producer-property security.protocol=SASL_PLAINTEXT
    
  4. Consuma mensagens do tópico salesevents:

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

Produzir e consumir tópicos para sessão de execução longa no Kafka do ESP

O cache de tíquetes do Kerberos tem uma limitação de expiração. Para uma sessão de execução longa, use um keytab em vez de renovar o cache de tíquetes manualmente.

Para usar o keytab na sessão de execução longa sem kinit:

  1. Crie um novo keytab para o usuário de domínio:

    ktutil
    addent -password -p <user@domain> -k 1 -e RC4-HMAC
    wkt /tmp/<user>.keytab
    q
    
    
  2. Crie /home/sshuser/kafka_client_jaas.conf. Ele deve conter as seguintes linhas:

    KafkaClient {
     com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
     storeKey=true
     keyTab="/tmp/<user>.keytab"
     useTicketCache=false
     serviceName="kafka"
     principal="<user@domain>";
    };
    
  3. Substitua java.security.auth.login.config por /home/sshuser/kafka_client_jaas.conf e produza ou consuma o tópico usando o console ou a 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
    

Limpar os recursos

Se você não quiser continuar a usar este aplicativo, exclua o cluster do Kafka criado:

  1. Entre no portal do Azure.
  2. Na caixa Pesquisar na parte superior, insira HDInsight.
  3. Em Serviços, selecione clusters do HDInsight.
  4. Na lista de clusters do HDInsight exibida, selecione ao lado do cluster que você criou para este tutorial.
  5. Selecione Excluir>Sim.

Solução de problemas

Se kafka-producer-consumer.jar não funcionar em um cluster conectado ao domínio, verifique se você está usando kafka-producer-consumer.jar no projeto DomainJoined-Producer-Consumer. Não use aquele no projeto Producer-Consumer, que é para cenários não conectados ao domínio.

Próximas etapas