Kafka ACL によるアクセス制御

このドキュメントでは、Google Cloud Managed Service for Apache Kafka でアクセス制御に Apache Kafka アクセス制御リスト(ACL)を使用する方法について説明します。

Apache Kafka ACL は、Kafka クラスタ内で詳細なアクセス制御を提供します。 Managed Service for Apache Kafka では、すぐに使用できる StandardAuthorizer が有効になっており、ACL は KRaft ベースの Kafka クラスタ メタデータに保存されます。

  • これらの ACL は、認証されたユーザーが特定の Kafka リソースに対して特定のオペレーション(トピックでのメッセージの生成や消費など)を実行できるかどうかを制御します。

  • これらの ACL は、標準の Apache Kafka クライアントを使用してクラスタとのやり取りを制御する場合に便利です。標準の Apache Kafka クライアントは、最初の接続時にクラスタレベルの IAM チェックのみを受けます。詳細については、 IAM によるアクセス制御 をご覧ください。

Kafka ACL アクセス制御の仕組み

クライアントは、クラスタ内の Kafka の標準 ACL 認可ツールとやり取りします。 認可ツールは、関連する Apache Kafka ACL を評価して、プリンシパルからリクエストされた特定のオペレーション(トピックへの生成やグループからの消費など)を認可します。ACL チェックに使用されるプリンシパルは、次のいずれかの認証方法から派生します。

包括的なセキュリティを確保するには、次のものを構成する必要があります。

  • 管理アクセス用の IAM 権限。詳細については、 IAM によるアクセス制御 をご覧ください。

  • 認証方法に関係なく、オープンソースの Apache Kafka クライアントからのクラスタ内データへのアクセスとオペレーションのための Kafka ACL。

Apache Kafka ACL の使用

Apache Kafka ACL バインディングの形式は次のとおりです。


Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.

形式に関する重要な情報を次に示します。

  • プリンシパル(P): 認可されるユーザー ID。User: の接頭辞が付けられます。

    • SASL 認証の場合、これは IAM プリンシパル(User:my-service-account@my-project.iam.gserviceaccount.com など)です。

    • mTLS 認証の場合、これはクライアント証明書の識別名(DN)(User:CN=my-client,OU=my-org-unit など)です。正確な形式は証明書のサブジェクトによって異なります。プリンシパル マッピング ルール を使用すると、この値を変換できます。

  • 権限タイプ(許可/拒否): ACL バインディングでアクセスが許可されるか拒否されるか。拒否バインディングが優先されます。

  • オペレーション(O): 実行されるアクション(読み取り、書き込み、作成など)。さまざまな Kafka プロトコルのリソースに適用されるオペレーションについては、Apache Kafka ドキュメントのプロトコルのオペレーションとリソース をご覧ください。

  • ホスト(H): リクエストの送信元マシン。Managed Service for Apache Kafka はクライアント ネットワーク アドレスを変換するため、`'*'` 以外のホストの使用は対象外です。'*'

  • リソース パターン(RP): 特定のリソースを照合するために使用されるパターン。リソース パターンは、リソースタイプ、リソース名、パターンタイプ(LITERAL または PREFIXED)で構成されます。

デフォルトのアクセス権

Managed Service for Apache Kafka クラスタは、Apache Kafka プロパティ allow.everyone.if.no.acl.foundtrue に設定された状態で動作します。Kafka ACL の有無によって、リソースへのアクセスレベルが直接決まります。

  • トピックなどの特定のリソースに Kafka ACL が定義されていない場合、認証されたすべてのプリンシパルにアクセス権が付与されます。この構成により、ACL を構成しなくても、Managed Service for Apache Kafka クラスタをすぐに操作できます。

  • そのリソースに対して Kafka ACL を定義すると、すぐにアクセスが制限されます。Kafka ACL の ALLOW エントリを使用して明示的に権限が付与されたプリンシパルのみが、一致するリソースにアクセスできます(DENY エントリによって明示的にブロックされていない限り)。

Managed Service for Apache Kafka は、サービス エージェントにクラスタへの管理アクセス権を付与します。このアクセス権により、サービス エージェントは、クラスタに構成されている他の ACL に関係なく、Managed Service for Apache Kafka API によってリクエストされたオペレーションを実行できます。 Managed Service for Apache Kafka は、StandardAuthorizer 実装を変更することでこれを実現します。この変更により、読み取りオペレーションと書き込みオペレーションを除き、サービス エージェントにスーパー ユーザーと同様の権限が付与されます。この構成は変更できません。

Kafka プリンシパル

