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

在本教程中,你将了解如何执行以下操作:

  • 创建域用户
  • 创建 Ranger 策略
  • 创建 Kafka 群集中的主题
  • 测试 Ranger 策略
  • 具有企业安全性套餐的 HDInsight Kafka 群集

    连接到 Apache Ranger 管理 UI

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

  • 使用 Azure Active Directory (AD) 管理员凭据登录。 Azure AD 管理员凭据与 HDInsight 群集凭据或 Linux HDInsight 节点 SSH 凭据不同。

    创建域用户

    访问 使用企业安全性套餐创建 HDInsight 群集 ,以了解如何创建 sales_user 和 marketing_user 域用户。 在生产方案中,域用户来自你的 Active Directory·租户。

    创建 Ranger 策略

    为 sales_user 和 marketing_user 创建 Ranger 策略。

  • 打开“Ranger 管理 UI”。

  • 选择“Kafka”下的“<ClusterName>_kafka”。 可以列出一个预先配置的策略。

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

    ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.net
    

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

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

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

    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`; \
    

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

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

  • 按照以下文章的生成并部署示例下的步骤 2 和步骤 3 进行操作:教程:使用 Apache Kafka 生成者和使用者 API

    对于本教程,请使用“DomainJoined-Producer-Consumer”项目下的 kafka-producer-consumer.jar(而不是 Producer-Consumer 项目下的那个文件,它适用于非加入域方案)。

  • 运行以下命令:

    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

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

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

    export KAFKABROKERS=<brokerlist>:9092
    

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

  • 按照以下文章的生成并部署示例下的步骤 3 进行操作:教程:使用 Apache Kafka 生成者和使用者 API 来确保 kafka-producer-consumer.jar 也可供 sales_user 使用。

    对于本教程,请使用“DomainJoined-Producer-Consumer”项目下的 kafka-producer-consumer.jar(而不是 Producer-Consumer 项目下的那个文件,它适用于非加入域方案)。

  • 执行以下命令来验证 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
    
  • 执行以下命令来使用主题 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
    

    验证你能够读取消息。

  • 在同一 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
    

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

  • 请注意,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
    

    无法查看以前的消息。

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

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

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

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

    kinit sales_user1
    
  • 设置环境变量:

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

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --topic salesevents --broker-list $KAFKABROKERS --producer-property security.protocol=SASL_PLAINTEXT
    
  • 使用主题 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,而不是手动续订票证缓存。 若要无需 kinit 在长时间运行的会话中使用 keytab:

  • 为域用户创建新的 keytab
    ktutil
    addent -password -p <user@domain> -k 1 -e RC4-HMAC
    wkt /tmp/<user>.keytab
    
  • 创建 /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>";
    
  • 使用控制台或 API 将 java.security.auth.login.config 替换为 /home/sshuser/kafka_client_jaas.conf 和使用主题
    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 群集:

  • 登录 Azure 门户
  • 在顶部的“搜索”框中,键入 HDInsight
  • 选择“服务”下的“HDInsight 群集” 。
  • 在显示的 HDInsight 群集列表中,单击为本教程创建的群集旁边的“...”。
  • 单击 “删除” 。 单击 “是”
  • 如果 kafka-producer-consumer.jar 在已加入域的群集中不起作用,请确保使用“DomainJoined-Producer-Consumer”项目下的 kafka-producer-consumer.jar(而不是 Producer-Consumer 项目下的那个文件,它适用于非加入域方案)。

    客户管理的密钥磁盘加密

  •