チュートリアル: Enterprise セキュリティ パッケージを使用して HDInsight に Apache Kafka ポリシーを構成する

Enterprise セキュリティ パッケージ (ESP) の Apache Kafka クラスター用の Apache Ranger ポリシーを構成する方法について説明します。 ESP クラスターは、ユーザーがドメイン資格情報で認証できるドメインに接続されます。 このチュートリアルでは、sales および marketingspend トピックへのアクセスを制限する 2 つの Ranger ポリシーを作成します。

このチュートリアルでは、次の作業を行う方法について説明します。

  • ドメイン ユーザーの作成。
  • Ranger ポリシーの作成。
  • Kafka クラスターでのトピックの作成。
  • Ranger ポリシーのテスト。

前提条件

Enterprise セキュリティ パッケージがインストールされた HDInsight Kafka クラスター

Apache Ranger 管理 UI への接続

  1. ブラウザーから、URL https://ClusterName.azurehdinsight.net/Ranger/ を使用して Ranger 管理ユーザー インターフェイス (UI) に接続します。 必ず、ClusterName をお使いの Kafka クラスターの名前に変更してください。 Ranger の資格情報は、Hadoop クラスターの資格情報と同じではありません。 ブラウザーで Hadoop のキャッシュされた資格情報が使用されないように、新しい InPrivate ブラウザー ウィンドウを使用して Ranger 管理 UI に接続してください。

  2. Microsoft Entra 管理者の資格情報を使用してサインインします。 Microsoft Entra 管理者の資格情報は、HDInsight クラスターの資格情報や Linux HDInsight ノード の SSH 資格情報と同じではありません。

    Screenshot that shows the HDInsight Apache Ranger Admin UI.

ドメイン ユーザーの作成

sales_user および marketing_user ドメイン ユーザーを作成する方法については、Enterprise セキュリティ パッケージで HDInsight クラスターを作成する方法に関するページを参照してください。 運用シナリオでは、ドメイン ユーザーは Microsoft Entra ID テナントに含まれます。

Ranger ポリシーの作成

sales_usermarketing_user 用の Ranger ポリシーを作成します。

  1. Ranger 管理 UI を開きます。

  2. [Kafka][<ClusterName>_kafka] を選択します。 構成済みポリシーが 1 つリストされる場合があります。

  3. [Add New Policy](新しいポリシーの追加) を選択し、次の値を入力します。

    設定 推奨値
    ポリシー名 hdi sales* policy
    トピック sales*
    ユーザーの選択 sales_user1
    アクセス許可 publish、consume、create

    トピック名には、次のワイルドカードを含めることができます。

    • * は、文字が 0 回以上出現することを示します。
    • ? は、1 文字を示します。

    Screenshot that shows the Apache Ranger Admin UI Create Policy1.

    [ユーザーの選択] にドメイン ユーザーが自動的に設定されない場合は、Ranger が Microsoft Entra ID と同期されるまでしばらく待ってください。

  4. [Add](追加) をクリックしてポリシーを保存します。

  5. [Add New Policy](新しいポリシーの追加) を選択し、次の値を入力します。

    設定 推奨値
    ポリシー名 hdi marketing policy
    トピック marketingspend
    ユーザーの選択 marketing_user1
    アクセス許可 publish、consume、create

    Screenshot that shows the Apache Ranger Admin UI Create Policy2.

  6. [Add](追加) をクリックしてポリシーを保存します。

ESP を使用する Kafka クラスターでのトピックの作成

salesevents および marketingspend という 2 つのトピックを作成するには、次のようにします。

  1. 次のコマンドを使用して、クラスターへの Secure Shell (SSH) 接続を開きます。

    ssh DOMAINADMIN@CLUSTERNAME-ssh.azurehdinsight.net
    

    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.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) などのコンポーネントが必要となります。 詳細については、設定手順に関するページを参照してください。

  4. Apache Kafka Domain-Joined Producer Consumer サンプルをダウンロードします。

  5. チュートリアル: Apache Kafka Producer および Consumer API の使用」の「例を構築してデプロイする」にある手順 2. と手順 3. を行います。

    Note

    このチュートリアルでは、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.net
    
  2. 前のセクションのブローカーの名前を使用して、次の環境変数を設定します。

    export KAFKABROKERS=<brokerlist>:9092
    

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

  3. チュートリアル: Apache Kafka Producer および Consumer API の使用」の「例を構築してデプロイする」のステップ 3 の手順に従って、kafka-producer-consumer.jarsales_user でも使用可能であることを確認します。

    Note

    このチュートリアルでは、"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 から監査アクセス イベントを表示します。

    Screenshot that shows the Ranger UI policy audit access events.

コンソールを使用して 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 を使用します。

長時間実行されるセッションで、kinit なしで keytab を使用するには次のようにします。

  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 portal にサインインします。
  2. 上部の [検索] ボックスに「HDInsight」と入力します。
  3. [サービス] の下の [HDInsight クラスター] を選択します。
  4. 表示される HDInsight クラスターの一覧で、このチュートリアル用に作成したクラスターの横にある [...] を選択します。
  5. [削除][はい] の順に選択します。

トラブルシューティング

ドメインに参加しているクラスターで kafka-producer-consumer.jar が機能しない場合、 DomainJoined-Producer-Consumer プロジェクトの下で kafka-producer-consumer.jar を使用していることを確認してください。 ドメインに参加していないシナリオである Producer-Consumer プロジェクトの下にあるものを使用しないでください。

次のステップ