第14章 Kerberos(GSSAPI)認証の使用
AMQ Streams は、Kafka クラスターへのシングルサインオンアクセスをセキュアにするために、Kerberos(GSSAPI)認証プロトコルの使用をサポートします。GSSAPI は、基礎となる実装の変更からアプリケーションを調整する、Kerberos 機能の API ラッパーです。
Kerberos は、対称暗号化と信頼できるサードパーティー(Kerberos Key Distribution Centre)を使用してクライアントとサーバーが相互に認証できるようにするネットワーク認証システムです。
14.1. Kerberos(GSSAPI)認証を使用するように AMQ Streams を設定する リンクのコピーリンクがクリップボードにコピーされました!
この手順では、Kafka クライアントが Kerberos(GSSAPI)認証を使用して Kafka および ZooKeeper にアクセスできるように AMQ Streams を設定する方法を説明します。
この手順では、Kerberos krb5 リソースサーバーが Red Hat Enterprise Linux ホストに設定されていることを前提としています。
この手順では、設定方法の例を示しています。
- サービスプリンシパル
- Kerberos ログインを使用する Kafka ブローカー
- Kerberos ログインを使用するための ZooKeeper
- Kerberos 認証を使用して Kafka にアクセスするためのプロデューサーおよびコンシューマークライアント
この手順では、プロデューサーおよびコンシューマークライアントの追加設定とともに、単一のホストで単一の ZooKeeper および Kafka インストールに対して Kerberos セットを説明します。
前提条件
Kerberos クレデンシャルの認証および承認するように Kafka および ZooKeeper を設定するには、以下が必要です。
- Kerberos サーバーへのアクセス
- 各 Kafka ブローカーホストの Kerberos クライアント
Kerberos サーバーを設定し、ブローカーホストにクライアントを 設定する手順についての詳細は、「Kerberos on RHEL のセットアップ 」を参照してください。
Kerberos のデプロイ方法は、お使いのオペレーティングシステムによって異なります。Red Hat は、Red Hat Enterprise Linux で Kerberos を設定する際に Identity Management(IdM)を使用することを推奨します。Oracle または IBM JDK を使用する場合は、JCE(Java Cryptography Extension)をインストールする必要があります。
認証用のサービスプリンシパルの追加
Kerberos サーバーから、ZooKeeper、Kafka ブローカー、および Kafka プロデューサークライアントのサービスプリンシパル(ユーザー)を作成します。
サービスプリンシパルには SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-REALM の形式にする必要があります。
Kerberos KDC でプリンシパルキーを保存するサービスプリンシパルおよびキータブを作成します。
以下に例を示します。
-
zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM -
kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM -
producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COMZooKeeper サービスプリンシパルは、Kafka
config/server.propertiesファイルのzookeeper.connect設定と同じホスト名を指定する必要があります。zookeeper.connect=node1.example.redhat.com:2181
zookeeper.connect=node1.example.redhat.com:2181Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホスト名が同じでない場合、localhost が使用され、認証に失敗します。
-
ホストにディレクトリーを作成し、キータブファイルを追加します。
以下に例を示します。
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytab
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytabCopy to Clipboard Copied! Toggle word wrap Toggle overflow kafkaユーザーがディレクトリーにアクセスできることを確認します。chown kafka:kafka -R /opt/kafka/krb5
chown kafka:kafka -R /opt/kafka/krb5Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Kerberos ログインを使用するように ZooKeeper を設定する
zookeeper に作成しておいたユーザープリンシパルとキータブを使用して認証に Kerberos Key Distribution Center(KDC)を使用するように ZooKeeper を設定します。
opt/kafka/config/jaas.confファイルを作成または変更し、ZooKeeper のクライアントおよびサーバー操作をサポートします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- キータブからプリンシパルキーを取得するには、
trueに設定します。 - 2
- プリンシパルキーを保存するには
trueに設定します。 - 3
- チケットキャッシュから Ticket Granting Ticket(TGT)を取得するには、
trueに設定します。 - 4
keyTabプロパティーは、Kerberos KDC からコピーしたキータブファイルの場所を参照します。場所とファイルは、kafkaユーザーが読み取り可能でなければなりません。- 5
principalプロパティーは、KDC ホストで作成した完全修飾プリンシパル名と一致するように設定されます。形式はSERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-NAMEです。
opt/kafka/config/zookeeper.propertiesを編集して、更新された JAAS 設定を使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- チケットの更新間隔に合わせて調整できるログイン更新の頻度をミリ秒単位で制御します。デフォルトは 1 時間です。
- 2
- ホスト名がログインプリンシパル名の一部として使用されるかどうかを指定します。クラスターのすべてのノードで単一のキータブを使用する場合、これは
trueに設定されます。ただし、トラブルシューティングを行うために、各ブローカーホストの個別のキータブおよび完全修飾プリンシパルを生成することが推奨されます。 - 3
- Kerberos ネゴシエーションのプリンシパル名からレルム名が削除されるかどうかを制御します。この設定は
falseに設定することが推奨されます。 - 4
- ZooKeeper サーバーおよびクライアントの SASL 認証メカニズムを有効にします。
- 5
RequireSaslプロパティーは、マスターの選択などのクォーラムイベントに SASL 認証が必要であるかどうかを制御します。- 6
loginContextプロパティーは、指定されたコンポーネントの認証設定に使用される JAAS 設定のログインコンテキストの名前を特定します。loginContext 名は、opt/kafka/config/jaas.confファイルの関連セクションの名前に対応します。- 7
- 識別に使用されるプリンシパル名を形成するのに使用される命名規則を制御します。プレースホルダー
_HOSTは、実行時にserver.1プロパティーによって定義されるホスト名に自動的に解決されます。
JVM パラメーターで ZooKeeper を開始し、Kerberos ログイン設定を指定します。
su - kafka export EXTRA_ARGS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
su - kafka export EXTRA_ARGS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.propertiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトのサービス名(
zookeeper)を使用していない場合は、-Dzookeeper.sasl.client.username=NAMEパラメーターを使用して名前を追加します。注記/etc/krb5.confの場所を使用している場合は、ZooKeeper、Kafka、または Kafka プロデューサーおよびコンシューマーの起動時に-Djava.security.krb5.conf=/etc/krb5.confを指定する必要はありません。
Kerberos ログインを使用するように Kafka ブローカーサーバーを設定する
kafka に作成したユーザープリンシパルとキータブを使用して認証に Kerberos Key Distribution Center(KDC)を使用するように Kafka を設定します。
以下の要素で
opt/kafka/config/jaas.confファイルを変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow リスナーが SASL/GSSAPI ログインを使用できるように、
config/server.propertiesファイルのリスナー設定を変更して、Kafka クラスターの各ブローカーを設定します。SASL プロトコルをリスナーのセキュリティープロトコルのマップに追加し、不要なプロトコルを削除します。
以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 2 つのリスナーが設定されます。汎用通信用のセキュアなリスナーとクライアントとの通信(通信向けの TLS のサポート)、およびブローカー間通信のレプリケーションリスナー。
- 2
- TLS 対応のリスナーの場合、プロトコル名は SASL_PLAINTEXT です。TLS 以外のコネクターの場合、プロトコル名は SASL_PLAINTEXT になります。SSL が必要ない場合は、
ssl.*プロパティーを削除できます。 - 3
- Kerberos 認証用の SASL メカニズムは
GSSAPIです。 - 4
- ブローカー間の通信の Kerberos 認証。
- 5
- 認証に使用されるサービス名は、同じ Kerberos 設定を使用する可能性がある他のサービスと区別するために指定されます。
JVM パラメーターを使用して、Kafka ブローカーを起動し、Kerberos ログイン設定を指定します。
su - kafka export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
su - kafka export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.propertiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow ブローカーおよび ZooKeeper クラスターが設定されており、Kerberos 以外の認証システムを使用している場合、ZooKeeper およびブローカークラスターを起動し、ログで設定エラーを確認できます。
ブローカーおよび Zookeeper インスタンスを起動すると、クラスターは Kerberos 認証に対して設定されます。
Kerberos 認証を使用するように Kafka プロデューサークライアントおよびコンシューマークライアントを設定します。
producer1 および consumer1 用に作成したユーザープリンシパルおよびキータブを使用して認証に Kerberos Key Distribution Center(KDC)を使用するように Kafka プロデューサーおよびコンシューマークライアントを設定します。
Kerberos 設定をプロデューサーまたはコンシューマー設定ファイルに追加します。
以下に例を示します。
/opt/kafka/config/producer.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/config/consumer.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントを実行して、Kafka ブローカーからメッセージを送受信できることを確認します。
プロデューサークライアント:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-producer.sh --producer.config /opt/kafka/config/producer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-producer.sh --producer.config /opt/kafka/config/producer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンシューマークライアント:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094Copy to Clipboard Copied! Toggle word wrap Toggle overflow
関連情報
- Kerberos の man ページ - krb5.conf(5)、kinit(1)、klist(1)、および kdestroy(1)
- RHEL で設定された Kerberos サーバーの例
- Kerberos チケットを使用して Kafka クラスターで認証するクライアントアプリケーションの例