第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.COM
ZooKeeper サービスプリンシパルは、Kafka
config/server.properties
ファイルのzookeeper.connect
設定と同じホスト名を指定する必要があります。zookeeper.connect=node1.example.redhat.com:2181
ホスト名が同じでない場合、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
kafka
ユーザーがディレクトリーにアクセスできることを確認します。chown kafka:kafka -R /opt/kafka/krb5
Kerberos ログインを使用するように ZooKeeper を設定する
zookeeper
に作成しておいたユーザープリンシパルとキータブを使用して認証に Kerberos Key Distribution Center(KDC)を使用するように ZooKeeper を設定します。
opt/kafka/config/jaas.conf
ファイルを作成または変更し、ZooKeeper のクライアントおよびサーバー操作をサポートします。Client { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true 1 storeKey=true 2 useTicketCache=false 3 keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" 4 principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; 5 }; Server { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumServer { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumLearner { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };
- 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 設定を使用します。# ... requireClientAuthScheme=sasl jaasLoginRenew=3600000 1 kerberos.removeHostFromPrincipal=false 2 kerberos.removeRealmFromPrincipal=false 3 quorum.auth.enableSasl=true 4 quorum.auth.learnerRequireSasl=true 5 quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner 6 quorum.auth.server.loginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST 7 quorum.cnxn.threads.size=20
- 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
デフォルトのサービス名(
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
ファイルを変更します。KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; KafkaClient { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };
リスナーが SASL/GSSAPI ログインを使用できるように、
config/server.properties
ファイルのリスナー設定を変更して、Kafka クラスターの各ブローカーを設定します。SASL プロトコルをリスナーのセキュリティープロトコルのマップに追加し、不要なプロトコルを削除します。
以下に例を示します。
# ... broker.id=0 # ... listeners=SECURE://:9092,REPLICATION://:9094 1 inter.broker.listener.name=REPLICATION # ... listener.security.protocol.map=SECURE:SASL_PLAINTEXT,REPLICATION:SASL_PLAINTEXT 2 # .. sasl.enabled.mechanisms=GSSAPI 3 sasl.mechanism.inter.broker.protocol=GSSAPI 4 sasl.kerberos.service.name=kafka 5 ...
- 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
ブローカーおよび ZooKeeper クラスターが設定されており、Kerberos 以外の認証システムを使用している場合、ZooKeeper およびブローカークラスターを起動し、ログで設定エラーを確認できます。
ブローカーおよび Zookeeper インスタンスを起動すると、クラスターは Kerberos 認証に対して設定されます。
Kerberos 認証を使用するように Kafka プロデューサークライアントおよびコンシューマークライアントを設定します。
producer1
および consumer1
用に作成したユーザープリンシパルおよびキータブを使用して認証に Kerberos Key Distribution Center(KDC)を使用するように Kafka プロデューサーおよびコンシューマークライアントを設定します。
Kerberos 設定をプロデューサーまたはコンシューマー設定ファイルに追加します。
以下に例を示します。
/opt/kafka/config/producer.properties
# ... sasl.mechanism=GSSAPI 1 security.protocol=SASL_PLAINTEXT 2 sasl.kerberos.service.name=kafka 3 sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ 4 useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/producer1.keytab" \ principal="producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # ...
/opt/kafka/config/consumer.properties
# ... sasl.mechanism=GSSAPI security.protocol=SASL_PLAINTEXT sasl.kerberos.service.name=kafka sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/consumer1.keytab" \ principal="consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # ...
クライアントを実行して、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-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
関連情報
- Kerberos の man ページ - krb5.conf(5)、kinit(1)、klist(1)、および kdestroy(1)
- RHEL で設定された Kerberos サーバーの例
- Kerberos チケットを使用して Kafka クラスターで認証するクライアントアプリケーションの例