このページでは、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 を構成するには、次の主なタスクを行います。
- Workforce プールとプロバイダを設定する。
- OAuth クライアント ID とシークレットを作成します。
- IAP を有効にして、Workforce Identity 連携を使用するように構成します。
Workforce プールとプロバイダを設定する
Workforce プールとプロバイダを設定するには、Workforce Identity 連携の手順を行います。セッション継続時間を設定する場合は、Workforce Identity 連携セッションによる IAP の管理をご覧ください。
サードパーティの IdP からのメールアドレスを Google Cloudにマッピングするには、google.email の Workforce プール プロバイダで属性マッピングを追加する必要があります。例: google.email=assertion.email
OAuth クライアント ID とシークレットを作成する
次の手順に沿って、この構成に使用する workforce プールと同じ組織のプロジェクトに、OAuth クライアント ID とシークレットを作成します。プロジェクトは、IAP で保護されたリソースと同じプロジェクトである必要はありません。OAuth クライアント ID とシークレットを作成する手順は次のとおりです。
クライアント ID を作成するときに、リダイレクト URI の代わりにプレースホルダを使用します。クライアント ID を作成したら、
describeOAuth クライアントの を実行して、生成されたclientIDを取得します。clientIDを取得したら、updateOAuth クライアントを実行して、allowed-redirect-urisをhttps://iap.googleapis.com/v1/oauth/clientIds/$CLIENT_ID:handleRedirectに更新します。ここで、
CLIENT_IDは前の手順で取得したclientIDです。クライアント シークレットを作成したら、
describeOAuth クライアント認証情報を実行して、生成されたclientSecretを取得します。
clientIdとclientSecretは、後の手順で必要になるため保存しておきます。
IAP を有効にして Workforce Identity 連携を使用する
Workforce Identity 連携で IAP を有効にするには、次の操作を行います。
IAP を有効にする
リソースで IAP を有効にします。
Console
- Google Cloud コンソールで、IAP ページを開きます。
IAP ページに移動します - プロジェクトを選択します。プロジェクトは、以前に作成した workforce プールと同じ組織に存在する必要があります。プロジェクトは、OAuth クライアント ID とシークレットを作成したプロジェクトである必要はありません。
- [アプリケーション] タブをクリックし、IAP を使用してアクセスを制限するアプリケーションを見つけます。
- [IAP] 列で、スイッチをオンに切り替えます。
gcloud
gcloud CLI を使用して IAP を有効にするには、該当するサービスの手順に沿って操作します。
- IAP for Cloud Run:
- IAP for App Engine
- IAP for Compute Engine
API
settings.jsonファイルを作成します。cat << EOF > settings.json { "iap": { "enabled":true, } } EOFApp 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
次の例を参照して、
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次のコマンドを実行して、リソースの 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
次の例を参照して、
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", } } } } EOFgcloud 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の両方で省略可能です。
次のコマンドの
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
- Google Cloud コンソールで、IAP ページを開きます。
IAP ページに移動します - IAP で保護するリソースを選択します。
- [プリンシパルを追加] をクリックして、リソースに対する IAM ロールを付与するグループまたは個人のプリンシパル ID を追加します。
- [ロールを割り当てる] で、[IAP で保護されたウェブアプリ ユーザー] を選択します。
- [追加] をクリックします。
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 ポリシー全体に影響するため、おすすめしません。エラーにより、リソースからポリシーが削除される可能性があります。
既存の 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.jsonRESOURCE_NAME は、前の手順で取得した RESOURCE_NAME に置き換えます。
前の手順で取得した
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" } } ] }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 Federation で構成されたアプリケーションのサービス アカウント JWT 認証をサポートしています。手順については、サービス アカウント JWT による認証をご覧ください。
workforce プールを操作する際の制限
- IAP 対応アプリケーションごとに構成できる workforce プールは 1 つだけです。workforce プールには 1 つのプロバイダのみを含めることができます。
- Workforce プール、OAuth クライアント ID とシークレット、IAP 対応アプリケーションはすべて同じ組織に存在する必要があります。
- デバイス関連情報のアクセスレベルはサポートされていません。
- 次の IAP 設定構成のみがサポートされています。
- Workforce Identity 連携によるプログラムによるアクセスは、Google サービス アカウントでのみサポートされています。