Kafka のアクセス制御は Principal(誰)・Resource(何に)・Operation(何をする)・Permission(許可/拒否)・Pattern(一致方法)の積み上げで決まります。試験や実務で迷いやすいのは、この5要素の組み合わせと評価順序です。
この記事では公式ドキュメントに基づき、設計の勘所と CLI 例を最小構成でまとめます。CCAAK を意識しつつ、現場でそのまま使える命名・前方一致・Deny ルールの扱いを具体化します。
Kafka の ACL は、Principal(User:app、CN=client、krb5 の principal など)、Resource(Topic/Group/Cluster/TransactionalId…)、Operation(READ/WRITE/CREATE…)、Permission(ALLOW/DENY)、Pattern(LITERAL/PREFIXED)の組み合わせで定義します。評価は基本的に「一致した DENY があれば拒否、なければ一致した ALLOW があれば許可、なければ拒否」です。
初期運用では StandardAuthorizer(最近の Kafka 既定の Authorizer)を有効化し、スーパーユーザ(運用用)を明示、業務アプリには最小権限のみを付与するのが安全です。
| リソースパターン | 表記例 | 主用途 | 試験の落とし穴 |
|---|---|---|---|
| LITERAL | —topic payments | 単一トピックだけを許可/拒否 | 命名変更に弱い。将来の拡張に追随しづらい |
| PREFIXED | —topic payments- (—resource-pattern-type prefixed) | 名前空間(接頭辞)単位の許可 | 思わぬ範囲に波及。拒否を混ぜるとトラブルになりやすい |
| ワイルドカード | —topic "*" | 全体的な許可/拒否(運用者/内製ツールなど) | 実務では最小化。試験では誤用を選ばせる設問が多い |
基本の ACL 付与(ブローカー3.x以降は --bootstrap-server を推奨)
bin/kafka-acls.sh \
--bootstrap-server broker1:9092 \
--add --allow-principal User:app-writer \
--operation WRITE --operation DESCRIBE \
--topic payments
# コンシューマ(トピックREAD + グループREAD)
bin/kafka-acls.sh \
--bootstrap-server broker1:9092 \
--add --allow-principal User:app-reader \
--operation READ --topic payments \
--operation READ --group pay-consumer
Principal は認証層から渡される実体で、SASL/SCRAM のユーザ名、SASL/PLAIN のユーザ、mTLS の証明書サブジェクト(CN 等)、Kerberos のプリンシパルが一般的です。ACL は最終的に User:xxx といった文字列で評価されます。
設計上はアプリ/役割単位のサービスアカウントを分け、環境とシステム名を接頭辞に入れて衝突・横断的権限付与を避けます。障害調査のため人間利用の Principal とサービス用を必ず分離しましょう。
SASL/SCRAM のユーザ作成と ACL 付与(例)
# SCRAM ユーザ作成(ブローカー側)
bin/kafka-configs.sh --bootstrap-server broker1:9092 \
--alter --add-config 'SCRAM-SHA-512=[password=secret-pass]' \
--entity-type users --entity-name prod-appA-writer
# 書き込み用 ACL
auth_user=User:prod-appA-writer
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal "$auth_user" \
--operation WRITE --operation DESCRIBE \
--topic payments-orders
トピック/グループは名前空間を切ると ACL 設計が単純になります。システム名-ドメイン-用途-環境 などの規則で統一し、前方一致(PREFIXED)を使ってまとめて許可するのが実務的です。
ただし PREFIXED は範囲が広くなりがちです。Deny と組み合わせて微修正するのではなく、許可側のプレフィックス設計を見直すのが安全です。
名前空間と前方一致 ACL のイメージ
PREFIXED ACL の付与(トピック/グループにまとめて適用)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-reader \
--resource-pattern-type prefixed \
--operation READ --topic payments- \
--operation READ --group prod-appA-
プロデューサ/コンシューマ/管理者など典型ロールごとに必要な Operation はほぼ定型です。冪等プロデューサやトランザクションを使う場合は Cluster/TransactionalId への付与が別途必要になります。
本番では auto.create.topics.enable は無効が通例のため、トピック作成は管理用 Principal に限定しましょう。
典型ロールの ACL 例
# 冪等プロデューサ(idempotent)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-writer \
--operation WRITE --operation DESCRIBE --topic payments-orders-prod
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-writer \
--operation IDEMPOTENT_WRITE --cluster
# トランザクション(transactional.id=tx-payments)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-writer \
--operation WRITE --transactional-id tx-payments
# コンシューマ(グループ単位)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-reader \
--operation READ --topic payments-orders-prod \
--operation READ --group prod-appA-consumer
Kafka の Authorizer は一致した DENY が1つでもあれば拒否、DENY がなければ一致した ALLOW が1つでもあれば許可、どちらもなければ拒否という単純なルールです。パターンの“より具体的”といった優先度はありません。広い PREFIXED の ALLOW に対して、より狭い LITERAL の DENY を置くと、DENY が常に優先して遮断されます。
例外として、ブローカー設定の super.users に列挙された Principal は ACL をバイパスします。運用者専用に限定し、監査ログを必ず有効化してください。
Deny の具体例(特定トピックだけ遮断)
# 広い許可(payments-* を READ 許可)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:prod-appA-reader \
--resource-pattern-type prefixed \
--operation READ --topic payments-
# ただし refunds は読ませない(Deny が優先)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --deny-principal User:prod-appA-reader \
--operation READ --topic payments-refunds-prod
ACL は即時反映されるため、誤設定の影響が大きく出ます。変更前に影響範囲を可視化し、命名規則と付与方針をコード化(IaC)してレビュー可能にするのが安全です。Confluent 環境なら RBAC 併用も検討できますが、試験ではベーシックな ACL 評価が中心です。
監査では、拒否ログ・誰がどの操作で拒否されたか・どの ACL にマッチしたかの突合を日次で行います。アプリ移行時は、PREFIXED を使って一時的に広めに許可し、移行完了後に範囲を絞り込むのが現実的です。
棚卸し・削除・安全なロールバック
# 一覧
bin/kafka-acls.sh --bootstrap-server broker1:9092 --list
# 特定 ACL の削除(間違いを戻す)
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--remove --allow-principal User:prod-appA-reader \
--operation READ --group prod-appA-consumer
# 広い PREFIXED 許可を一時付与して移行を助け、後で削る
bin/kafka-acls.sh --bootstrap-server broker1:9092 \
--add --allow-principal User:migration-helper \
--resource-pattern-type prefixed --operation READ --topic payments-
CCAAK
問題 1
運用中のクラスターで、User:svc-a に対して topics すべての READ を PREFIXED で許可しています(payments- など)。ただし payments-refunds-prod だけは読ませたくありません。最も安全で予測可能な対応はどれですか?
正解: A
Kafka の評価は Deny が常に優先です。広い ALLOW(PREFIXED)があっても、特定トピックへの READ を DENY すれば確実に遮断できます。C と D は範囲が広すぎて副作用が大きく、B は運用コストが高く誤りやすい設計です。
idempotent producer に必要な ACL は?
対象トピックへの WRITE + DESCRIBE に加え、Cluster リソースで IDEMPOTENT_WRITE が必要です。さらにトランザクションを使う場合は TransactionalId(例: --transactional-id tx-foo)への WRITE も付与します。
Consumer に必要な最小権限は?
READ(対象 Topic)と READ(対象 Group)が必要です。これでフェッチ・グループ参加・オフセットコミットが可能になります。管理系操作(削除・設定変更)は不要です。
ACL を有効化すると既存アプリはどうなる?
Authorizer を有効化し ACL が未設定の場合は基本的に拒否(deny-by-default)になります。切替時は先に必要な ALLOW を作成し、監査ログでアクセスを確認してから本番トラフィックを流してください。
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-...