このドキュメントでは、Google Cloud Managed Service for Apache Kafka でアクセス制御に Google Cloud Identity and Access Management(IAM)を使用する方法について説明します。
IAM は、 Google Cloud リソースレベルでアクセスを制御します。
IAM 制御により、 Google Cloud API とツールを使用してクラスタ、トピック、ACL などの Managed Service for Apache Kafka リソースを管理できるユーザーが決まります。このようなツールの例としては、Google Cloud コンソール、gcloud CLI、クライアント ライブラリなどがあります。
これらの制御により、標準の Apache Kafka クライアントを使用するときに、Managed Service for Apache Kafka クラスタに最初に接続する権限を持つユーザーも決まります。
IAM の詳細については、IAM のドキュメントをご覧ください。
IAM の概要
IAM を使用すると、特定のGoogle Cloud リソースに対するアクセス権をきめ細かく設定し、他のリソースへの不要なアクセスを防ぐことができます。IAM を使用すると、リソースに対する必要なアクセス権のみを付与する最小権限のセキュリティ原則を導入できます。
IAM では、どのリソースに対してどのアクセス権(ロール)を誰(プリンシパル)に付与するかを制御できます。
プリンシパル
プリンシパルは、リソースへのアクセスが許可されている Google アカウント(エンドユーザー)、サービス アカウント(アプリまたは仮想マシン)、Google グループ、Google Workspace または Cloud Identity ドメインです。
詳細については、IAM の概要: プリンシパルをご覧ください。
特別なプリンシパル - Managed Kafka サービス エージェント
Google Cloud Managed Service for Apache Kafka は、サービス エージェントと呼ばれる Google Cloud マネージド サービス アカウントを使用してリソースにアクセスします。API を有効にしている場合は、サービス エージェントはすでに作成されています。このサービス エージェントは、メールアドレス(service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com)で識別されます。
Managed Service for Apache Kafka サービス エージェントは、Managed Service for Apache Kafka リソースを管理するために、プロジェクトに対する Managed Kafka サービス エージェント(roles/managedkafka.serviceAgent)ロールを必要とします。このロールは、API を有効にすると自動的に付与されます。このロールを取り消すと、Managed Service for Apache Kafka はクラスタの作成、更新、削除を行うことができなくなります。
リソース
Managed Service for Apache Kafka でアクセス権を付与できるリソースの例としては、プロジェクト、クラスタ、トピック、コンシューマー グループなどがあります。
一部の API メソッドでは、複数のリソースに対する権限が必要です。たとえば、Connect クラスタの作成タスクには、Connect クラスタ リソースの親ロケーションに対する managedkafka.connectClusters.create 権限と、クラスタ リソースに対する managedkafka.clusters.attachConnectCluster 権限が必要です。
ロール
ロールとは、一連の権限のことです。権限によって、リソースに対して許可されているオペレーションが決まります。プリンシパルにロールを付与すると、そのロールに含まれるすべての権限が付与されます。
プリンシパルに 1 つ以上のロールを付与できます。
他の Google Cloud プロダクトと同様に、Managed Service for Apache Kafka は次の 3 種類のロールをサポートしています。
基本ロール: IAM の導入前に存在していた、非常に高い権限を持つロール。基本ロールの詳細については、基本ロールをご覧ください。
事前定義ロール: 特定の Google Cloudリソースに対するきめ細かいアクセス権を付与します。事前定義ロールの詳細については、事前定義ロールをご覧ください。Managed Service for Apache Kafka の事前定義ロールについては、このセクションの後半で説明します。
カスタムロール: 最小権限の原則を適用するのに役立ちます。カスタムロールの詳細については、カスタムロールをご覧ください。
たとえば、Managed Kafka 閲覧者(roles/managedkafka.viewer)の事前定義ロールは、Managed Service for Apache Kafka リソースへの読み取り専用アクセスを提供します。このロールを持つプリンシパルは、クラスタ、トピック、コンシューマー グループを表示できますが、作成、更新、削除はできません。
ロールの割り当ての詳細については、アクセス権の付与、変更、取り消しに関するドキュメントをご覧ください。
特定のタスクに必要な権限を確認するには、Managed Service for Apache Kafka のロールと権限のリファレンス ページをご覧ください。
アクセス制御の仕組み
Google Cloud API を使用した Managed Service for Apache Kafka へのアクセス権限は IAM によって処理されます。SASL 認証を使用するオープンソースの Apache Kafka クライアントからのアクセスに対する認可は、IAM によってチェックされます。
クライアントが SASL を使用して接続すると、IAM はまずプリンシパルに
managedkafka.clusters.connect権限があるかどうかを確認します。このチェックが失敗すると、接続は拒否されます。クライアントが mTLS を使用して接続する場合、この最初の IAM 権限チェックはバイパスされ、承認は Kafka ACL によってのみ処理されます。
包括的なセキュリティを確保するには、次の構成を行う必要があります。
管理アクセス用の IAM 権限。
SASL を使用する場合の接続アクセス用の IAM 権限。
認証方法に関係なく、オープンソースの Apache Kafka クライアントからのクラスタ内データアクセスとオペレーションのための Kafka ACL。
たとえば、プリンシパルがトピックを編集できないようにするとします。これには次の 2 つの方法があります。
IAM を介して完全に管理する。プリンシパルに Managed Kafka トピック編集者(
roles/managedkafka.topicEditor)ロールと Managed Kafka クライアント(roles/managedkafka.client)ロールの両方を拒否します。この構成では、 Google CloudAPI によるトピックの編集が完全に制限され、SASL を使用した Kafka API アクセスがすべて禁止されます。この構成では、mTLS を使用する接続は禁止されません。IAM と組み合わせて Kafka ACL を使用する。プリンシパルが mTLS を使用する場合、または他のオペレーションで SASL アクセスが必要な場合は、このメソッドが必要です。Kafka ACL を使用して、次のオペレーションを制限します。
クラスタレベルで作成(トピック作成用)。
トピック レベルでの Alter、AlterConfigs、Delete(トピックの変更と削除用)。
プリンシパルが Kafka API にアクセスする必要があるかどうかと、使用する認証方法に基づいて、適切な方法を選択できます。
プロジェクト レベルでアクセス制御を設定する
プロジェクト レベルでアクセス制御を設定するには、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
リソースレベルでアクセス制御を設定する
クラスタの作成や更新など、一部の Managed Service for Apache Kafka リクエストは長時間実行オペレーションです。プリンシパルがこれらのアクションを実行できるようにするには、特定のクラスタ リソースに加えて、managedkafka.googleapis.com/Operation リソースへのアクセス権を付与します。
この構成により、プリンシパルはオペレーションを開始して進行状況をモニタリングできます。
次の例は、"test-topic" という名前のトピックに設定された IAM 条件の例です。
{'expression': 'resource.name.endsWith('test-topic') 'title': 'SampleIAMCondition'}`.
この例は、リソース名が test-topic で終わるかどうかを確認する IAM 条件を示しています。その場合、条件は true になります。この特定の条件は SampleIAMCondition というタイトルで、IAM ポリシーで使用して、この特定のトピックへのアクセスのみを制限できます。
クラスタの作成や更新など、特定の Managed Service for Apache Kafka リクエストは、長時間実行オペレーションを返します。クラスタレベルでアクセス権を付与するには、クラスタごとのリソース条件に加えて、タイプ managedkafka.googleapis.com/Operation のすべてのリソースのアクセス権を含めます。このプロセスにより、プリンシパルはオペレーションを開始して、その進行状況をモニタリングできます。
プロジェクト間のアクセス制御
別のプロジェクトのクライアントにクラスタへのアクセスを承認するには、クラスタのプロジェクトでクライアントのサービス アカウントに Managed Kafka クライアント(roles/managedkafka.client)ロールを付与します。
たとえば、project-B の Compute Engine VM が project-A のクラスタにアクセスできるようにするには、project-A で、project-B の Compute Engine VM のサービス アカウントに Managed Kafka クライアント(roles/managedkafka.client)ロールを付与します。
次のステップ
IAM の基本コンセプトについて詳しくは、IAM の概要をご覧ください。
IAM ポリシーのさまざまなコンポーネントについては、IAM ポリシーをご覧ください。
クラスタ内データ アクセスに Kafka ACL を使用する方法については、Kafka ACL をご覧ください。
Managed Service for Apache Kafka のロールと権限の完全なリストを表示するには、Managed Service for Apache Kafka のロールと権限をご覧ください。