Kafka の管理者試験では、リスナー設計、相互認証(mTLS)、証明書の取り回し、そして検証・運用の手順が頻出です。ここでは公式ドキュメントに沿った安定概念だけに絞り、試験でも現場でも通用する形でまとめます。
前提として、Kafka は broker↔client と broker↔broker の両方を TLS で保護できます。ZooKeeper 併用型/ KRaft モードいずれでも基本原理は同じで、証明書の正当性、SAN、リスナーの整合性が鍵になります。
Kafka では、クライアント通信とブローカー間レプリケーションの双方に TLS を適用できます。試験/実務で混乱しやすいのは「どのリスナーがどの経路を担うか」と「証明書の信頼関係」です。
最低限、クライアント向けリスナーを SSL もしくは SASL_SSL とし、inter.broker.listener.name で指定する内部レプリケーション用リスナーも暗号化する方針を取ります。証明書はブローカーごとに固有の鍵と SAN を持たせ、共通の信頼できる CA で署名します。
Kafka TLS 配置の俯瞰
ブローカーごとの証明書要件メモ
# 各ブローカーで固有の鍵/証明書
# SAN に FQDN (例: broker1.example.com) と必要なら IP を含める
# すべて同じ信頼された CA で署名
# truststore には中間 CA を含めて完全なチェーンを構成Kafka は複数リスナーを持てます。クライアント向けとブローカー間向けを分け、後者を inter.broker.listener.name で指定します。どのリスナーがどのプロトコルかは listener.security.protocol.map で定義します。
advertised.listeners はクライアントが接続時に参照する公開名で、証明書の SAN と一致させるのが鉄則です。一致しないとホスト名検証で失敗します。
server.properties の代表設定例(クライアントと内部で分離)
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9093
advertised.listeners=INTERNAL://broker1.example.com:9092,EXTERNAL://broker1.example.com:9093
listener.security.protocol.map=INTERNAL:SSL,EXTERNAL:SSL
inter.broker.listener.name=INTERNAL
# TLS 共通設定(JKS/PKCS12 どちらでも可。近年は PEM もサポートされるが試験では JKS/PKCS12 が無難)
ssl.keystore.location=/var/private/ssl/kafka.broker1.p12
ssl.keystore.password=${FILE:/etc/kafka/keystore.pass}
ssl.keystore.type=PKCS12
ssl.truststore.location=/var/private/ssl/kafka.truststore.p12
ssl.truststore.password=${FILE:/etc/kafka/truststore.pass}
ssl.truststore.type=PKCS12
# クライアント向けリスナーで相互認証を要求する場合
ssl.client.auth=required用途に応じて、証明書のみで暗号化する単方向 TLS、クライアント証明書も要求する mTLS、あるいは TLS 上に SASL(PLAIN/SCRAM/OAUTHBEARER など)を重ねる方式を選びます。
管理者試験では、どのモードが何を証明し、どのストアが必要か、どの設定が肝かを正しく選べることが問われます。
| モード | 認証主体 | 必要ストア/証明書 | 主な用途・注意点 |
|---|---|---|---|
| SSL(単方向) | サーバのみ | ク: truststore / サ: keystore+cert | 暗号化必須だがクライアント実体は別手段で管理。 |
| SSL(mTLS) | 相互(サーバ+クライアント) | ク: truststore+keystore / サ: truststore+keystore | ネットワーク境界厳格、クライアント証明書の配布/ローテーションが運用コスト。 |
| SASL_SSL(SCRAM) | SASL のユーザ/パスワード | ク: truststore / サ: keystore+cert(SASL は別管理) | ユーザ管理を Kafka 内で実施可能。mTLS ほど証明書配布が重くない。 |
| PLAINTEXT(参考) | なし | なし | 試験/本番では非推奨。PoC/隔離ネットワーク限定。 |
SASL_SSL(SCRAM)の最小追加設定(ブローカー側)
# 例: INTERNAL は SSL、EXTERNAL を SASL_SSL に
listener.security.protocol.map=INTERNAL:SSL,EXTERNAL:SASL_SSL
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9094
advertised.listeners=INTERNAL://broker1.example.com:9092,EXTERNAL://broker1.example.com:9094
inter.broker.listener.name=INTERNAL
# SASL 関連
sasl.enabled.mechanisms=SCRAM-SHA-512
listener.name.external.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
# 注意: 実際のユーザ作成は kafka-configs.sh --alter --add-config 'SCRAM-SHA-512=[password=...]' などで実施各ブローカーは固有の秘密鍵と証明書を持ち、信頼できる CA による署名を受けます。SAN に FQDN を必ず含め、advertised.listeners と一致させます。中間 CA を含む完全なチェーンを truststore に格納することが重要です。
ローテーションはローリングで行い、先に truststore に新 CA を追加→新証明書を配布→各ノードを段階的に再起動の順が安全です。パスワードやファイル権限は最小権限で管理します。
keytool/openssl による代表的な手順
# 1) キーストア作成と鍵・CSR 生成(PKCS12)
keytool -genkeypair -alias broker1 -keyalg RSA -keystore kafka.broker1.p12 -storetype PKCS12 -storepass changeit -keypass changeit -dname "CN=broker1.example.com, OU=Kafka, O=Example, L=Tokyo, C=JP" -ext SAN=DNS:broker1.example.com,IP:10.0.0.11
keytool -certreq -alias broker1 -keystore kafka.broker1.p12 -storepass changeit -file broker1.csr -ext SAN=DNS:broker1.example.com,IP:10.0.0.11
# 2) CA で署名し、CA ルート/中間と一緒にインポート
keytool -importcert -alias CARoot -file ca-root.crt -keystore kafka.broker1.p12 -storepass changeit -noprompt
keytool -importcert -alias CAInt -file ca-int.crt -keystore kafka.broker1.p12 -storepass changeit -noprompt
keytool -importcert -alias broker1 -file broker1.signed.crt -keystore kafka.broker1.p12 -storepass changeit
# 3) truststore 作成(CA チェーンを格納)
keytool -importcert -alias CARoot -file ca-root.crt -keystore kafka.truststore.p12 -storetype PKCS12 -storepass changeit -noprompt
keytool -importcert -alias CAInt -file ca-int.crt -keystore kafka.truststore.p12 -storetype PKCS12 -storepass changeit -noprompt
# 4) 検証
keytool -list -v -keystore kafka.broker1.p12 -storepass changeit | grep -E "Alias name|Owner|Issuer|SubjectAlternativeName"クライアントの最小設定は security.protocol と truststore の指定です。mTLS を要求するブローカーに接続する場合は、クライアント側にも keystore を設定します。ホスト名検証はデフォルトで有効(ssl.endpoint.identification.algorithm=HTTPS)で、証明書の SAN と接続先名が一致している必要があります。
接続性の一次切り分けには openssl s_client が有効です。証明書チェーンやホスト名検証の失敗を即座に確認できます。
client.properties の例と接続検証
# client.properties(単方向 TLS)
bootstrap.servers=broker1.example.com:9093,broker2.example.com:9093
security.protocol=SSL
ssl.truststore.location=/etc/client/kafka.truststore.p12
ssl.truststore.password=${FILE:/etc/client/trust.pass}
ssl.truststore.type=PKCS12
ssl.endpoint.identification.algorithm=HTTPS
# mTLS で必要な追加
ssl.keystore.location=/etc/client/client.p12
ssl.keystore.password=${FILE:/etc/client/key.pass}
ssl.keystore.type=PKCS12
# openssl で事前検証(SNI とホスト名検証の観点で FQDN を使う)
openssl s_client -connect broker1.example.com:9093 -servername broker1.example.com -showcerts最頻出の失敗は SAN/ホスト名不一致、チェーン不完全、inter.broker.listener.name の不整合、証明書期限切れ、パスワード不一致です。ログには javax.net.ssl.SSLHandshakeException、certificate_unknown、handshake_failure などが出ます。
ACL と証明書主体名の対応も試験ポイントです。mTLS で証明された DN を短縮して主体名にマッピングする場合は ssl.principal.mapping.rules を使います。
よく使う確認コマンドと設定
# ブローカーの SSL ハンドシェイクエラーを抽出
grep -E "SSLHandshakeException|handshake_failure|certificate_unknown" /var/log/kafka/server.log
# 証明書の SAN を確認
keytool -list -v -keystore /var/private/ssl/kafka.broker1.p12 -storepass changeit | grep -A2 "SubjectAlternativeName"
# mTLS で DN から主体名を抽出するマッピング例(CN を user とする)
ssl.principal.mapping.rules=RULE:^CN=(.*?),.*$/$1/,DEFAULTCCAAK
問題 1
本番クラスタで、クライアントは mTLS、ブローカー間は SSL(相互認証)で暗号化したい。正しい設定の組み合わせはどれか。
正解: A
mTLS を要求するには ssl.client.auth=required が必要で、クライアント側にも keystore が要る。ブローカー間通信は inter.broker.listener.name で指定したリスナーが SSL である必要がある。B は暗号化されず、C はブローカー間が PLAINTEXT、D はクライアント側が PLAINTEXT で不適切。
PEM と JKS/PKCS12 のどれを使うべきですか?
Kafka は近年 PEM もサポートしますが、管理者試験と多くの企業標準では JKS/PKCS12 が前提です。運用で統一されている形式に合わせ、試験対策としては JKS/PKCS12 のフロー(keytool、truststore/keystore)を確実に押さえましょう。
advertised.listeners はなぜ重要ですか?
クライアントがブローカーから受け取る接続先情報で、TLS のホスト名検証はこの値と証明書の SAN を照合します。一致しないと SSLHandshakeException になります。外部から解決できる FQDN を設定してください。
mTLS と SASL_SSL はどちらを選ぶべきですか?
ゼロトラストやネットワーク境界が厳しい場合は mTLS が有効です。一方、クライアント配布やローテーションの運用コストを抑えたい場合は SASL_SSL(SCRAM など)を選ぶことが多いです。両者を混在させる場合はリスナーを分離して運用します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...