IAP for Cloud Run を有効にする

Cloud Run サービスで Identity-Aware Proxy を有効にする方法は 2 つあります。

  1. 推奨: Cloud Run サービスで直接:
    • run.app エンドポイントを直接保護するため、ロードバランサ リソースをプロビジョニングする必要がありません。
    • 設定が簡単になり、ロードバランサの追加費用を回避できます。
    • Cloud Run の前にロードバランサを配置することを選択した場合、ロードバランサのエンドポイントも保護されます。
  2. Cloud Run サービスをフロントエンドとするバックエンド サービス: 同じロードバランサのグローバル バックエンド サービスに接続された複数のリージョンで Cloud Run を実行していて、一元的なアクセス管理が必要な場合は、このページの手順に沿って操作します。それ以外の場合は、Cloud Run サービスで IAP を直接有効にすることをおすすめします。

既知の制限事項

  • IAP は、Cloud Run サービスとロードバランサの両方で使用することはできません。ロードバランサで IAP を有効にすると、IAP はロードバランサ経由のトラフィックのみを保護します。run.app URL 経由で Cloud Run サービスに到達する可能性のあるトラフィックは保護されません。IAP で承認されたトラフィックのみを許可するには、アクセスを制限する Cloud Run の構成をご覧ください。

  • IAP は、X-Serverless-Authorization ヘッダーを使用して Cloud Run に対する認証を行います。Cloud Run は、署名を削除した後、このヘッダーをサービスに渡します。サービスが IAM 認証を必要とする別の Cloud Run サービスにリクエストを転送するように設計されている場合は、まずこのヘッダーを削除するようにサービスを更新します。

  • IAP は Cloud CDN との互換性はありません。

  • IAP を使用するとレイテンシが増加します。レイテンシの影響を受けないサービスに対してのみ IAP を有効にします。

始める前に

Cloud Run で IAP を直接有効にすることをおすすめします。

Cloud Run で直接有効にするのではなく、ロードバランサで Cloud Run リソースに対して IAP を有効にする場合は、次のものが必要です。

バックエンド サービスまたはロードバランサから IAP を有効にする

バックエンド サービスまたはロードバランサの背後にある IAP から IAP を有効にする必要がある場合は、次の手順を使用します。

コンソール

プロジェクトの OAuth 同意画面をまだ構成していない場合は、画面を構成するように指示されます。OAuth 同意画面を構成する方法については、OAuth 同意画面の設定をご覧ください。

IAP アクセス権の設定

  1. [Identity-Aware Proxy] ページに移動します。
  2. IAP で保護するプロジェクトを選択します。
  3. [アプリケーション] で、メンバーを追加するロードバランサ バックエンド サービスの横にあるチェックボックスをオンにします。
  4. 右側のパネルで [プリンシパルを追加] をクリックします。
  5. [プリンシパルを追加] ダイアログで、プロジェクトに対する IAP で保護されたウェブアプリ ユーザーのロールを持つグループ、または個人のアカウントを入力します。メンバーにすることができるアカウントの種類は以下のとおりです。

    • Google アカウント: user@gmail.com - これは、user@google.com やその他の Workspace ドメインなどの Google Workspace のアカウントでもかまいません。
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.iam.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  6. [役割] のプルダウン リストから [Cloud IAP] > [IAP で保護されたウェブアプリ ユーザー] を選択します。

  7. [保存] をクリックします。

組織外のユーザーへのアクセスを有効にする

デフォルトでは、IAP を有効にすると、Google が管理する OAuth クライアントを使用してユーザーが認証されます。その結果、組織内のユーザーのみが IAP 対応アプリケーションにアクセスできます。

組織外のユーザーまたは組織のないユーザーにアクセスを許可するには、外部アプリケーション用に IAP を有効にするの説明に従って、カスタム OAuth クライアントを使用するように OAuth クライアント構成を更新します。

IAP の有効化

  1. IAP ページの [アプリケーション] で、アクセスを制限するロードバランサのバックエンド サービスを見つけます。リソースに対して IAP を有効にするには、[IAP] トグルをクリックします。IAP を有効にするには:
    • ロードバランサのフロントエンドの構成内では、少なくとも 1 つのプロトコルは HTTPS でなければなりません。ロードバランサの設定をご覧ください。
    • compute.backendServices.update、clientauthconfig.clients.create、clientauthconfig.clients.getWithSecret 権限が必要です。上記の権限は、プロジェクト編集者などの役割によって付与されます。詳細については、IAP で保護されたリソースへのアクセスを管理するをご覧ください。
  2. 表示された [IAP の有効化] ウィンドウで [有効にする] をクリックし、IAP でリソースを保護することを確認します。IAP が有効になった後は、ロードバランサへのすべての接続でログイン認証情報が必要になります。プロジェクトで IAP で保護されたウェブアプリ ユーザーの役割を持つアカウントにのみアクセスが許可されます。
  3. IAM によるアクセス制御の手順に沿って、IAP がトラフィックを Cloud Run バックエンド サービスに送信することを承認します。

    • プリンシパル: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
    • ロール: Cloud Run 起動元

    IAP サービス アカウントは、IAP が有効になると作成されます。IAP サービス アカウントがプリンシパルのリストにない場合は、次の gcloud コマンドを実行して作成できます。

    gcloud services identity create \
        --service=iap.googleapis.com \
        --project=PROJECT_ID
    

