Kafka

Kafka の ACL 設計ガイド: Principal・Resource・Operation を正しく組み合わせる

2026-04-19
NicheeLab編集部

Kafka のアクセス制御は Principal(誰)・Resource(何に)・Operation(何をする)・Permission(許可/拒否)・Pattern(一致方法)の積み上げで決まります。試験や実務で迷いやすいのは、この5要素の組み合わせと評価順序です。

この記事では公式ドキュメントに基づき、設計の勘所と CLI 例を最小構成でまとめます。CCAAK を意識しつつ、現場でそのまま使える命名・前方一致・Deny ルールの扱いを具体化します。

ACL の基礎: 5つの要素と安全な初期設定

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)を有効化し、スーパーユーザ(運用用)を明示、業務アプリには最小権限のみを付与するのが安全です。

  • 主な Resource: Topic, Group, Cluster, TransactionalId
  • 代表的 Operation と意味: READ(取得/グループ参加・コミット), WRITE(書き込み), CREATE/DELETE(作成/削除), DESCRIBE(メタデータ参照), ALTER/ALTER_CONFIGS(変更), DESCRIBE_CONFIGS(設定参照), IDEMPOTENT_WRITE(冪等プロデュース許可)
  • Pattern: LITERAL(完全一致), PREFIXED(前方一致)。ワイルドカード "*" も使用可(広範囲に効くため取り扱い注意)
  • DENY は強力です。例外的な遮断に限定し、通常は ALLOW ベースで設計します
リソースパターン表記例主用途試験の落とし穴
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 設計: サービスアカウントと命名規則

Principal は認証層から渡される実体で、SASL/SCRAM のユーザ名、SASL/PLAIN のユーザ、mTLS の証明書サブジェクト(CN 等)、Kerberos のプリンシパルが一般的です。ACL は最終的に User:xxx といった文字列で評価されます。

設計上はアプリ/役割単位のサービスアカウントを分け、環境とシステム名を接頭辞に入れて衝突・横断的権限付与を避けます。障害調査のため人間利用の Principal とサービス用を必ず分離しましょう。

  • 命名例: prod-appA-writer, stg-appA-reader のように env-system-role を含める
  • 1アプリ1アカウント(共有禁止)、回転・失効を容易にする
  • mTLS の場合は証明書の CN/OU → Principal 変換ルールを固定化
  • スーパーユーザは super.users=User:ops-admin のように限定列挙

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

Resource 設計: 名前空間と PREFIXED の使いどころ

トピック/グループは名前空間を切ると ACL 設計が単純になります。システム名-ドメイン-用途-環境 などの規則で統一し、前方一致(PREFIXED)を使ってまとめて許可するのが実務的です。

ただし PREFIXED は範囲が広くなりがちです。Deny と組み合わせて微修正するのではなく、許可側のプレフィックス設計を見直すのが安全です。

  • 命名例: payments-orders-prod, payments-refunds-prod, analytics-raw-stg
  • グループ名も同様に env-system-role を含める: prod-appA-consumer
  • 同一接頭辞に運用系と業務系を混在させない(人為ミス抑止)
  • トピックの自動作成は原則無効化し、Admin 経由で管理

名前空間と前方一致 ACL のイメージ

Kafka Clusterpayments-orders-prodTopicpayments-refunds-prodTopicanalytics-raw-stgTopicanalytics-curated-stgTopicACL (PREFIXED)User:prod-appA-reader → READ on payments-*, group prod-appA-*名前空間と PREFIXED 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 設計: 最小権限セットの定石

プロデューサ/コンシューマ/管理者など典型ロールごとに必要な Operation はほぼ定型です。冪等プロデューサやトランザクションを使う場合は Cluster/TransactionalId への付与が別途必要になります。

本番では auto.create.topics.enable は無効が通例のため、トピック作成は管理用 Principal に限定しましょう。

  • Producer: WRITE + DESCRIBE(対象 Topic)。冪等は IDEMPOTENT_WRITE(Cluster)を追加
  • Transactional producer: 上記 + WRITE(対象 TransactionalId)
  • Consumer(Group管理あり): READ(対象 Topic)+ READ(対象 Group)
  • Topic 管理者: CREATE/DELETE/ALTER/DESCRIBE/ALTER_CONFIGS/DESCRIBE_CONFIGS(対象 Topic)。必要に応じて Cluster の CREATE
  • 監視用途: DESCRIBE / DESCRIBE_CONFIGS のみを最小付与

典型ロールの 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

評価順序と Deny の扱い: 衝突時はどうなるか

Kafka の Authorizer は一致した DENY が1つでもあれば拒否、DENY がなければ一致した ALLOW が1つでもあれば許可、どちらもなければ拒否という単純なルールです。パターンの“より具体的”といった優先度はありません。広い PREFIXED の ALLOW に対して、より狭い LITERAL の DENY を置くと、DENY が常に優先して遮断されます。

例外として、ブローカー設定の super.users に列挙された Principal は ACL をバイパスします。運用者専用に限定し、監査ログを必ず有効化してください。

  • Deny は最終手段。誤設計のカバーに使わず、名前空間と ALLOW 側を見直す
  • パターンが複数一致しても Deny > Allow > Default deny
  • 監査: authorizer.log.enabled を有効化し、拒否イベントを監視

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 を使って一時的に広めに許可し、移行完了後に範囲を絞り込むのが現実的です。

  • 現状確認: kafka-acls.sh --list で Principal/Resource ごとに棚卸し
  • 変更は Pull Request ベースで。命名規則と一体管理
  • 本番直前の deny テスト: ダミー Principal で遮断確認
  • 環境分離: stg と prod の接頭辞・クラスターを分離

棚卸し・削除・安全なロールバック

# 一覧
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 だけは読ませたくありません。最も安全で予測可能な対応はどれですか?

  1. payments-refunds-prod に対して READ の DENY を追加する
  2. PREFIXED 許可を削除し、必要な全トピックに LITERAL の ALLOW を並べる
  3. "*" に対する READ の DENY を追加し、必要なトピックだけ ALLOW を追加する
  4. グループ名に制限を追加すればトピックはそのままでよい

正解: 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 を作成し、監査ログでアクセスを確認してから本番トラフィックを流してください。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Kafka

Kafka Topic と Partition の基礎: 分散とスケーラビリティの要

CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...

Kafka

CCDAK 試験ガイド:出題範囲・配点・申込み・対策

Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...

Kafka

Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点

CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...

Kafka

Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性

レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...

Kafka

Kafka の Offset とコミット: ポジション管理と at-least-once の基礎

CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...

Kafkaの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.