Workforce Identity 連携で IAP の構成

このページでは、Workforce Identity 連携を使用するように Identity-Aware Proxy(IAP)を構成する方法について説明します。

IAP で Workforce Identity 連携を構成すると、外部 ID プロバイダ(IdP)を使用して、Identity and Access Management(IAM)によりワークフォース(従業員、パートナー、請負業者などのユーザー グループ)の認証と認可を行い、ユーザーがGoogle Cloud またはオンプレミスにデプロイされたサービスに安全にアクセスできるようにします。

IAP を Workforce Identity 連携とともに構成することで、IAP で保護されたアプリケーションに関して次の操作を行うことができます。

  • エンドユーザーを Okta などの外部 IdP にリダイレクトしてログインする。
  • 15 分~ 12 時間の範囲でログイン セッションを構成します。
  • IdP の特定のエンドユーザーまたはエンドユーザー セットのみにアプリケーションへのアクセスを許可します。
  • エンドユーザーがアプリケーションにアクセスできるコンテキストを指定します。たとえば、1 日の特定の時刻にのみアクセスを許可します。
IAP で Workforce Identity 連携を使用するには、IAP がサポートする既存のリソースとロードバランサを使用します。

アプリケーションに Workforce Identity 連携で IAP を構成する

Workforce Identity 連携で IAP を構成するには、次の主なタスクを行います。

  1. Workforce プールとプロバイダを設定する。
  2. OAuth クライアント ID とシークレットを作成します。
  3. IAP を有効にして、Workforce Identity 連携を使用するように構成します。

Workforce プールとプロバイダを設定する

Workforce プールとプロバイダを設定するには、次のいずれかのプロバイダの手順に沿って操作します。

セッション継続時間を設定する場合は、Workforce Identity 連携セッションによる IAP の管理をご覧ください。

サードパーティの IdP からのメールアドレスを Google Cloudにマッピングするには、google.email の Workforce プール プロバイダで属性マッピングを追加する必要があります。例: google.email=assertion.email

OAuth クライアント ID とシークレットを作成する

重要: 次の手順で作成する OAuth クライアント ID とシークレットは、Workforce Identity 連携インフラストラクチャ用に作成されます。これらは、Google Identity で IAP を有効にするカスタム OAuth 構成を使用するときに必要となるクライアント ID やシークレットとは異なります。
  1. 次の手順に沿って、この構成に使用する workforce プールと同じ組織のプロジェクトに、OAuth クライアント ID とシークレットを作成します。プロジェクトは、IAP で保護されたリソースが存在するプロジェクトと同じである必要はありません。OAuth クライアント ID とシークレットを作成するときは、次の操作を行います。

    1. クライアント ID を作成するときに、リダイレクト URI のプレースホルダを使用します。クライアント ID を作成したら、describe OAuth クライアントの を実行して、生成された clientID を取得します。

    2. clientID を取得したら、update OAuth クライアントを実行して、allowed-redirect-uris を https://iap.googleapis.com/v1/oauth/clientIds/$CLIENT_ID:handleRedirect に更新します。

      ここで、CLIENT_ID は前の手順で取得した clientID です。

    3. クライアント シークレットを作成したら、describe OAuth クライアント認証情報を実行して、生成された clientSecret を取得します。

    clientId と clientSecret は後の手順で必要になるため、保存しておきます。

IAP を有効にして Workforce Identity 連携を使用する

Workforce Identity 連携で IAP を有効にするには、次の手順を完了します。

IAP を有効にする

リソースで IAP を有効にします。

Console

  1. Google Cloud コンソールで、[IAP] ページを開きます。
    IAP ページに移動します
  2. プロジェクトを選択します。プロジェクトは、以前に作成した workforce プールと同じ組織に存在する必要があります。このプロジェクトは、OAuth クライアント ID とシークレットを作成したプロジェクトである必要はありません。
  3. [アプリケーション] タブをクリックし、IAP を使用してアクセスを制限するアプリケーションを見つけます。
  4. [IAP] 列で、スイッチをオンに切り替えます。

gcloud

gcloud CLI を使用して IAP を有効にするには、該当するサービスの手順に沿って操作します。

