教程:使用企业安全性套餐在 HDInsight 中配置 Apache Kafka 策略

了解如何为企业安全性套餐 (ESP) Apache Kafka 群集配置 Apache Ranger 策略。 将 ESP 群集连接到域,可允许用户使用域凭据进行身份验证。 本教程将创建两个 Ranger 策略来限制对 salesmarketingspend 主题的访问。

本教程介绍如何执行下列操作:

  • 创建域用户。
  • 创建 Ranger 策略。
  • 在 Kafka 群集中创建主题。
  • 测试 Ranger 策略。

先决条件

具有企业安全性套餐的 HDInsight Kafka 群集

连接到 Apache Ranger 管理 UI

  1. 在浏览器中,使用 URL https://ClusterName.azurehdinsight.cn/Ranger/ 连接到 Ranger 管理用户界面。 请记住将 ClusterName 更改为 Kafka 群集的名称。 Ranger 凭据与 Hadoop 群集凭据不同。 若要防止浏览器使用缓存的 Hadoop 凭据,请使用新的 InPrivate 浏览器窗口连接到 Ranger 管理 UI。

  2. 使用 Microsoft Entra 管理员凭据登录。 Microsoft Entra 管理员凭据与 HDInsight 群集凭据或 Linux HDInsight 节点 SSH 凭据不同。

    屏幕截图显示 HDInsight Apache Ranger 管理 UI。

创建域用户

若要了解如何创建 sales_user 和 marketing_user 域用户,请参阅使用企业安全性套餐创建 HDInsight 群集。 在生产场景中,域用户来自 Microsoft Entra ID 租户。

创建 Ranger 策略

为 sales_user 和 marketing_user 创建 Ranger 策略。

  1. 打开“Ranger 管理 UI”。

  2. 在“Kafka”下,选择“<ClusterName>_kafka”。 可能会列出一个预配置策略。

  3. 选择“添加新策略”,并输入以下值:

    设置 建议的值
    策略名称 hdi sales* 策略
    主题 sales*
    选择用户 sales_user1
    权限 发布、使用、创建

    主题名称中可以包含以下通配符:

    • * 表示字符出现零次或多次。
    • ? 表示单个字符。

    屏幕截图显示 Apache Ranger 管理 UI 创建策略 1。

    如果选择用户未自动填充域用户,请稍等,以便 Ranger 与 Microsoft Entra ID 同步。

  4. 选择“添加”以保存策略。

  5. 选择“添加新策略”,然后输入以下值:

    设置 建议的值
    策略名称 hdi marketing 策略
    主题 marketingspend
    选择用户 marketing_user1
    权限 发布、使用、创建

    屏幕截图显示 Apache Ranger 管理 UI 创建策略 2。

  6. 选择“添加”以保存策略。

使用 ESP 创建 Kafka 群集中的主题

若要创建两个主题(saleseventsmarketingspend),请执行以下操作:

  1. 使用以下命令打开与群集的安全外壳 (SSH) 连接:

    ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.cn
    

    DOMAINADMIN 替换为在创建群集期间为群集配置的管理员用户。 将 CLUSTERNAME 替换为群集的名称。 出现提示时,输入管理员用户帐户的密码。 有关在 HDInsight 中使用 SSH 的详细信息,请参阅在 HDInsight 中使用 SSH

  2. 使用以下命令将群集名称保存到一个变量中并安装 JSON 分析实用工具 (jq)。 出现提示时,请输入 Kafka 群集名称。

    sudo apt -y install jq
    read -p 'Enter your Kafka cluster name:' CLUSTERNAME
    
  3. 使用以下命令获取 Kafka 代理主机。 出现提示时,输入群集管理帐户的密码。

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

    在继续操作之前,可能需要设置开发环境(如果尚未这样做)。 需要 Java JDK、Apache Maven 以及包含安全复制 (SCP) 的 SSH 客户端等组件。 有关详细信息,请参阅设置说明

  4. 下载 Apache Kafka 域加入生成者使用者示例

  5. 教程:使用 Apache Kafka 生成者和使用者 API 中“生成和部署示例”下的步骤 2 和 3 操作。

    注意

    在本教程中,请使用 DomainJoined-Producer-Consumer 项目下的 kafka-producer-consumer.jar。 请勿使用 Producer-Consumer 项目下的,它适用于未加入域的方案。

  6. 运行以下命令:

    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
    