Managed Service for Apache Kafka クラスタの Kafka プリンシパルは、 Kafka StandardAuthorizer の接頭辞 "User:" で指定されます。

  • SASL/IAM の場合: プリンシパルは Google Cloud アカウントです。たとえば、サービス アカウント test-kafka-client@test-project.iam.gserviceaccount.com へのアクセス権を付与するには、Kafka プリンシパル "User:test-kafka-client@test-project.iam.gserviceaccount.com" を使用します。Kafka ACL プリンシパルでは、ユーザー、サービス アカウント、または個々の IAM プリンシパルを指定する必要がありますが、グループやプリンシパル セットは指定できません。Kafka ACL は、 プリンシパルのグループ メンバーシップの解決をサポートしていません。 Google Cloud

  • mTLS の場合: プリンシパルは、クライアント証明書のサブジェクトの識別名(DN)から派生します。例: User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=USmTLS プリンシパル マッピング ルール を使用すると、DN を ACL 用のユーザー フレンドリーなプリンシパル文字列に変換できます。

Google グループまたはプリンシパル セットのすべてのメンバーに適用される ACL を作成するには、プロキシ サービス アカウント プリンシパルとサービス アカウントの権限借用を使用します。

  1. サービス アカウントをグループの プロキシとして使用するために作成します。

  2. サービス アカウントに対するサービス アカウント トークン作成者 ロールを Google グループまたはプリンシパル セットに付与します。サービス アカウントへのアクセス権を管理する をご覧ください。

  3. プロキシ サービス アカウントの Kafka ACL を追加します。プリンシパルの例: User:group-proxy@test-project.iam.gserviceaccount.com

  4. Kafka クライアントでサービス アカウントの権限借用 を使用して、サービス アカウントとして Kafka に対して認証します。 Google Cloud IAM は、プロキシ サービス アカウントの権限借用を許可されているグループのメンバーとして、個々のプリンシパルを認可します。Kafka は、クラスタ内の既存の ACL に対してプロキシ サービス アカウントを認可します。

プロデューサーとコンシューマーの Kafka オペレーション

オペレーションは、リソースに対して実行されるアクションです。リソースごとに、オペレーションはそのリソースに対する 1 つ以上の Kafka プロトコル リクエストにマッピングされます。 たとえば、READ オペレーションは、topic リソースタイプに対して、 FetchOffsetCommit、および TxnOffsetCommit Apache Kafka プロトコルにマッピングされます。

トピックに対するプリンシパル プロデューサーのアクセス権を付与する手順は次のとおりです。

  1. トピック リソースで、WRITE オペレーションと CREATE オペレーションを許可します。

  2. トランザクション ID を使用している場合は、トランザクション ID リソースで WRITE オペレーションを許可します。

トピックに対するプリンシパル コンシューマーのアクセス権を付与する手順は次のとおりです。

  1. トピック リソースで、READ オペレーションを許可します。

  2. コンシューマー グループ リソースで、READ オペレーションを許可します。

Kafka API がサポートするリソースに対する有効なオペレーションの詳細については、Apache Kafka ドキュメントのプロトコルのオペレーションとリソースをご覧ください。

デフォルトで拒否する動作の ACL を構成する

マネージド Kafka クラスタは allow.everyone.if.no.acl.found = true で構成されています。そのため、デフォルトでは、リソースに ACL が設定されていない場合、すべてのプリンシパルがリソースにアクセスできます。

IAM と同様の default-deny 動作を構成するには、まずクラスタ内のすべてのリソースに対する管理者ユーザーのアクセス権を構成します。これにより、すべてのリソースに ACL が定義され、allow.everyone.if.no.acl.found の動作が抑制されます。デフォルトでは、ALLOW ACL で明示的に許可されていないプリンシパルはアクセスを拒否されます。

たとえば、サービス アカウント clusterAdmin@test-project.iam.gserviceaccount.com のクラスタ内のすべてのリソースに ACL を設定するには、次の ACL エントリを作成します。

次の gcloud CLI コマンドは、特定のリージョンにある特定の Kafka クラスタに対する完全な管理アクセス権(--operation=ALL)を clusterAdmin@test-project.iam.gserviceaccount.com という名前のサービス アカウントに付与します。この権限により、サービス アカウントは任意のホストからクラスタに対して任意のオペレーションを実行できます。

gcloud managed-kafka acls add-acl-entry cluster \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

次の gcloud CLI コマンドは、特定のリージョンにある特定の Kafka クラスタ内のすべてのトピックに対する完全な管理アクセス権(--operation=ALL)を clusterAdmin@test-project.iam.gserviceaccount.com という名前のサービス アカウントに付与します。この権限により、サービス アカウントは任意のホストからすべてのトピックに対して任意のオペレーションを実行できます。

gcloud managed-kafka acls add-acl-entry allTopics \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

