チュートリアル: Enterprise セキュリティ パッケージを使用して HDInsight に Apache Kafka ポリシーを構成する
Enterprise セキュリティ パッケージ (ESP) の Apache Kafka クラスター用の Apache Ranger ポリシーを構成する方法について説明します。 ESP クラスターは、ユーザーがドメイン資格情報で認証できるドメインに接続されます。 このチュートリアルでは、sales
および marketingspend
トピックへのアクセスを制限する 2 つの Ranger ポリシーを作成します。
このチュートリアルでは、次の作業を行う方法について説明します。
- ドメイン ユーザーの作成。
- Ranger ポリシーの作成。
- Kafka クラスターでのトピックの作成。
- Ranger ポリシーのテスト。
前提条件
Enterprise セキュリティ パッケージがインストールされた HDInsight Kafka クラスター。
Apache Ranger 管理 UI への接続
ブラウザーから、URL
https://ClusterName.azurehdinsight.net/Ranger/
を使用して Ranger 管理ユーザー インターフェイス (UI) に接続します。 必ず、ClusterName
をお使いの Kafka クラスターの名前に変更してください。 Ranger の資格情報は、Hadoop クラスターの資格情報と同じではありません。 ブラウザーで Hadoop のキャッシュされた資格情報が使用されないように、新しい InPrivate ブラウザー ウィンドウを使用して Ranger 管理 UI に接続してください。Microsoft Entra 管理者の資格情報を使用してサインインします。 Microsoft Entra 管理者の資格情報は、HDInsight クラスターの資格情報や Linux HDInsight ノード の SSH 資格情報と同じではありません。
ドメイン ユーザーの作成
sales_user および marketing_user ドメイン ユーザーを作成する方法については、Enterprise セキュリティ パッケージで HDInsight クラスターを作成する方法に関するページを参照してください。 運用シナリオでは、ドメイン ユーザーは Microsoft Entra ID テナントに含まれます。
Ranger ポリシーの作成
sales_user と marketing_user 用の Ranger ポリシーを作成します。
Ranger 管理 UI を開きます。
[Kafka] で [<ClusterName>_kafka] を選択します。 構成済みポリシーが 1 つリストされる場合があります。
[Add New Policy](新しいポリシーの追加) を選択し、次の値を入力します。
設定 推奨値 ポリシー名 HDInsight sales* policy トピック sales* ユーザーの選択 sales_user1 アクセス許可 publish、consume、create トピック名には、次のワイルドカードを含めることができます。
*
は、文字が 0 回以上出現することを示します。?
は、1 文字を示します。
[ユーザーの選択] にドメイン ユーザーが自動的に設定されない場合は、Ranger が Microsoft Entra ID と同期されるまでしばらく待ってください。
[Add](追加) をクリックしてポリシーを保存します。
[Add New Policy](新しいポリシーの追加) を選択し、次の値を入力します。
設定 推奨値 ポリシー名 HDInsight marketing policy トピック marketingspend
ユーザーの選択 marketing_user1 アクセス許可 publish、consume、create [Add](追加) をクリックしてポリシーを保存します。
ESP を使用する Kafka クラスターでのトピックの作成
salesevents
および marketingspend
という 2 つのトピックを作成するには、次のようにします。
次のコマンドを使用して、クラスターへの Secure Shell (SSH) 接続を開きます。
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、SSH クライアントと Secure Copy (SCP) などのコンポーネントが必要となります。 詳細については、設定手順に関するページを参照してください。
Apache Kafka Domain-Joined Producer Consumer サンプルをダウンロードします。
「チュートリアル: Apache Kafka Producer および Consumer API の使用」の「例を構築してデプロイする」にある手順 2. と手順 3. を行います。
Note
このチュートリアルでは、
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
「チュートリアル: Apache Kafka Producer および Consumer API の使用」の「例を構築してデプロイする」のステップ 3 の手順に従って、
kafka-producer-consumer.jar
が sales_user でも使用可能であることを確認します。Note
このチュートリアルでは、"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 を使用します。
長時間実行されるセッションで、kinit
なしで keytab を使用するには次のようにします。
ドメイン ユーザーの新しい 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 portal にサインインします。
- 上部の [検索] ボックスに「HDInsight」と入力します。
- [サービス] の下の [HDInsight クラスター] を選択します。
- 表示される HDInsight クラスターの一覧で、このチュートリアル用に作成したクラスターの横にある [...] を選択します。
- [削除]、[はい] の順に選択します。
トラブルシューティング
ドメインに参加しているクラスターで kafka-producer-consumer.jar
が機能しない場合、 DomainJoined-Producer-Consumer
プロジェクトの下で kafka-producer-consumer.jar
を使用していることを確認してください。 ドメインに参加していないシナリオである Producer-Consumer
プロジェクトの下にあるものを使用しないでください。