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

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

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

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

    API を有効にする

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

    IAM ページに移動

IAM データベース認証を使用するユーザーまたはサービス アカウントの作成

ユーザーがアクセスする必要があるデータベースを含む各インスタンスにユーザーを追加します。追加されると、ユーザーはプロジェクト内のすべてのインスタンスとデータベースにアクセスできます。

IAM データベース認証を使用するデータベース ユーザーまたはサービス アカウントを作成するには:

Console

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

    [Cloud SQL インスタンス] ページに移動

  2. インスタンスをクリックして [概要] ページを開きます。
  3. ナビゲーション メニューから [ユーザー] を選択します。
  4. [ユーザー アカウントを追加] をクリックします。
  5. IAM ボタンを選択したままにして、[メンバー] にメールアドレスを追加します。ユーザー アカウントには、Cloud SQL インスタンス ユーザーのロールが割り当てられている必要があります。詳しくは、ユーザーまたはサービス アカウントへのログイン アクセス権の付与をご覧ください。
  6. [追加] をクリックします。

gcloud

ユーザーの作成

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

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

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

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

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

  • EMAIL: サービス アカウントのメールアドレス。データベースのユーザー名の長さに上限があるため、メールアドレスの .gserviceaccount.com サフィックスは省略する必要があります。たとえば、サービス アカウント sa-name@project-id.iam.gserviceaccount.com のユーザー名は sa-name@project-id.iam とする必要があります。
  • INSTANCE_NAME: サービス アカウントによるアクセスを許可するインスタンスの名前。
gcloud beta sql users create EMAIL --instance=INSTANCE_NAME
    --type=cloud_iam_service_account …

REST v1beta4

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

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

POST https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/backupRuns

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

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

ユーザーまたはサービス アカウントへのログイン アクセス権の付与

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

サービス アカウントのメールアドレスは、???@???.???.gserviceaccount.com の形式にする必要があります。

ユーザーまたはサービス アカウントにログイン アクセス権を付与するには:

Console

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

    IAM ページに移動

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

gcloud

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

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

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

Cloud SQL ユーザーへのデータベース権限の付与

ユーザーまたはサービス アカウントがデータベースに接続するか、データベースに対してクエリを実行する前に、そのデータベースに対する権限が付与されている必要があります。付与できる権限には、SELECT、INSERT、UPDATE、DELETE、CREATE、CONNECT などがあります。ユーザーとサービス アカウントに付与できる権限の一覧については、GRANT リファレンス ページをご覧ください。postgres コマンドラインから GRANT を実行します。次に例を示します。

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

  • EMAIL: ユーザーのメールアドレス。メールアドレスには特殊文字(@.)が含まれているため、引用符で囲む必要があります。
  • SCHEMA_NAME: テーブルのスキーマ名。
postgres=> grant all on all tables in schema SCHEMA_NAME to "EMAIL";

監査ログのログイン情報の表示

監査ログを有効にして、データベースへの 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: "..."
}

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

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

PGPASSWORD=not-a-password psql --host=... --username=... --dbname=...
psql: error: could not connect to server: FATAL:  Cloud SQL IAM user authentication failed for user "..."
FATAL:  pg_hba.conf rejects connection for host "...", user "...", database "...", SSL off

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

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

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 のいずれかかどうか確認します。確認するには、Console または gcloud beta sql users list コマンドを使用します。IAM ユーザーのデータベース ユーザー名が 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 データベース認証が利用できないためにログインに失敗した場合は、デフォルトの PostgreSQL のユーザー名とパスワードを使用してログインできます。このログイン方法でもデータベース全体にアクセスできます。

次のステップ