第14章 Kerberos(GSSAPI)認証の使用
AMQ Streams は、Kafka クラスターへの安全なシングルサインオンアクセスのために、Kerberos (GSSAPI) 認証プロトコルの使用をサポートします。GSSAPI は、Kerberos 機能の API ラッパーで、基盤の実装の変更からアプリケーションを保護します。
Kerberos は、対称暗号化と信頼できるサードパーティーの Kerberos Key Distribution Centre(KDC)を使用して、クライアントとサーバーが相互に認証できるようにするネットワーク認証システムです。
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 設定について説明し、プロデューサーおよびコンシューマークライアントの追加設定についても説明します。
前提条件
Kafka および ZooKeeper が Kerberos クレデンシャルを認証および承認するように設定できるようにするには、以下が必要です。
- Kerberos サーバーへのアクセス
- 各 Kafka ブローカーホストの Kerberos クライアント
Kerberos サーバー、およびブローカーホストのクライアントを設定する手順の詳細は、example Kerberos on RHEL set up configuration を参照してください。
Kerberos のデプロイ方法は、お使いのオペレーティングシステムによって異なります。Red Hat は、Red Hat Enterprise Linux で Kerberos を設定する際に Identity Management(IdM)を使用することを推奨します。Oracle または IBM JDK のユーザーは、Java Cryptography Extension(JCE)をインストールする必要があります。
認証用のサービスプリンシパルの追加
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ホスト名が同じでない場合、localhost が使用され、認証に失敗します。
-
ホストにディレクトリーを作成し、キータブファイルを追加します。
以下に例を示します。
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytabkafkaユーザーがディレクトリーにアクセスできることを確認します。chown kafka:kafka -R /opt/kafka/krb5
Kerberos ログインを使用するための ZooKeeper の設定
認証に Kerberos Key Distribution Center (KDC) を使用するように zookeeper のために作成したユーザープリンシパルとキータブを使用して ZooKeeper を設定します。
opt/kafka/config/jaas.confファイルを作成または変更して、ZooKeeper クライアントおよびサーバー操作をサポートします。Client { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true1 storeKey=true2 useTicketCache=false3 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
trueに設定し、チケットキャッシュから Ticket Granting Ticket (TGT) を取得します。- 4
keyTabプロパティーは、Kerberos KDC からコピーされた keytab ファイルの場所を示します。その場所とファイルは、kafkaユーザーが読み取りできるものでなければなりません。- 5
principalプロパティーは、KDC ホストで作成された完全修飾プリンシパル名と一致するように設定され、その形式はSERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-NAMEに従います。
opt/kafka/config/zookeeper.propertiesを編集して、更新された JAAS 設定を使用します。# ... requireClientAuthScheme=sasl jaasLoginRenew=36000001 kerberos.removeHostFromPrincipal=false2 kerberos.removeRealmFromPrincipal=false3 quorum.auth.enableSasl=true4 quorum.auth.learnerRequireSasl=true5 quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner6 quorum.auth.server.loginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST7 quorum.cnxn.threads.size=20- 1
- ログイン更新の頻度をミリ秒単位で制御します。これは、チケットの更新間隔に合わせて調整できます。デフォルトは 1 時間です。
- 2
- ホスト名がログインプリンシパル名の一部として使用されるかどうかを指定します。クラスターのすべてのノードで単一の keytab を使用する場合、これは
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 ブローカーサーバーの設定
認証に Kerberos Key Distribution Center (KDC) を使用するように kafka のために作成したユーザープリンシパルとキータブを使用して 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"; };Kafka クラスターの各ブローカーを設定するには、
config/server.propertiesファイルのリスナー設定を変更して、リスナーが SASL/GSSAPI ログインを使用するようにします。リスナーのセキュリティープロトコルのマップに SASL プロトコルを追加し、不要なプロトコルを削除します。
以下に例を示します。
# ... broker.id=0 # ... listeners=SECURE://:9092,REPLICATION://:90941 inter.broker.listener.name=REPLICATION # ... listener.security.protocol.map=SECURE:SASL_PLAINTEXT,REPLICATION:SASL_PLAINTEXT2 # .. sasl.enabled.mechanisms=GSSAPI3 sasl.mechanism.inter.broker.protocol=GSSAPI4 sasl.kerberos.service.name=kafka5 ...- 1
- クライアントとの汎用通信 (通信用の TLS をサポート) と inter-broker 通信用のレプリケーションリスナーの 2 つのリスナーが設定されます。
- 2
- TLS 対応のリスナーの場合、プロトコル名は SASL_PLAINTEXT です。TLS に対応していないコネクターの場合、プロトコル名は SASL_PLAINTEXT です。SSL が必要ない場合は、
ssl.*プロパティーを削除できます。 - 3
- Kerberos 認証のための SASL メカニズムは
GSSAPIです。 - 4
- inter-broker 通信の Kerberos 認証。
- 5
- 認証要求に使用するサービスの名前は、同じ Kerberos 設定を使用している他のサービスと区別するために指定されます。
Kafka ブローカーを起動し、JVM パラメーターを使用して 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 プロデューサーおよびコンシューマークライアントの設定
認証に Kerberos Key Distribution Center (KDC) を使用するように producer1 および consumer1 のために作成したユーザープリンシパルとキータブを使用して Kafka プロデューサーおよびコンシューマークライアントを設定します。
プロデューサーまたはコンシューマー設定ファイルに Kerberos 設定を追加します。
以下に例を示します。
/opt/kafka/config/producer.properties
# ... sasl.mechanism=GSSAPI1 security.protocol=SASL_PLAINTEXT2 sasl.kerberos.service.name=kafka3 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)
- 「AMQ Streams on RHEL - Example Kerberos set up configuration」
- 「AMQ Streams on RHEL - Example Kafka client with Kerberos authentication」