次の gcloud CLI コマンドは、特定のリージョンにある特定の Kafka クラスタ内のすべてのコンシューマー グループに対する完全な管理アクセス権(--operation=ALL)を clusterAdmin@test-project.iam.gserviceaccount.com という名前のサービス アカウントに付与します。この権限により、サービス アカウントは任意のホストからすべてのコンシューマー グループに対して任意のオペレーションを実行できます。

gcloud managed-kafka acls add-acl-entry allConsumerGroups \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

次の gcloud CLI コマンドは、特定のリージョンにある特定の Kafka クラスタ内のすべてのトランザクション ID に対する完全な管理アクセス権(--operation=ALL)を clusterAdmin@test-project.iam.gserviceaccount.com という名前のサービス アカウントに付与します。この権限により、サービス アカウントは任意のホストからすべてのトランザクション ID に対して任意のオペレーションを実行できます。

gcloud managed-kafka acls add-acl-entry allTransactionalIds \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

コマンドに関する重要な情報を次に示します。

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL が適用されるプリンシパル。 プリンシパルは アカウントで、KafkaStandardAuthorizer の接頭辞 User: が付いています。 Google Cloud

  • --operation=all: 付与される Kafka オペレーション。この場合は完全なアクセス権です。

  • --permission-type=ALLOW: この ACL エントリはアクセス権を付与します。

  • --host='*': プリンシパルがリソースにアクセスできるホスト。 '*' は任意のホストからのアクセスを許可します。Managed Service for Apache Kafka は、ホスト '*' の ACL のみをサポートしています。

  • CLUSTER_ID: Managed Service for Apache Kafka クラスタの名前。

  • LOCATION: Managed Service for Apache Kafka クラスタが配置されているリージョン(us-central1 など)。 Google Cloud

ACL を構成する

Apache Kafka ACL は、Managed Service for Apache Kafka ACL API を使用して構成することも、 Apache Kafka 認可ツール CLI kafka-acls.sh などのオープンソースの Apache Kafka ツールを使用して構成することも、 Admin Client を使用して構成することもできます。

Managed Service for Apache Kafka は、Kafka リソース パターン別に ACL を整理します。リソース パターンは次のように定義されます。

  • リソースタイプ: クラスタ、トピック、コンシューマー グループ、トランザクション ID

  • パターンタイプ: リテラル、または接頭辞付き(名前が指定された文字列で始まるすべてのリソース)

  • リソース名: ACL エントリが適用されるリソース名または接頭辞。

Managed Service for Apache Kafka ACL リソースは、単一の Kafka リソース パターンに対して構成されたすべてのアクセス制御を、ACL エントリの繰り返しリストとして表します。ACL リソースの名前は、ACL バインディングのリソース パターンを一意に識別します。 詳細については、ACL ID をご覧ください。

Managed Service for Apache Kafka ACL は、ACL リソースレベル(リソース パターンのすべての ACL エントリ)で管理することも、ACL リソース パターンの個々の ACL エントリを追加または削除して段階的に管理することもできます。

詳細については、マネージド Kafka ACL を作成すると マネージド Kafka ACL エントリを追加するをご覧ください。

トピックからの読み取りを許可する

サービス アカウント test-kafka-client@test-project.iam.gserviceaccount.comとして実行されているオープンソースの Apache Kafka クライアントがトピック topic-nameから読み取れるようにするには、Managed Service for Apache Kafka ACL エントリを managed-kafka acls add-acl-entry コマンドを使用して作成します。

gcloud managed-kafka acls add-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

コマンドに関する重要な情報を次に示します。

  • topic/topic-name: アクセス権を付与する Managed Service for Apache Kafka トピックを指定します。topic-name は、トピックの実際の名前に置き換えます。topic/ 接頭辞は、この ACL エントリが特定の(リテラル)トピック リソース パターンに適用されることを示します。

  • LOCATION:Managed Service for Apache Kafka クラスタが配置されている Google Cloud リージョン(us-central1など)。

  • CLUSTER_ID: Managed Service for Apache Kafka クラスタの名前。

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL が適用されるプリンシパル。 プリンシパルは アカウントで、KafkaStandardAuthorizer の接頭辞 User: が付いています。 Google Cloud

  • --operation=READ: 付与される Kafka オペレーション。この場合は READ です 。

  • --permission-type=ALLOW: この ACL エントリがアクセス権を付与することを示します。

  • --host='*': プリンシパルがリソースにアクセスできる リソースを指定します。'*' は任意のホストからのアクセスを許可します。Managed Service for Apache Kafka only supports ACLs with host '*'.

読み取りアクセス権を削除するには、同じパラメータで remove-acl-entry コマンド を使用します。

gcloud managed-kafka acls remove-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

共通の接頭辞を持つすべてのトピックへの書き込みを許可する

