IAM データベース認証を使用するユーザーの追加と管理

このページでは、IAM データベース認証を使用するユーザーまたはサービス アカウントをデータベースに追加する方法と、それらのユーザー アカウントとサービス アカウントを管理する方法について説明します。IAM の統合の詳細については、IAM データベース認証の概要をご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SDK をインストールして初期化します。
  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  7. Cloud SDK をインストールして初期化します。
  8. Cloud Key Management Service API を有効にします。

    API を有効にする

  9. ユーザー アカウントに Cloud SQL 管理者のロールがあることを確認します。

    IAM ページに移動

  10. Cloud SQL インスタンスで IAM データベース認証を有効にします
  11. ユーザーがアクセスする必要があるデータベースを含むプロジェクトごとに、IAM アクセス権を必要とするユーザーに権限を付与してください。詳しくは、リソースに対するアクセス権の付与、変更、取り消しの手順をご覧ください。
  12. プロジェクト内のデータベースにアクセスする必要があるサービスごとに、サービス アカウントが追加されていることを確認します。

IAM ユーザーまたはサービス アカウントをデータベースに追加する

データベース インスタンスへのアクセスを許可する IAM ユーザーごとに、新しいデータベース ユーザーを作成する必要があります。データベース ユーザー名は、IAM ユーザーのメールアドレス(test-user@gmail.com など)にする必要があります。

REST コマンドを使用する場合、ユーザー名には特殊文字(@.)が含まれるため、引用符を使用する必要があります。

サービス アカウントの形式は service-account-name@project-id.iam.gserviceaccount.com です。

IAM ユーザーまたはサービス アカウントを追加するには、新しいデータベース ユーザーを追加し、認証方法として IAM を選択します。

Console

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

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

  2. インスタンス名をクリックして [概要] ページを開きます。
  3. SQL ナビゲーション メニューから [ユーザー] を選択します。
  4. [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス instance_name に追加] タブが開きます。
  5. [Cloud IAM] ラジオボタンをクリックします。
  6. [メンバー] フィールドに追加するユーザーまたはサービス アカウントのメールアドレスを追加します。
  7. [追加] をクリックします。ユーザーがユーザーリストに表示されます。
  8. ユーザーにログイン権限を付与するには、三角形 をクリックし、[IAM ロールを追加] を選択します。これにより、Cloud SQL インスタンス ユーザーのロールがユーザーに割り当てられます。

gcloud

ユーザーの作成

メールアドレス(test-user@gmail.com など)を使用してユーザーを識別します。

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

  • USERNAME: ユーザーのメールアドレス。
  • INSTANCE_NAME: ユーザーにアクセスを許可するインスタンスの名前。
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

サービス アカウントの作成

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

  • USERNAME: サービス アカウントのメールアドレス。
  • INSTANCE_NAME: サービス アカウントによるアクセスを許可するインスタンスの名前。
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

REST v1

ユーザーの作成

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: 実際のプロジェクト ID
  • instance-id: ユーザーを追加するインスタンスのインスタンス ID
  • user-name: ユーザーのメールアドレス
  • operation-id: オペレーションの ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

JSON 本文のリクエスト:

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような 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"
}

サービス アカウントの作成

リクエストのデータを使用する前に、次のように置き換えます。

  • service-account-id: 実際のサービス アカウント ID
  • project-id: 実際のプロジェクト ID
  • instance-id: サービス アカウントを追加するインスタンスのインスタンス ID
  • operation-id: オペレーションの ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

JSON 本文のリクエスト:

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "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
  • user-name: ユーザーのメールアドレス
  • operation-id: オペレーションの ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

JSON 本文のリクエスト:

{
  "name": "user-name",
  "type": "CLOUD_IAM_USER"
  }

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような 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"
}

サービス アカウントの作成

