Workforce Identity 連携の認証

このページでは、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 PostgreSQL インスタンスに接続できます。

Cloud SQL は、CLOUD_IAM_WORKFORCE_IDENTITY ユーザータイプを介して Workforce Identity 連携をサポートしています。アクセス権を付与するために、Cloud SQL はログイン時に Workforce 認証情報とプロジェクト レベルの IAM 権限を検証します。

始める前に

Workforce Identity 連携データベース認証を構成する前に、次の前提条件を満たしていることを確認してください。

ロールと権限

Workforce Identity 連携認証を構成して使用するために必要な権限を取得するには、組織に対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。

Workforce Identity 連携認証を構成する

以降のセクションでは、Workforce Identity 連携認証を使用するようにインスタンスを構成する方法について説明します。

インスタンスで IAM 認証を有効にする

IAM 認証を有効にするには、 cloudsql.iam_authentication フラグを on に設定します。

コンソール

  1. Google Cloud コンソールで、Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. [編集] をクリックします。
  4. [インスタンスのカスタマイズ] セクションを開きます。
  5. [接続] セクションを開きます。
  6. [セキュリティ] で、[Cloud SQL IAM 認証を有効にする] チェックボックスをオンにします。
  7. [保存] をクリックします。

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 = "POSTGRES_15"
  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: データベース バージョンの列挙型文字列。例: POSTGRES_12
  • 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: データベース バージョンの列挙型文字列。例: POSTGRES_12
  • 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 など)として構成されます。

コンソール

  1. Google Cloud コンソールで、Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [ユーザー] を選択します。
  4. [ユーザー アカウントを追加] をクリックします。[Add a user account to instance] INSTANCE_NAME ペインが開きます。
  5. [Workforce Identity 連携] を選択します。
  6. [**Workforce ユーザー**] フィールドに、追加するユーザーのユーザー ID を入力します。
  7. [追加] をクリックします。

gcloud

次のコマンドを実行して、ユーザーを作成します。

gcloud sql users create USER_ID \
    --instance=INSTANCE_NAME \
    --type=CLOUD_IAM_WORKFORCE_IDENTITY
  

次のように置き換えます。

  • USER_ID: 追加するユーザーのユーザー 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 ロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [IAM] に移動

  2. [アクセス権を付与] をクリックします。
  3. [新しいプリンシパル] フィールドで、次のいずれかを行います。

    • 個々のプリンシパルにアクセス権を付与するには、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/*

  4. [ロール] リストで、[Cloud SQL] > [Cloud SQL インスタンス ユーザー] を選択します。
  5. 省略可: Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、[別のロールを追加] をクリックし、 [Cloud SQL] > [Cloud SQL クライアント] を選択します。
  6. [保存] をクリックします。

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_ID : Workforce Identity データベース ユーザーのユーザー ID(例: cruz@example.com)。

インスタンスに接続する

gcloud CLI または Cloud SQL Auth Proxy を使用してインスタンスに接続できるようになりました。

gcloud CLI を使用する

ログイン トークンを生成するには、まず Workforce Identity で認証する必要があります。

  1. Workforce Identity 連携を使用して認証するには、 gcloud auth login コマンドを --cred-file フラグとともに使用します。

    gcloud auth login --cred-file=CONFIGURATION_FILE
    

    CONFIGURATION_FILE は、Workforce Identity プロバイダ用に生成された構成ファイルのパスに置き換えます。

  2. 生成されたトークンを使用して接続するには、次のコマンドを実行します。

    bash export PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"

    次のように置き換えます。

  3. INSTANCE_IP: Cloud SQL インスタンスの IP アドレス。

  4. USER_ID: Workforce ユーザーのユーザー ID(例: cruz@example.com)。

  5. 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 回のログイン割り当てがあります。これには、成功したログイン試行と失敗したログイン試行の両方が含まれます。 割り当てを超過すると、一時的にログインできなくなります。頻繁なログインを避け、承認済み ネットワークを使用してログインを制限することをおすすめします。

次のステップ