API

  1. settings.json ファイルを作成します。

    cat << EOF > settings.json
    {
    "iap":
      {
        "enabled":true,
     }
    }
    EOF
    
  2. App Engine で IAP を有効にします。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d @settings.json \
    "https://appengine.googleapis.com/v1/apps/PROJECT_ID?updateMask=iap.enabled"
    

    Compute Engine で IAP を有効にするには、次の URL を使用します。https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/REGION/backendServices/BACKEND_SERVICE_NAME?updateMask=iap.enabled。

IAP 設定を更新する

Workforce Identity 連携を使用するように IAP を構成するには、次の設定を構成する必要があります。

  • WorkforceIdentitySettings: 前に作成した OAuth クライアント ID とシークレット。
  • IdentitySources: ID ソース。

詳細については、IAP API をご覧ください。

gcloud

  1. 次の例を参考にして、iap_settings.yaml ファイルを作成します。

    CLIENT_ID=clientId
    CLIENT_SECRET=clientSecret
    WORKFORCE_POOL_NAME=locations/global/workforcePools/test-pool
    cat <<EOF > iap_settings.yaml
    access_settings:
      identity_sources: ["WORKFORCE_IDENTITY_FEDERATION"]
      workforce_identity_settings:
        workforce_pools: ["$WORKFORCE_POOL_NAME"]
        oauth2:
          client_id: "$CLIENT_ID"
          client_secret: "$CLIENT_SECRET"
    EOF
    
  2. 次のコマンドを実行して、リソースの IAP 設定を更新します。

    gcloud iap settings set iap_settings.yaml --project=PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE
    

    以下を置き換えます。

    • PROJECT: プロジェクト ID。
    • RESOURCE_TYPE: IAP リソースタイプ。リソースタイプは、cloud-run (プレビュー)、app-engine、iap_web、compute、organization、folder のいずれかにする必要があります。cloud-run リソースタイプの場合は、--region フラグを使用して、Cloud Run サービスがデプロイされているリージョンを指定します。
    • SERVICE: サービス名。 これは app-engine と compute の両方で省略可能です。

    このコマンドの詳細については、gcloud IAP 設定セット をご覧ください。

API

  1. 次の例を参考にして、iap_settings.json 設定ファイルを作成します。

    CLIENT_ID=clientId
    CLIENT_SECRET=clientSecret
    WORKFORCE_POOL_NAME=locations/global/workforcePools/test-pool
    cat <<EOF > iap_settings.json
    {
       "access_settings": {
         "identity_sources": ["WORKFORCE_IDENTITY_FEDERATION"],
         "workforce_identity_settings": {
           "workforce_pools": ["$WORKFORCE_POOL_NAME"],
           "oauth2": {
             "client_id": "$CLIENT_ID",
             "client_secret": "$CLIENT_SECRET",
           }
        }
      }
    }
    EOF
    
  2. gcloud CLI を使用してリソースの名前を取得し、出力から RESOURCE_NAME をコピーします。これは、次のステップで必要になります。

    gcloud iap settings get \
        --project=PROJECT \
        --resource-type=RESOURCE_TYPE \
        --service=SERVICE
    

    以下を置き換えます。

    • PROJECT: プロジェクト ID。
    • RESOURCE_TYPE: IAP リソースタイプ。リソースタイプは、appengine、iap_web、compute、organization、folder、または cloud_run-$REGION (プレビュー)にする必要があります。ここで、$REGION は Cloud Run サービスがデプロイされているリージョンです。
    • SERVICE: サービス名。 これは app-engine と compute の両方で省略可能です。
  3. 次のコマンドの RESOURCE_NAME は、前の手順の RESOURCE_NAME に置き換えます。

    curl -X PATCH \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -d @iap_settings.json \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:iapSettings?updateMask=iapSettings.accessSettings.identitySources,iapSettings.accessSettings.workforceIdentitySettings.workforcePools,iapSettings.accessSettings.workforceIdentitySettings.oauth2.clientId,iapSettings.accessSettings.workforceIdentitySettings.oauth2.clientSecret"
    

IAP で保護されたリソースへのアクセスを付与する

IAP で保護されたリソースにアクセスするには、エンドユーザーにリソースに対する IAP で保護されたウェブアプリ ユーザーのロールが必要です。IAP で保護されたウェブアプリ ユーザーのロールは、単一のユーザー(プリンシパル)または一連のユーザー(プリンシパル セット。グループ、特定の属性、プール全体などにマップします)に付与できます。