リクエストのデータを使用する前に、次のように置き換えます。

  • service-account-id: 実際のサービス アカウント ID
  • project-id: 実際のプロジェクト ID
  • instance-id: サービス アカウントを追加するインスタンスのインスタンス ID
  • operation-id: オペレーションの ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

JSON 本文のリクエスト:

{
    "name": "service_account_id"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような 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-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "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"
}

ユーザーまたはサービス アカウントに IAM ポリシー バインディングを追加する

この手順では、プロジェクト ID とバインディングを指定して、特定のプロジェクトの IAM ポリシーにポリシー バインディングを追加します。バインディング コマンドは、メンバー、ロール、省略可能な条件から構成されます。IAM データベース認証の IAM ポリシー バインディングの概要については、組み込み認証と IAM 認証(IAM データベース認証)の違いをご覧ください。

データベース ユーザー名は、IAM ユーザーのメールアドレス(test-user@gmail.com など)にする必要があります。特殊文字(@.)が含まれているため、引用符を使用する必要があります。

ユーザーまたはサービス アカウントにポリシー バインディングを追加するには:

Console

  1. Google Cloud Console の [IAM] ページに移動します。

    IAM に移動

  2. [追加] をクリックします。
  3. [新しいメンバー] にメールアドレスを入力します。個人またはサービス アカウントをメンバーとして追加できますが、すべてのプロジェクトに少なくとも 1 人のメンバーが必要です。
  4. [ロール] で、[Cloud SQL] に移動し、[Cloud SQL インスタンス ユーザー]、[Cloud SQL クライアント] をクリックします。
  5. [保存] をクリックします。

gcloud

gcloud projects add-iam-policy-binding--role=roles/cloudsql.instanceUser フラグを指定して実行します。

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

  • PROJECT_ID: ユーザーに使用を許可するプロジェクトの ID。
  • USERNAME: ユーザーのメールアドレス。
ユーザー アカウントの場合は、次のコマンドを実行します。
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=user:USERNAME \
--role=roles/cloudsql.instanceUser
サービス アカウントの場合は、次のコマンドを実行します。
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:USERNAME --role=roles/cloudsql.instanceUser

さらに、両方のタイプのアカウントで --role=roles/cloudsql.client フラグを使用して gcloud projects add-iam-policy-binding を再度実行します。

REST

get-iam-policy コマンドで返された JSON または YAML バインディング ポリシーを編集して、cloudsql.instanceUsercloudsql.client のロールを両方のタイプのアカウントに付与します。このポリシーの変更は、更新したポリシーを設定するまで有効になりません。

    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
                   "user:user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

IAM ユーザーにデータベース権限を付与する

デフォルトでは、IAM ユーザーがデータベース インスタンスに追加されると、その新しいユーザーにはデータベースに対する権限が付与されません。