测试 Ranger 策略

根据配置的 Ranger 策略,sales_user 可以生成/使用主题 salesevents,但不能生成/使用主题 marketingspend。 相反,marketing_user 可以生成/使用主题 marketingspend,但不能生成/使用主题 salesevents

  1. 打开与群集的新 SSH 连接。 使用以下命令来以 sales_user1 身份登录:

    ssh sales_user1@CLUSTERNAME-ssh.azurehdinsight.cn
    
  2. 使用上一部分中的代理名称来设置以下环境变量:

    export KAFKABROKERS=<brokerlist>:9092
    

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

  3. 按照教程:使用 Apache Kafka 生成者和使用者 API 中的“生成和部署示例”下面的步骤 3 进行操作,确保 kafka-producer-consumer.jar 也可供 sales_user 使用

    注意

    在本教程中,请使用“DomainJoined-Producer-Consumer”项目下的 kafka-producer-consumer.jar。 请勿使用“Producer-Consumer”项目下的,它适用于未加入域的方案。

  4. 运行以下命令来验证 sales_user1 是否可以向主题 salesevents 生成消息

    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. 运行以下命令以使用主题 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
    

    验证是否可以读取消息。

  6. 在同一 SSH 窗口中运行以下命令,验证 sales_user1 是否无法向主题 marketingspend 生成消息

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

    发生授权错误,但可以忽略。

  7. 请注意,marketing_user1 无法从使用主题 salesevents 中的消息

    重复上述步骤 1 到 3,但这次以 marketing_user1 身份进行

    运行以下命令以使用主题 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
    

    无法查看以前的消息。

  8. 从 Ranger UI 查看审核访问事件。

    屏幕截图显示 Ranger UI 策略审核访问事件。

使用控制台生成并使用 ESP Kafka 中的主题

注意

不能使用控制台命令来创建主题。 相反,必须使用上一部分中演示的 Java 代码。 有关详细信息,请参阅使用 ESP 创建 Kafka 群集中的主题

若要使用控制台生成和使用 ESP Kafka 中的主题,请执行以下操作:

  1. kinit 与用户的用户名一起使用。 出现提示时,输入密码。

    kinit sales_user1
    
  2. 设置环境变量:

    export KAFKA_OPTS="-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf"
    export KAFKABROKERS=<brokerlist>:9092
    
  3. 向主题 salesevents 生成消息:

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --topic salesevents --broker-list $KAFKABROKERS --producer-property security.protocol=SASL_PLAINTEXT
    
  4. 使用主题 salesevents 中的消息:

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

在 ESP Kafka 中生成和使用长时间运行的会话的主题

Kerberos 票证缓存存在过期限制。 对于长时间运行的会话,请使用 keytab 而不是手动续订票证缓存。

若要在长时间运行的会话中使用 keytab,且不使用 kinit,请执行以下操作:

  1. 为域用户创建新的 keytab:

    ktutil
    addent -password -p <user@domain> -k 1 -e RC4-HMAC
    wkt /tmp/<user>.keytab
    q
    
    
  2. 创建 /home/sshuser/kafka_client_jaas.conf。 该文件应包含以下行:

    KafkaClient {
     com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
     storeKey=true
     keyTab="/tmp/<user>.keytab"
     useTicketCache=false
     serviceName="kafka"
     principal="<user@domain>";
    };
    
  3. java.security.auth.login.config 替换为 /home/sshuser/kafka_client_jaas.conf,并使用控制台或 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
    

清理资源

如果不打算继续使用此应用程序,请删除创建的 Kafka 群集:

  1. 登录 Azure 门户
  2. 在顶部的“搜索”框中,输入“HDInsight”。
  3. 在“服务”下,选择“HDInsight 群集”。
  4. 在显示的 HDInsight 群集列表中,选择为本教程创建的群集旁边的“...”。
  5. 选择“删除”>“是”

疑难解答

如果 kafka-producer-consumer.jar 无法在已加入域的群集中正常工作,请确保使用的是 DomainJoined-Producer-Consumer 项目下的 kafka-producer-consumer.jar。 请勿使用 Producer-Consumer 项目下的,它适用于未加入域的方案。

后续步骤