IAP for Cloud Run の有効化

このページでは、Identity-Aware Proxy(IAP)を使用して Cloud Run サービスを保護する方法について説明します。

既知の制限事項

  • IAP で保護された従来のアプリケーション ロードバランサの背後にある HTTP/2 が有効な Cloud Run サービスでは、リクエスト時にリダイレクトの無限ループが発生します。IAP で保護された HTTP/2 対応サービスを使用する場合は、グローバル外部アプリケーション ロードバランサを使用することをおすすめします。詳細については、ロードバランサのモードをご覧ください。

  • IAP は、デプロイされたサービスに Cloud Run が提供するドメインを保護しません。IAP のみがサービスにアクセスできるようにするには、Cloud Run サービスで IAM 認証を使用します。IAP が Cloud Run サービスにアクセスできるようにするには、IAP サービス アカウント ロール service-[PROJECT_NUMBER]@gcp-sa-iap.iam.gserviceaccount.com に Cloud Run 起動元ロールを付与します。IAP は ID トークンを生成し、そのトークンを使用して X-Serverless-Authorization ヘッダーを使用して Cloud Run に対する認証を行います。

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

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

始める前に

Cloud Run に対して IAP を有効にするには、次のものが必要です。

IAP は、Google が管理する OAuth クライアントを使用してユーザーを認証します。組織内のユーザーのみが IAP 対応アプリケーションにアクセスできます。組織外のユーザーにアクセスを許可するには、外部アプリケーション用に IAP を有効にするをご覧ください。

IAP の有効化

Console

Google Cloud コンソールを使用して IAP を有効にする場合、Google が管理する OAuth クライアントは使用できません。

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

IAP アクセス権の設定

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

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

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

IAP の有効化

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

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

gcloud

  1. まだ作成していない場合は、次のコマンドを実行してサービス アカウントを作成します。以前にサービス アカウントを作成している場合、コマンドを実行しても重複するサービス アカウントは作成されません。
    gcloud beta 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 アクセス ポリシーを操作できます。詳細については、ロールと権限の管理をご覧ください。

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

内部クライアントと外部ロードバランサからのアクセスのみを許可するように Cloud Run サービスを構成すると、公共のインターネットからのすべての直接リクエストがブロックされます。

Cloud Run の上り(内向き)の制限の手順に沿って、Cloud Run サービスの上り(内向き)設定を Internal Load Balancing と Cloud Load Balancing に構成します。

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

 The IAP service account is not provisioned 
このエラーが表示された場合は、gcloud CLI を使用して Cloud Run サービスで IAP を有効にしようとしています。 gcloud CLI による IAP の設定には、次のコマンドを使用してプロジェクトの IAP サービス アカウントをプロビジョニングする追加のステップが含まれます。 gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
 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 サービスを再デプロイしてください。

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

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

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

次のステップ

Terraform を使用して Cloud Run の IAP を設定する場合は、Terraform のコードサンプルをご覧ください。