このドキュメントでは、Managed Service for Apache Kafka でのアクセス制御の仕組みについて説明します。
マネージド Kafka サービス エージェント
Managed Service for Apache Kafka は、サービス エージェントを使用して Google Cloudリソースにアクセスします。Managed Kafka API を有効にすると、Managed Kafka Service Agent が作成されます。
マネージド Kafka サービス エージェントは、識別子 service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com を持つプリンシパルです。ここで、PROJECT_NUMBER は Google Cloud プロジェクト番号です。
このサービス エージェントには、プロジェクトに対するマネージド Kafka サービス エージェント(roles/managedkafka.serviceAgent)の IAM ロールが必要です。このロールは、API を有効にすると自動的に付与されます。このロールを取り消すと、Managed Service for Apache Kafka はクラスタの作成、更新、削除を行うことができません。
一部のタスクでは、マネージド Kafka サービス エージェントに追加のロールが必要です。たとえば、Kafka Connect を使用する場合は、Pub/Sub や BigQuery などのソースとシンクにアクセスする権限をサービス エージェントに付与する必要がある場合があります。
クライアントのアクセス制御
通常、Managed Service for Apache Kafka リソースに対してオペレーションを実行するには、次の 2 つの方法があります。
Managed Kafka API。このオプションには、REST API を直接呼び出すだけでなく、Google Cloud CLI、 Google Cloud コンソール、クライアント ライブラリを使用することも含まれます。
オープンソースの Apache Kafka API。多くのオープンソースの Kafka クライアントがこの API を使用しています。
Managed Kafka API を使用したアクセス制御
Managed Kafka API を使用する場合、認可は Identity and Access Management(IAM)によって行われます。リソースに対してオペレーションを実行するには、プリンシパルにそのオペレーションに必要な Managed Kafka API 権限が必要です。各タスクのドキュメントには、そのタスクに必要な IAM ロールが記載されています。たとえば、プリンシパルに Kafka トピックの作成を許可するには、プリンシパルに Managed Kafka トピック編集者ロールを付与します。
Apache Kafka API を使用したアクセス制御
Apache Kafka API を使用するクライアントは、SASL または相互 TLS(mTLS)認証を使用して認証します。
クライアントが SASL で接続する場合、認証を行うプリンシパルには
managedkafka.clusters.connectIAM 権限が必要です。この権限を付与するには、プリンシパルに Managed Kafka クライアント(roles/managedkafka.client)ロールを付与します。クライアントが mTLS で接続する場合、
managedkafka.clusters.connect権限は必要ありません。代わりに、クライアントはクライアント証明書を使用して認証します。
クライアントが接続すると、サービスは Kafka ACL を使用して、リソースの読み取りや変更などのクライアント オペレーションを承認します。
複合アクセス制御
包括的なセキュリティを確保するには、次の構成を行う必要があります。
管理アクセス用の IAM 権限。
クライアントが SASL を使用する場合、クラスタに接続するための IAM 権限。
認証方法に関係なく、オープンソースの Apache Kafka クライアントからのクラスタ内データ アクセスとオペレーションに対する Kafka ACL。
たとえば、プリンシパルがトピックを編集できないようにするとします。これを行うには、次のアクセス制御を設定します。
プリンシパルに
managedkafka.topics.update権限を付与しないことで、プリンシパルが Managed Kafka API を使用してトピックを更新できないようにします( Google Cloud コンソールを使用するなど)。必要に応じて、プリンシパルに
managedkafka.clusters.connect権限を付与しないようにして、プリンシパルが SASL 認証でクラスタに接続できないようにします。プリンシパルが他の理由で SASL アクセスを必要とする場合、またはプリンシパルが mTLS を使用して接続する場合は、トピックに対する
ALTER、ALTER_CONFIGS、DELETEオペレーションを拒否する Kafka ACL を作成します。具体的な例については、すべてのトピックの変更を拒否するをご覧ください。
リソースレベルのアクセス制御
プリンシパルの IAM 権限を、プロジェクト内の特定の Managed Service for Apache Kafka リソース(個々のクラスタやトピックなど)に制限するには、IAM 条件を使用します。
次の例は、リソースタイプが managedkafka.googleapis.com/Topic で、リソース名が "test-topic" で終わる場合にのみアクセスを許可する IAM 条件を示しています。
{
"expression": "resource.name.endsWith(\"topic-1\") &&\nresource.type == \"managedkafka.googleapis.com/Topic\"",
"title": "topic-1",
"description": "Grant access only to topic-1"
}
クラスタの作成や更新など、一部の Managed Service for Apache Kafka リクエストは、長時間実行オペレーションを返します。クラスタレベルでアクセス権を付与する場合は、クラスタごとのリソース条件に加えて、タイプ managedkafka.googleapis.com/Operation のすべてのリソースに対するアクセス権を含めます。この権限により、プリンシパルはオペレーションを開始して、その進行状況をモニタリングできます。
次のステップ
IAM の基本コンセプトについて詳しくは、IAM の概要をご覧ください。
IAM ポリシーのさまざまなコンポーネントについては、IAM ポリシーをご覧ください。
クラスタ内データ アクセスに Kafka ACL を使用する方法については、Kafka ACL をご覧ください。