サービス アカウント test-kafka-client@test-project.iam.gserviceaccount.com として実行されているオープンソースの Apache Kafka クライアントが、名前が接頭辞 topic-prefix で始まるすべてのトピックに書き込めるようにするには、次のようにマネージド Kafka ACL エントリを追加します。

gcloud managed-kafka acls add-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

コマンドに関する重要な情報を次に示します。

  • topicPrefixed/topic-prefix: アクセス権を付与する Managed Service for Apache Kafka リソース パターンを指定します。topic-prefix は、トピックの実際の接頭辞に置き換えます。topicPrefixed/ 接頭辞は、この ACL エントリが接頭辞付きリソース パターン(指定された接頭辞に一致するすべてのトピック)に適用されることを示します。

  • PROJECT: Managed Service for Apache Kafka クラスタが配置されている Google Cloud プロジェクトの ID。

  • LOCATION: Managed Service for Apache Kafka クラスタが配置されている Google Cloud リージョン(us-central1など)。

  • CLUSTER_ID: Managed Service for Apache Kafka クラスタの名前。

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL が適用されるプリンシパル。 プリンシパルは アカウントで、KafkaStandardAuthorizer の接頭辞 User: が付いています。 Google Cloud

  • --operation=WRITE: 付与される Kafka オペレーション。この場合は WRITE です 。

  • --permission-type=ALLOW: この ACL エントリはアクセス権を付与します。

  • --host='*': プリンシパルがリソースにアクセスできるホスト。 '*' は任意のホストからのアクセスを許可します。Managed Service for Apache Kafka は、ホスト '*' の ACL のみをサポートしています。

このサービス アカウントの書き込みアクセス権を削除するには、ACL エントリを削除します。

gcloud managed-kafka acls remove-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

すべてのトピックの変更を拒否する

サービス アカウント test-kafka-client@test-project.iam.gserviceaccount.com として実行されているオープンソースの Apache Kafka クライアントがクラスタ内のすべてのトピックを変更できないようにするには、 Managed Service for Apache Kafka ACL リソースを AclEntry リソースのリストとともに作成して、すべてのトピックに対する ALTERALTER_CONFIGSDELETE オペレーションを 拒否します。この方法では、必要な状態を 1 つの構成で定義します。

または、gcloud managed-kafka acls add-acl-entry コマンドを使用して、3 つの別々の ACL エントリを命令的に追加することで、同じ結果を得ることができます。この方法では、次のコマンドを実行して、 オペレーション ALTERALTER_CONFIGSDELETE の各オペレーションへのアクセスを拒否します。

gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER_CONFIGS \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

次の情報は、add-acl-entry コマンドごとに適用されます。

  • allTopics: この ACL が Managed Service for Apache Kafka クラスタ内のすべてのトピックに適用されることを指定します。

  • LOCATION: Managed Service for Apache Kafka クラスタが配置されている Google Cloud リージョン(us-central1など)。

  • CLUSTER_ID: Managed Service for Apache Kafka クラスタの名前。

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL が適用されるプリンシパルを指定します。プリンシパルは アカウントで、Kafka の接頭辞 が付いています。 Google Cloud StandardAuthorizerUser:

  • --operation: 拒否される Kafka オペレーションを指定します。

    • ALTER: パーティション数やレプリケーション ファクタの変更などのアクションが含まれます。

    • ALTER_CONFIGS: トピックレベルの構成の変更が含まれます。

    • DELETE: トピックの削除が含まれます。

  • --permission-type=DENY: これらの ACL エントリが、指定されたオペレーションのアクセスをブロックすることを示します。

  • --host='*': リクエストの送信元ホスト に関係なく、この拒否が適用されることを指定します。Managed Service for Apache Kafka は、 ホスト '*' の ACL のみをサポートしています。

これらの制限を削除するには、追加したエントリごとに remove-acl-entry コマンドを使用し、同じパラメータを使用します。たとえば、トピックの削除を再度許可するには、次のようにします。

gcloud managed-kafka acls remove-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

ACL のトラブルシューティング

Apache Kafka Standard Authorizer は、デフォルトで認可の拒否に関する監査ログを書き込みます。Kafka 認可エラーが表示された場合は、クラスタログで StandardAuthorizerData logAuditMessage を検索して、拒否されたプリンシパル、リソース、オペレーションを確認できます。

クラスタログの例を次に示します。

org.apache.kafka.metadata.authorizer.StandardAuthorizerData logAuditMessage\n
INFO: Principal = User:556291496362-compute@developer.iam.gserviceaccount.com is
Denied operation = DESCRIBE from host = 172.16.0.20 on resource = Topic:LITERAL:t1
for request = Metadata with resourceRefCount = 1 based on rule DefaultDeny

次のステップ

Apache Kafka® は、Apache Software Foundation または米国その他の諸国における関連会社の商標です。