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 連携の手順を行います。セッション継続時間を設定する場合は、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 連携を使用する

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 設定を更新する

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

  • 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 リソースタイプ。リソースタイプは app-engineiap_webcomputeorganization、または folder でなければなりません。
    • 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 リソースタイプ。リソースタイプは app-engineiap_webcomputeorganization、または folder でなければなりません。
    • 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 アドレス、時刻、日付の条件では、リクエスト コンテキスト ベースのアクセスレベルを引き続き使用できます。

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

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