4.10.2.2. Kafka クラスターでの OAuth 2.0 認証設定

Kafka クラスターで OAuth 2.0 認証を使用するには、Kafka クラスターの OAuth 認証リスナー設定を Kafka server.properties ファイルで有効にします。最小の設定が必要です。また、TLS がブローカー間通信に使用される TLS リスナーを設定することもできます。

以下の方法のいずれかを使用して、承認サーバーによってトークン検証のブローカーを設定できます。

  • 高速なローカルトークン検証: JWKS エンドポイントが署名済み JWT 形式のアクセストークンと組み合わせて使用
  • イントロスペクションエンドポイント

OAUTHBEARER または PLAIN 認証(またはその両方)を設定できます。

以下の例は、グローバル リスナー設定を適用する最小設定を示しています。つまり、ブローカー間通信はアプリケーションクライアントと同じリスナーを通過します。

この例は、sasl.enabled.mechanisms ではなく listener.name.LISTENER-NAME.sasl.enabled.mechanisms を指定する、特定のリスナーの OAuth 2.0 設定も示しています。tFineER-NAME は、リスナーの大文字と小文字を区別しません。ここでは、リスナーの名前を CLIENT とし、プロパティー名は listener.name.client.sasl.enabled.mechanisms になります。

この例では、OAUTHBEARER 認証を使用します。

例: JWKS エンドポイントを使用した OAuth 2.0 認証の最小リスナー設定

sasl.enabled.mechanisms=OAUTHBEARER 1
listeners=CLIENT://0.0.0.0:9092 2
listener.security.protocol.map=CLIENT:SASL_PLAINTEXT 3
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER 4
sasl.mechanism.inter.broker.protocol=OAUTHBEARER 5
inter.broker.listener.name=CLIENT 6
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler 7
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ 8
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \ 9
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \ 10
  oauth.username.claim="preferred_username"  \ 11
  oauth.client.id="kafka-broker" \ 12
  oauth.client.secret="kafka-secret" \ 13
  oauth.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/token" ; 14
listener.name.client.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 15
listener.name.client.oauthbearer.connections.max.reauth.ms=3600000 16

1
SASL を介した認証情報交換の OAUTHBEARER メカニズムを有効にします。
2
クライアントアプリケーションが接続するリスナーを設定します。システム hostname は、再接続のためにクライアントが解決する必要があるアドバタイズされたホスト名として使用されます。この例では、リスナーの名前は CLIENT になります。
3
リスナーのチャネルプロトコルを指定します。SASL_SSL は TLS 用です。SASL_PLAINTEXT 暗号化されていない接続に使用されますが(TLS なし)、TCP 接続層での盗難や傍受のリスクがあります。
4
CLIENT リスナーの OAUTHBEARER メカニズムを指定します。クライアント名(CLIENT)は通常、listeners プロパティーで大文字で指定します。listener.name プロパティーの場合は小文字(listener.name.client)と、listener.name.client.* プロパティーの一部が含まれる場合に小文字が指定されます。
5
ブローカー間の通信に OAUTHBEARER メカニズムを指定します。
6
ブローカー間の通信のリスナーを指定します。設定を有効にするには、仕様が必要です。
7
クライアントリスナーで OAuth 2.0 認証を設定します。
8
クライアントおよびブローカー間の通信の認証設定を設定します。oauth.client.idoauth.client.secret、および auth.token.endpoint.uri プロパティーは、ブローカー間の設定に関連します。
9
有効な発行者 URI。この発行者が発行するアクセストークンのみが許可されます。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
10
JWKS エンドポイント URL。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
11
トークンの実際のユーザー名が含まれるトークン要求 (またはキー)。ユーザー名は、ユーザーの識別に使用される principal です。この値は、使用される認証フローと承認サーバーによって異なります。
12
すべてのブローカーで同じ Kafka ブローカーのクライアント ID。これは、 kafka-brokerとして承認サーバーに登録されているクライアント です。
13
すべてのブローカーで同じ Kafka ブローカーのシークレット。
14
承認サーバーへの OAuth 2.0 トークンエンドポイント URL。本番環境では常に HTTP を使用してください。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token
15
ブローカー間の通信に OAuth 2.0 認証を有効にする(および唯一の必須)場合。
16
(任意設定): トークンの期限が切れるとセッションの有効期限を強制し、Kafka の再認証メカニズム もアクティブにします。指定された値がアクセストークンの有効期限が切れるまでの残り時間未満の場合、クライアントは実際にトークンの有効期限が切れる前に再認証する必要があります。デフォルトでは、アクセストークンの期限が切れてもセッションは期限切れにならず、クライアントは再認証を試行しません。