ユーザーのログイン アクセスやその他の権限を付与するには、GRANT ステートメントを使用します。ユーザーとサービス アカウントに付与できる権限の一覧については、GRANT リファレンス ページをご覧ください。mysql コマンドラインから GRANT を実行します。

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

  • USERNAME: IAM ユーザーのデータベース名。ユーザー アカウントの場合、これは IAM ユーザーのメールアドレス(@ とドメイン文字列は除く)です。たとえば、IAM ユーザーのメールアドレスが test-user@gmail.com の場合、ユーザー名は test-user になります。サービス アカウントの場合、これは @project-id.iam.gserviceaccount.com ドメインのないサービス アカウントのメールアドレスです。
  • TABLE_NAME: テーブルの名前。
    mysql=> grant select on TABLE_NAME to "USERNAME";
    
  • データベースから IAM ユーザーまたはサービス アカウントを削除する

    データベースからユーザーまたはサービス アカウントを削除するには、アカウントをインスタンスから削除します。

    Console

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

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

    2. インスタンス名をクリックして [概要] ページを開きます。
    3. SQL ナビゲーション メニューから [ユーザー] を選択します。
    4. 削除するユーザーの をクリックします。
    5. [削除] を選択します。これにより、このインスタンスへのアクセス権のみが取り消されます。

    gcloud

    ユーザーを取り消す

    メールアドレス(test-user@gmail.com など)を使用してユーザーを識別します。

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

    • USERNAME: @ [ドメイン名] が省略されたメールアドレス。
    • INSTANCE_NAME: ユーザーを削除するインスタンスの名前。
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    サービス アカウントの削除

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

    • USERNAME: サービス アカウントのメールアドレス。
    • INSTANCE_NAME: ユーザーを削除するインスタンスの名前。
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    REST v1beta4

    以下のリクエストでは、users:delete メソッドを使用して、指定したユーザー アカウントを削除します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • project-id: 実際のプロジェクト ID
    • instance-id: 目的のインスタンス ID
    • user-id: ユーザーの ID

    HTTP メソッドと URL:

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=&name=user-id

    JSON 本文のリクエスト:

    {
      "name": "user-id",
      "host": ""
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような 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:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

    監査ログのログイン情報を表示する

    監査ログを有効にして、データベースへの IAM ログインをキャプチャできます。ログインで問題が発生した場合は、監査ログを使用して問題を診断できます。

    注: 監査ロギングには追加費用が発生します。詳細については、データロギングの料金をご覧ください。

    構成が完了すると、ログビューアを使用して、成功したログインのデータアクセス監査ログを表示できます。

    たとえば、ログに次のような情報が含まれる場合があります。

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    ログインエラーのトラブルシューティング

    ログインの試行が失敗すると、MySQL はセキュリティ上の理由から、最小限のエラー メッセージを返します。次に例を示します。

    $MYSQL_PWD=`gcloud-access-token mysql` --enable-cleartext-plugin --ssl-ca=server-ca.pem
    --ssl-cert=client-cert.pem --ssl-key=client-key.pem   --host=ip_address --user=testuser
    Access denied for user 'testuser'@'...' (using password: NO)
    

    エラーの詳細については、MySQL のエラーログを確認してください。詳細については、ログの表示をご覧ください。

    たとえば、前述のエラーについて、次のログエントリで問題解決のアクションについて説明されています。

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    表示されたエラー メッセージを確認します。メッセージに「Cloud SQL IAM ユーザー認証」または「Cloud SQL IAM サービス アカウント認証」を使用したことが示されていない場合は、ログインに使用したデータベース ユーザータイプが CLOUD_IAM_USER または CLOUD_IAM_SERVICE_ACCOUNT のいずれかかどうか確認します。IAM ユーザーのデータベース ユーザー名が、@ とドメインを含まない IAM ユーザーのメールアドレスであることを確認します。サービス アカウントの場合、@project-id.iam.gserviceaccount.com のないサービス アカウントのメールアドレスであることを確認します。

    IAM データベース認証を使用した場合は、エラー メッセージの詳細を確認します。エラー メッセージはデータベースのエラーログで確認できます。パスワードとして送信したアクセス トークン(OAuth 2.0)が無効であることが示されている場合は、gcloud auth application-default print-access-token gcloud コマンドで詳細を確認できます。

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo
    

    トークンが目的の IAM ユーザーまたはサービス アカウントのものであり、有効期限が切れていないことを確認します。

    詳細情報に権限不足が示されている場合は、インスタンスのプロジェクトの IAM ポリシーで定義した Cloud SQL Instance User 事前定義ロールまたはカスタムロールを使用して、IAM ユーザーまたはサービス アカウントに cloudsql.instances.login 権限が付与されていることを確認します。サポートが必要な場合は、IAM ポリシーのトラブルシューティングをご覧ください。

    IAM データベース認証が利用できないためにログインに失敗した場合は、デフォルトの MySQL のユーザー名とパスワードを使用してログインできます。このログイン方法でもデータベース全体にアクセスできます。接続がセキュリティ保護されていることを確認します。

    次のステップ