このページでは、Cloud SQL で Workforce Identity 連携(サードパーティ IAM 認証とも呼ばれます)を構成して使用する方法について説明します。 Workforce Identity 連携を使用すると、既存の ID プロバイダ(IdP)( Microsoft Active Directory や Okta など)を使用して、Cloud SQL インスタンスにアクセスできます ( Google アカウントは不要です)。
Workforce Identity 連携を使用する主なメリットは次のとおりです。
- オーバーヘッドの削減: ドメインの確認や ID の Cloud Identity への同期が不要になります。
- セキュリティの強化: 既存のエンタープライズ IdP を介したデータベース アクセスの一元管理。
- スケーリングの容易さ: 複雑な ID 管理のニーズを持つ大規模な組織に適しています。
Workforce Identity 連携の詳細については、 Workforce Identity 連携の概要をご覧ください。
仕組み
Workforce Identity 連携を使用すると、ユーザーは外部 ID を使用して Google Cloud を認証できます。Cloud SQL の場合、Workforce プールのプリンシパルは Cloud SQL for MySQL インスタンスに接続できます。
Cloud SQL は、CLOUD_IAM_WORKFORCE_IDENTITY ユーザータイプを介して Workforce Identity 連携をサポートしています。アクセス権を付与するために、Cloud SQL はログイン時に Workforce 認証情報とプロジェクト レベルの IAM 権限を検証します。
始める前に
Workforce Identity 連携データベース認証を構成する前に、次の前提条件を満たしていることを確認してください。
- 最新の gcloud CLI をインストールします。
- 組織で Workforce Identity 連携 プールと プロバイダを構成します。 Google Cloud
- ワークロードのサービス アカウントの権限借用を設定する
- Cloud SQL インスタンスで MySQL バージョン 8.0 以降が実行されていることを確認します。
ロールと権限
Workforce Identity 連携認証を構成して使用するために必要な権限を取得するには、組織に対して次の IAM ロールを付与するよう管理者に依頼してください。
-
インスタンスの管理:
Cloud SQL 管理者 (
roles/cloudsql.admin) -
インスタンスへの接続:
Cloud SQL インスタンス ユーザー (
roles/cloudsql.instanceUser) -
Cloud SQL Auth Proxy を使用したインスタンスへの接続:
Cloud SQL クライアント (
roles/cloudsql.client) -
IAM ポリシーの管理:
プロジェクト IAM 管理者 (
roles/resourcemanager.projectIamAdmin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。
Workforce Identity 連携認証を構成する
以降のセクションでは、Workforce Identity 連携認証を使用するようにインスタンスを構成する方法について説明します。
インスタンスで IAM 認証を有効にする
IAM 認証を有効にするには、
cloudsql_iam_authentication フラグを on に設定します。
コンソール
-
Google Cloud コンソールで、Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [編集] をクリックします。
- [インスタンスのカスタマイズ] セクションを開きます。
- [接続] セクションを開きます。
- [セキュリティ] で、[Cloud SQL IAM 認証を有効にする] チェックボックスをオンにします。
- [保存] をクリックします。
gcloud
IAM 認証を有効にするには、次のコマンドを使用します。
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_iam_authentication=on
INSTANCE_NAME は、インスタンス名で置き換えます。
Terraform
google_sql_database_instanceリソースに database_flags ブロックを追加します。
resource "google_sql_database_instance" "instance" { name = "INSTANCE_NAME" database_version = "MYSQL_8_0" region = "REGION" settings { tier = "db-f1-micro" database_flags { name = "cloudsql_iam_authentication" value = "on" } } }
次のように置き換えます。
INSTANCE_NAME: インスタンスの名前。REGION: インスタンス が配置されているリージョン。
REST v1
リクエストのデータを使用する前に、 次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- LOCATION_ID: ロケーション ID
- INSTANCE_ID: 目的のインスタンス ID
- REGION: 目的のリージョン
- DATABASE_VERSION: データベース バージョンの列挙型文字列。例:
MYSQL_8_0 - PASSWORD: root ユーザーのパスワード
- MACHINE_TYPE: マシン(階層)タイプの列挙型文字列(例:
db-custom-[CPUS]-[MEMORY_MBS])
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances
リクエストの本文(JSON):
{
"name": "INSTANCE_ID",
"region": "REGION",
"databaseVersion": "DATABASE_VERSION",
"rootPassword": "PASSWORD",
"settings": {
"tier": "MACHINE_TYPE",
"backupConfiguration": {
"enabled": true
}
"databaseFlags":
[
{
"name": "cloudsql_iam_authentication",
"value": "on"
}
]
}
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-01T19:13:21.834Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
リクエストのデータを使用する前に、 次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- LOCATION_ID: ロケーション ID
- INSTANCE_ID: 目的のインスタンス ID
- REGION: 目的のリージョン
- DATABASE_VERSION: データベース バージョンの列挙型文字列。例:
MYSQL_8_0 - PASSWORD: root ユーザーのパスワード
- MACHINE_TYPE: マシン(階層)タイプの列挙型文字列(例:
db-custom-[CPUS]-[MEMORY_MBS])
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances
リクエストの本文(JSON):
{
"name": "INSTANCE_ID",
"region": "REGION",
"databaseVersion": "DATABASE_VERSION",
"rootPassword": "PASSWORD",
"settings": {
"tier": "MACHINE_TYPE",
"backupConfiguration": {
"enabled": true
}
"databaseFlags":
[
{
"name": "cloudsql_iam_authentication",
"value": "on"
}
]
}
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-01T19:13:21.834Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
Workforce Identity ユーザーをインスタンスに追加する
CLOUD_IAM_WORKFORCE_IDENTITY タイプを使用して、外部プリンシパルをインスタンスに追加します。
使用するユーザー ID が、Workforce Identity プロバイダからの
属性マッピング
で提供される値と一致していることを確認してください。通常、これはメールアドレス(cruz@example.com など)として構成されます。
コンソール
-
Google Cloud コンソールで、Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。
- [ユーザー アカウントを追加] をクリックします。[Add a user account to instance] INSTANCE_NAME ペインが開きます。
- [Workforce Identity 連携] を選択します。
- [**Workforce ユーザー**] フィールドに、追加するユーザーのユーザー ID を入力します。
- [追加] をクリックします。
gcloud
次のコマンドを実行して、ユーザーを作成します。
gcloud sql users create USER_ID \ --instance=INSTANCE_NAME \ --type=CLOUD_IAM_WORKFORCE_IDENTITY
次のように置き換えます。
USER_ID: 追加するユーザーのメールアドレス(例:cruz@example.com)。INSTANCE_NAME: インスタンスの名前。
Terraform
google_sql_user リソースを使用して、Workforce
Identity ユーザーを定義します。
resource "google_sql_user" "workforce_user" { name = "USER_ID" # e.g., "cruz@example.com" instance = "INSTANCE_NAME" type = "CLOUD_IAM_WORKFORCE_IDENTITY" }
次のように置き換えます。
USER_ID: 追加するユーザーのユーザー ID(例:cruz@example.com)。INSTANCE_NAME: インスタンスの名前。
REST v1
ユーザー アカウントを作成する
リクエストのデータを使用する前に、 次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- INSTANCE_ID: ユーザーを追加するインスタンスのインスタンス ID
- USERNAME: ユーザーのメールアドレス
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users
リクエストの本文(JSON):
{
"name": "USERNAME",
"type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "DONE",
"user": "user@example.com",
"insertTime": "2020-02-07T22:44:16.656Z",
"startTime": "2020-02-07T22:44:16.686Z",
"endTime": "2020-02-07T22:44:20.437Z",
"operationType": "CREATE_USER",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
ユーザー アカウントを作成する
リクエストのデータを使用する前に、 次のように置き換えます。
- PROJECT_ID: プロジェクト ID
- INSTANCE_ID: ユーザーを追加するインスタンスのインスタンス ID
- USERNAME: ユーザーのメールアドレス
HTTP メソッドと URL:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users
リクエストの本文(JSON):
{
"name": "USERNAME",
"type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "DONE",
"user": "user@example.com",
"insertTime": "2020-02-07T22:44:16.656Z",
"startTime": "2020-02-07T22:44:16.686Z",
"endTime": "2020-02-07T22:44:20.437Z",
"operationType": "CREATE_USER",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
インスタンス ユーザー ロールを付与する
Workforce Identity プリンシパルまたはプール全体に
roles/cloudsql.instanceUser
ロールを付与します。
コンソール
-
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
- [アクセス権を付与] をクリックします。
[新しいプリンシパル] フィールドで、次のいずれかを行います。
個々のプリンシパルにアクセス権を付与するには、Workforce Identity を
principalとして入力します。principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_IDプール全体にアクセス権を付与するには、Workforce プールを
principalSetとして入力します。principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*
- [ロール] リストで、[Cloud SQL] > [Cloud SQL インスタンス ユーザー] を選択します。
- 省略可: Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、[別のロールを追加] をクリックし、 [Cloud SQL] > [Cloud SQL クライアント] を選択します。
- [保存] をクリックします。
gcloud
個々のユーザーにアクセス権を付与するには、gcloud projects
add-iam-policy-binding コマンドを使用します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" \ --role="roles/cloudsql.instanceUser"
次のように置き換えます。
USER_ID: 追加するユーザーのユーザー ID(例:cruz@example.com)。POOL_ID: Workforce プールの ID。PROJECT_ID: インスタンスが含まれているプロジェクトの識別子。
Workforce プール全体にアクセス権を付与するには、gcloud projects
add-iam-policy-binding コマンドを principalSet
メンバー形式で使用します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*" \ --role="roles/cloudsql.instanceUser"
Terraform
google_project_iam_member リソースを使用して、Workforce プリンシパルにロールを付与します。
resource "google_project_iam_member" "workforce_user_iam" { project = "PROJECT_ID" role = "roles/cloudsql.instanceUser" member = "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" }
次のように置き換えます。
USER_ID: 追加するユーザーのユーザー ID(例:cruz@example.com)。POOL_ID: Workforce プールの ID。PROJECT_ID: インスタンスが含まれているプロジェクトの識別子。
REST
API を使用して IAM ポリシーを付与するには、プロジェクトの
IAM ポリシーを getIamPolicy メソッドを使用して取得します。
次に、新しいバインディングをポリシーに追加し、最後に更新された
ポリシーを setIamPolicy メソッドを使用して適用します。
IAM ポリシーに追加するバインディング ペイロードの例を次に示します。
{ "bindings": [ { "role": "roles/cloudsql.instanceUser", "members": [ "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" ] } ] }
次のように置き換えます。
USER_ID: 追加するユーザーのユーザー ID(例:cruz@example.com)。POOL_ID: Workforce プールの ID。
データベース権限を付与する
Workforce Identity ユーザーの作成時に付与するデータベース ロールを指定するか、データベース内でデータベース権限を手動で付与できます。
たとえば、権限を手動で付与するには、次のようにします。
GRANT SELECT ON TABLE_NAME TO "USER_ID";
次のように置き換えます。
TABLE_NAME: データベース テーブルの名前。USER_IDWorkforce Identity データベース ユーザーのユーザー ID(例:cruz@example.com)。
インスタンスに接続する
gcloud CLI または Cloud SQL Auth Proxy を使用してインスタンスに接続できるようになりました。
gcloud CLI を使用する
ログイン トークンを生成するには、まず Workforce Identity で認証する必要があります。
Workforce Identity 連携を使用して認証するには、
gcloud auth loginコマンドを--cred-fileフラグとともに使用します。gcloud auth login --cred-file=CONFIGURATION_FILECONFIGURATION_FILEは、Workforce Identity プロバイダ用に生成された構成ファイルのパスに置き換えます。生成されたトークンを使用して接続するには、次のコマンドを実行します。
bash export MYSQL_PWD=$(gcloud sql generate-login-token) mysql --host=INSTANCE_IP --user=USER_ID \ --database=DB_NAME --ssl-mode=REQUIRED次のように置き換えます。
INSTANCE_IP: Cloud SQL インスタンスの IP アドレス。USER_ID: Workforce ユーザーのユーザー ID(例:cruz@example.com)。DB_NAME: 接続先のデータベースの名前。
Cloud SQL Auth Proxy を使用する
--auto-iam-authn フラグを指定してプロキシを起動します。
./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn
プロキシの詳細については、Cloud SQL Auth Proxy についてをご覧ください。
制限事項
- プール間で重複するユーザー ID: Cloud SQL は、異なる Workforce プールまたは ID プロバイダで同じユーザー ID を持つサブジェクトを区別できません。複数の Workforce プールまたはプロバイダを使用する場合は、IAM ポリシーを使用して、異なるプールまたはプロバイダの重複するサブジェクト名に
roles/cloudsql.instanceUserログイン権限を付与しないようにする必要があります。これにより、同じユーザー ID を持つ別のプールまたはプロバイダからの不正アクセスを防ぐことができます。 - ログイン割り当て: 各 インスタンスには、1 分あたり 12,000 回のログイン割り当てがあります。これには、成功したログイン試行と失敗したログイン試行の両方が含まれます。 割り当てを超過すると、一時的にログインできなくなります。頻繁なログインを避け、承認済み ネットワークを使用してログインを制限することをおすすめします。
次のステップ
- Workforce Identity 連携の詳細を確認する 。
- IAM データベース認証用にインスタンスを構成する方法を確認する。
- IAM データベース認証でユーザーを管理する方法を確認する。
- IAM データベース 認証を使用してログインする方法を確認する。