IAP で保護されたリソースへの無制限のアクセスはサポートされていません。

Console

  1. Google Cloud コンソールで、[IAP] ページを開きます。
    IAP ページに移動します
  2. IAP で保護するリソースを選択します。
  3. [プリンシパルを追加] をクリックして、リソースに対する IAM ロールを付与するグループまたは個人のプリンシパル ID を追加します。
  4. [ロールを割り当てる] で、[IAP で保護されたウェブアプリ ユーザー] を選択します。
  5. [追加] をクリックします。

gcloud

次のコマンドを実行します。

gcloud iap web add-iam-policy-binding \
    --member=PRINCIPAL_IDENTIFIER \
    --role='roles/iap.httpsResourceAccessor' \
    --project=PROJECT_ID \
    --resource-type=RESOURCE_TYPE \
    --service=SERVICE \
    --condition=CONDITION

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

  • PRINCIPAL_IDENTIFIER: プリンシパル ID。
  • PROJECT_ID: プロジェクト ID。
  • RESOURCE_TYPE: IAP リソースタイプ。app-engine または backend-services のいずれかです。
  • SERVICE: (省略可)サービス名。
  • CONDITION: (省略可)IAM 条件。アクセスレベルで構成された条件の例を次に示します。
expression="accessPolicies/12345678/accessLevels/iap_test_access_level" in request.auth.access_levels,title=iap-test-access-level,description=only access on weekdays

API

この方法は、リソースの IAM ポリシー全体に影響するため、おすすめしません。エラーにより、リソースからポリシーが削除される可能性があります。

  1. 既存の IAM ポリシー バインディングを取得します。

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d {} \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:getIamPolicy" -o iam_policy_bindings.json
    

    RESOURCE_NAME は、前の手順で取得した RESOURCE_NAME に置き換えます。

  2. 前の手順で取得した iam_policy_bindings.json ファイルから、version 行と etag 行を削除し、プリンシパル ID に追加するバインディングを追加します。詳細については、許可ポリシーについてをご覧ください。

    {
      "bindings": [
        {
          // existing bindings
        },
        {
          "role": "roles/iap.httpsResourceAccessor",
          "members": [
          "principal://iam.googleapis.com/locations/global/workforcePools/iap-test-pool/subject/iap-test-subject"
          ],
          "condition": {
            "expression": "\"accessPolicies/12345678/accessLevels/iap_test_access_level\" in request.auth.access_levels",
            "title": "iap-test-access-level",
            "description": "only access on weekdays"
          }
        }
      ]
    }
    
  3. IAM ポリシー バインディングを更新します。

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d "{"policy":$(cat iam_policy_bindings.json)}" \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:setIamPolicy"
    

    RESOURCE_NAME は、前の手順で取得した RESOURCE_NAME に置き換えます。

詳細については、GetIamPolicy と SetIamPolicy をご覧ください。

(省略可)コンテキストアウェア アクセスを設定する

必要に応じて、高度な認可のためにコンテキストアウェア アクセスルールを設定できます。

アクセスレベルを設定するには、アクセスレベルの作成と適用をご覧ください。Workforce Identity 連携を使用する場合、デバイス情報に基づくアクセスレベルは使用できません。IP アドレス、日時、時刻の条件を指定したリクエスト コンテキスト ベースのアクセスレベルは引き続き使用できます。

プログラムによる認証

IAP は、Workforce Identity 連携で構成されたアプリケーションのサービス アカウント JWT 認証をサポートしています。手順については、サービス アカウント JWT を使用した認証をご覧ください。

workforce プールを操作する際の制限

* IAP 対応アプリケーションごとに構成できる Workforce プールは 1 つのみです。Workforce プールに含めることができるプロバイダは 1 つのみです。* Workforce プール、OAuth クライアント ID とシークレット、IAP 対応アプリケーションはすべて同じ組織に存在する必要があります。* デバイス関連情報のアクセスレベルはサポートされていません。* 次の IAP 設定構成のみがサポートされています。 * CorsSettings * CsmSettings * AccessDeniedPageSettings.accessDeniedPageUri * CookieDomain * Workforce Identity 連携を使用したプログラムによるアクセスは、Google サービス アカウントでのみサポートされています。

トラブルシューティング

トラブルシューティングについては、トラブルシューティングとよくある質問をご覧ください。