教程:使用企业安全性套餐在 HDInsight 中配置 Apache Kafka 策略
了解如何为企业安全性套餐 (ESP) Apache Kafka 群集配置 Apache Ranger 策略。 将 ESP 群集连接到域,可允许用户使用域凭据进行身份验证。 本教程将创建两个 Ranger 策略来限制对 sales
和 marketingspend
主题的访问。
本教程介绍如何执行下列操作:
- 创建域用户。
- 创建 Ranger 策略。
- 在 Kafka 群集中创建主题。
- 测试 Ranger 策略。
先决条件
具有企业安全性套餐的 HDInsight Kafka 群集。
连接到 Apache Ranger 管理 UI
在浏览器中,使用 URL
https://ClusterName.azurehdinsight.cn/Ranger/
连接到 Ranger 管理用户界面。 请记住将ClusterName
更改为 Kafka 群集的名称。 Ranger 凭据与 Hadoop 群集凭据不同。 若要防止浏览器使用缓存的 Hadoop 凭据,请使用新的 InPrivate 浏览器窗口连接到 Ranger 管理 UI。使用 Microsoft Entra 管理员凭据登录。 Microsoft Entra 管理员凭据与 HDInsight 群集凭据或 Linux HDInsight 节点 SSH 凭据不同。
创建域用户
若要了解如何创建 sales_user 和 marketing_user 域用户,请参阅使用企业安全性套餐创建 HDInsight 群集。 在生产场景中,域用户来自 Microsoft Entra ID 租户。
创建 Ranger 策略
为 sales_user 和 marketing_user 创建 Ranger 策略。
打开“Ranger 管理 UI”。
在“Kafka”下,选择“<ClusterName>_kafka”。 可能会列出一个预配置策略。
选择“添加新策略”,并输入以下值:
设置 建议的值 策略名称 HDInsight 销售* 策略 主题 sales* 选择用户 sales_user1 权限 发布、使用、创建 主题名称中可以包含以下通配符:
*
表示字符出现零次或多次。?
表示单个字符。
如果选择用户未自动填充域用户,请稍等,以便 Ranger 与 Microsoft Entra ID 同步。
选择“添加”以保存策略。
选择“添加新策略”,然后输入以下值:
设置 建议的值 策略名称 HDInsight 营销策略 主题 marketingspend
选择用户 marketing_user1 权限 发布、使用、创建 选择“添加”以保存策略。
使用 ESP 创建 Kafka 群集中的主题
若要创建两个主题(salesevents
和 marketingspend
),请执行以下操作:
使用以下命令打开与群集的安全外壳 (SSH) 连接:
ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.cn
将
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.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 客户端等组件。 有关详细信息,请参阅设置说明。
按教程:使用 Apache Kafka 生成者和使用者 API 中“生成和部署示例”下的步骤 2 和 3 操作。
注意
在本教程中,请使用
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.cn
使用上一部分中的代理名称来设置以下环境变量:
export KAFKABROKERS=<brokerlist>:9092
示例:
export KAFKABROKERS=<brokername1>.contoso.com:9092,<brokername2>.contoso.com:9092
按照教程:使用 Apache Kafka 生成者和使用者 API 中的“生成和部署示例”下面的步骤 3 进行操作,确保
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 查看审核访问事件。
使用控制台生成并使用 ESP Kafka 中的主题
注意
不能使用控制台命令来创建主题。 相反,必须使用上一部分中演示的 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 而不是手动续订票证缓存。
若要在长时间运行的会话中使用 keytab,且不使用 kinit
,请执行以下操作:
为域用户创建新的 keytab:
ktutil addent -password -p <user@domain> -k 1 -e RC4-HMAC wkt /tmp/<user>.keytab q
创建
/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>"; };
将
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 群集:
- 登录 Azure 门户。
- 在顶部的“搜索”框中,输入“HDInsight”。
- 在“服务”下,选择“HDInsight 群集”。
- 在显示的 HDInsight 群集列表中,选择为本教程创建的群集旁边的“...”。
- 选择“删除”>“是”。
疑难解答
如果 kafka-producer-consumer.jar
无法在已加入域的群集中正常工作,请确保使用的是 DomainJoined-Producer-Consumer
项目下的 kafka-producer-consumer.jar
。 请勿使用 Producer-Consumer
项目下的,它适用于未加入域的方案。