以下の例は、TLS がブローカー間通信に使用される TLS リスナーの最小設定を示しています。

例: OAuth 2.0 認証の TLS リスナー設定

listeners=REPLICATION://kafka:9091,CLIENT://kafka:9092 1
listener.security.protocol.map=REPLICATION:SSL,CLIENT:SASL_PLAINTEXT 2
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER
inter.broker.listener.name=REPLICATION
listener.name.replication.ssl.keystore.password=KEYSTORE-PASSWORD 3
listener.name.replication.ssl.truststore.password=TRUSTSTORE-PASSWORD
listener.name.replication.ssl.keystore.type=JKS
listener.name.replication.ssl.truststore.type=JKS
listener.name.replication.ssl.endpoint.identification.algorithm=HTTPS 4
listener.name.replication.ssl.secure.random.implementation=SHA1PRNG 5
listener.name.replication.ssl.keystore.location=PATH-TO-KEYSTORE 6
listener.name.replication.ssl.truststore.location=PATH-TO-TRUSTSTORE 7
listener.name.replication.ssl.client.auth=required 8
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \
  oauth.username.claim="preferred_username" ; 9

1
ブローカー間の通信とクライアントアプリケーションには、別の設定が必要です。
2
TLS を使用するように REPLICATION リスナーと、暗号化されていないチャネルで SASL を使用するように CLIENT リスナーを設定します。クライアントは、実稼働環境で暗号化チャンネル(SASL_SSL)を使用することができます。
3
ssl. プロパティーは TLS 設定を定義します。
4
乱数ジェネレーターの実装。設定されていない場合は、Java プラットフォーム SDK のデフォルトが使用されます。
5
ホスト名の検証。空の文字列に設定すると、ホスト名の検証はオフになります。設定されていない場合は、デフォルト値は HTTPS で、サーバー証明書のホスト名の検証を強制します。
6
リスナーのキーストアへのパス。
7
リスナーのトラストストアへのパス。
8
REPLICATION リスナーのクライアントが TLS 接続の確立時にクライアント証明書で認証する必要があることを指定します(ブローカー間接続に使用されます)。
9
OAuth 2.0 の CLIENT リスナーを設定します。承認サーバーとの接続は、セキュアな HTTPS 接続を使用する必要があります。

以下の例は、SASL を介した認証情報交換の PLAIN 認証メカニズムを使用した OAuth 2.0 認証の最小設定を示しています。高速のローカルトークン検証が使用されます。

例: PLAIN 認証の最小リスナー設定

listeners=CLIENT://0.0.0.0:9092 1
listener.security.protocol.map=CLIENT:SASL_PLAINTEXT 2
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER,PLAIN 3
sasl.mechanism.inter.broker.protocol=OAUTHBEARER 4
inter.broker.listener.name=CLIENT 5
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler 6
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ 7
  oauth.valid.issuer.uri="http://AUTH_SERVER/auth/realms/REALM" \ 8
  oauth.jwks.endpoint.uri="https://AUTH_SERVER/auth/realms/REALM/protocol/openid-connect/certs" \ 9
  oauth.username.claim="preferred_username"  \ 10
  oauth.client.id="kafka-broker" \ 11
  oauth.client.secret="kafka-secret" \ 12
  oauth.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/token" ; 13
