Workforce Identity 連携の認証

このページでは、Cloud SQL で Workforce Identity 連携(サードパーティ IAM 認証とも呼ばれます)を構成して使用する方法について説明します。Workforce Identity 連携を使用すると、Microsoft Active Directory や Okta などの既存の ID プロバイダ(IdP)を使用して、 Google アカウントを必要とせずに Cloud SQL インスタンスにアクセスできます。

Workforce Identity 連携を使用する主なメリットは次のとおりです。

  • オーバーヘッドの削減: ドメインの確認や、Cloud Identity への ID の同期が不要になります。
  • セキュリティの強化: 既存のエンタープライズ IdP を介してデータベース アクセスを一元管理します。
  • スケーリングの容易さ: 複雑な ID 管理ニーズを持つ大規模な組織に適しています。

Workforce Identity 連携の詳細については、Workforce Identity 連携の概要をご覧ください。

仕組み

Workforce Identity 連携を使用すると、ユーザーは外部 ID を使用して Google Cloud に対する認証を行うことができます。Cloud SQL の場合、これは、従業員プールからのプリンシパルが Cloud SQL for PostgreSQL インスタンスに接続できることを意味します。

Cloud SQL は、CLOUD_IAM_WORKFORCE_IDENTITY ユーザータイプを介して Workforce Identity 連携をサポートしています。アクセス権を付与するために、Cloud SQL はログイン時に従業員の認証情報とプロジェクト レベルの 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. [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス 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: インスタンスが含まれているプロジェクトの ID。

Workforce プール全体へのアクセス権を付与するには、principalSet メンバー形式で gcloud projects add-iam-policy-binding コマンドを使用します。

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 リソースを使用して、従業員プリンシパルにロールを付与します。

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: インスタンスが含まれているプロジェクトの ID。

REST

API を使用して IAM ポリシーを付与するには、getIamPolicy メソッドを使用してプロジェクトの IAM ポリシーを取得します。次に、新しいバインディングをポリシーに追加し、最後に 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 連携を使用して認証するには、--cred-file フラグを指定して gcloud auth login コマンドを使用します。

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

次のステップ