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 で保護されたアプリケーションに関して次の操作を行うことができます。

  • エンドユーザーを外部 IdP(Okta など)にリダイレクトしてログインします。
  • ログイン セッションを 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 連携の手順を行います。セッション継続時間を設定する場合は、Workforce Identity 連携セッションによる IAP の管理をご覧ください。

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

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

  1. 次の手順に沿って、この構成に使用する workforce プールと同じ組織のプロジェクトに、OAuth クライアント ID とシークレットを作成します。プロジェクトは、IAP で保護されたリソースと同じプロジェクトである必要はありません。OAuth クライアント ID とシークレットを作成する手順は次のとおりです。

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

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

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

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

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

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-engineiap_webcomputeorganization、または folder にする必要があります。

      cloud-run リソースタイプの場合は、--region フラグを使用して、Cloud Run サービスがデプロイされているリージョンを指定します。

    • SERVICE: サービス名。これは、app-enginecompute の両方で省略可能です。

    このコマンドの詳細については、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 リソースタイプ。リソースタイプは appengineiap_webcomputeorganizationfoldercloud_run-$REGION (プレビュー) のいずれかです。ここで、$REGION は Cloud Run サービスがデプロイされているリージョンです。
    • SERVICE: サービス名。これは、app-enginecompute の両方で省略可能です。
  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 in 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 ファイルに、バージョン行と 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 in week days"
          }
        }
      ]
    }
    
  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 に置き換えます。

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

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

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

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

プログラムによる認証

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

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

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