listener.name.client.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 14
listener.name.client.plain.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.plain.JaasServerOauthOverPlainValidatorCallbackHandler 15
listener.name.client.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ 16
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \ 17
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \ 18
  oauth.username.claim="preferred_username"  \ 19
  oauth.token.endpoint.uri="http://AUTH_SERVER/auth/realms/REALM/protocol/openid-connect/token" ; 20
connections.max.reauth.ms=3600000 21

1
クライアントアプリケーションが接続するリスナー(この例では CLIENT )を設定します。システム hostname は、再接続のためにクライアントが解決する必要があるアドバタイズされたホスト名として使用されます。これは唯一設定されたリスナーであるため、ブローカー間の通信にも使用されます。
2
暗号化されていないチャネルで SASL を使用するように CLIENT リスナーの例を設定します。実稼働環境では、TCP 接続層で盗難や傍受のために保護するために、クライアントは暗号化チャンネル(SASL_SSL)を使用する必要があります。
3
SASL を介した認証情報交換の PLAIN 認証メカニズムを有効にします。ブローカー間通信には必要であるため、OAUTHBEARER も指定されます。Kafka クライアントは、使用するメカニズムを選択できます。
4
ブローカー間の通信に OAUTHBEARER 認証メカニズムを指定します。
5
ブローカー間の通信にリスナー(この例では CLIENT )を指定します。設定が有効であるには必要。
6
OAUTHBEARER メカニズムのサーバーコールバックハンドラーを設定します。
7
OAUTHBEARER メカニズムを使用して、クライアントおよびブローカー間の通信の認証設定を設定します。oauth.client.idoauth.client.secret、および oauth.token.endpoint.uri プロパティーは、ブローカー間の設定に関連します。
8
有効な発行者 URI。この発行者からアクセストークンのみが許可されます。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
9
JWKS エンドポイント URL。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
10
トークンの実際のユーザー名が含まれるトークン要求 (またはキー)。ユーザー名は、ユーザーを識別する プリンシパル です。この値は、使用される認証フローと承認サーバーによって異なります。
11
すべてのブローカーで同じ Kafka ブローカーのクライアント ID。これは、 kafka-brokerとして承認サーバーに登録されているクライアント です。
12
Kafka ブローカーのシークレット(すべてのブローカーで同じ)。
13
承認サーバーへの OAuth 2.0 トークンエンドポイント URL。本番環境では常に HTTPS を使用します。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token
14
ブローカー間の通信の OAuth 2.0 認証を有効にします。
15
PLAIN 認証のサーバーコールバックハンドラーを設定します。
16
PLAIN 認証を使用してクライアント通信の認証設定を設定します。

oauth.token.endpoint.uri OAuth 2.0 クライアントクレデンシャルメカニズムを使用して OAuth 2.0 を PLAIN で有効にする必須のプロパティーです。

17
有効な発行者 URI。この発行者からアクセストークンのみが許可されます。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
18
JWKS エンドポイント URL。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
19
トークンの実際のユーザー名が含まれるトークン要求 (またはキー)。ユーザー名は、ユーザーを識別する プリンシパル です。この値は、使用される認証フローと承認サーバーによって異なります。
20
(必須)承認サーバーへの OAuth 2.0 トークンエンドポイント URL。本番環境では常に HTTP を使用してください。例: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token

リスナーは、OAuth 2.0 クライアントクレデンシャルメカニズムを使用してクライアントの代わりにアクセストークンを取得します。リスナーは username および password パラメーターを clientId および secret として扱います。

21
(任意設定): トークンの期限が切れるとセッションの有効期限を強制し、Kafka の再認証メカニズム もアクティブにします。指定された値がアクセストークンの有効期限が切れるまでの残り時間未満の場合、クライアントは実際にトークンの有効期限が切れる前に再認証する必要があります。デフォルトでは、アクセストークンの期限が切れてもセッションは期限切れにならず、クライアントは再認証を試行しません。