gcloud

  1. プロジェクトでまだ作成していない場合は、次のコマンドを実行して IAP サービス エージェントを作成します。以前にサービス エージェントを作成している場合、コマンドを実行しても重複するサービス エージェントは作成されません。
    gcloud services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
  2. 次のコマンドを実行して、前の手順で作成したサービス アカウントに起動元権限を付与します。
    gcloud run services add-iam-policy-binding [SERVICE-NAME] \
    --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com'  \
    --role='roles/run.invoker'
    
  3. ロードバランサのバックエンド サービスがグローバルかリージョンかに応じて、グローバル スコープまたはリージョン スコープのコマンドを実行して IAP を有効にします。前の手順で取得した OAuth クライアント ID とシークレットを使用します。

    グローバル スコープ

    gcloud compute backend-services update BACKEND_SERVICE_NAME --global --iap=enabled
    

    リージョン スコープ

    gcloud compute backend-services update BACKEND_SERVICE_NAME --region REGION_NAME --iap=enabled
    
    次のように置き換えます。

    • BACKEND_SERVICE_NAME: バックエンド サービスの名前。
    • REGION_NAME: IAP を有効にするリージョン。

IAP を有効にすると、Google Cloud CLI で Identity and Access Management ロール roles/iap.httpsResourceAccessor を使用して IAP アクセス ポリシーを操作できます。詳細については、IAP で保護されたリソースへのアクセスを管理するをご覧ください。

Terraform

  1. まだ作成していない場合は、プロジェクトで次のコマンドを実行して IAP サービス エージェントを作成します。以前にサービス エージェントを作成している場合、コマンドを実行しても重複するサービス エージェントは作成されません。
    resource "google_project_service" "project" {
      project = "your-project-id"
      service = "iap.googleapis.com"
    }
    
  2. 次のコマンドを追加して、IAP サービス エージェントに roles/run.invoker ロールを付与します。

    resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
      project = google_cloud_run_v2_service.default.project
      location = google_cloud_run_v2_service.default.location
      name = google_cloud_run_v2_service.default.name
      role   = "roles/run.invoker"
      member = "serviceAccount:service-"PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com"
    }
    

    PROJECT_NUMBER は、使用するプロジェクト番号に置き換えます。

  3. ロードバランサに応じて、グローバル コマンドまたはリージョン コマンドを実行して IAP を有効にします。前の手順で取得した OAuth クライアント ID とシークレットを使用します。

    • グローバル スコープ

      resource "google_compute_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

    • リージョン スコープ

      resource "google_compute_region_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

アクセスを制限する Cloud Run の構成

Cloud Run サービスのデフォルトの run.app URL を介してトラフィックがルーティングされないようにするには、デフォルトの URL を無効にします。それ以外の場合は、Cloud Run のネットワーク上り(内向き)を制限するように上り(内向き)設定を構成します。

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

Cloud Run へのアクセスが拒否された

 Your client does not have permission to get URL from this server 
  • IAP は、IAP サービス アカウントの権限を使用して、Cloud Run サービスを呼び出します。Cloud Run 起動元のロールがサービス アカウント service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com に付与されていることを確認します。

  • 上記のサービス アカウントに Cloud Run 起動元ロールが付与されているのに、この問題が解決されない場合は、Cloud Run サービスを再デプロイしてください。

サービス エージェントのエラーが原因で IAM エラーが発生する

新しいプロジェクトで IAP を初めて有効にすると、次のエラーが発生することがあります。

Setting IAM permissions failed

原因は、Cloud Run サービス エージェントのエラーです。この問題を解決するには、もう一度 IAP を有効にするか、IAM ポリシーを手動で設定する必要があります。

gcloud CLI で IAP を設定できない

 The IAP service account is not provisioned 

このエラーが表示された場合は、次のコマンドを実行します。

gcloud services identity create --service=iap.googleapis.com --project=[PROJECT_ID]

IAP サービス アカウントに run.routes.invoke 権限は不要

Cloud Run は、Cloud Run プレビューで IAP を使用しているときに、Cloud Run 起動元ロールを使用する IAP からの呼び出しに対して run.routes.invoke 権限チェックを実行しませんでした。一般提供(GA)の場合は、Cloud Run がこの権限チェックを実行します。

互換性を破る変更を回避するために、お客様プロジェクトでこの動作が利用されている場合は、該当するプロジェクトがプレビュー中に許可リストに登録され、権限チェックは行われませんでした。プレビュー専用の許可リストからこのようなプロジェクトを削除するには、Cloud Run のサポートにお問い合わせください。

次のステップ

IAP for Cloud Run を構成する