このページでは、 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 は、IAP がサポートする既存のすべてのリソースとロードバランサで Workforce Identity 連携とともに使用できます。
アプリケーションで Workforce Identity 連携を使用するように IAP を構成する
Workforce Identity 連携を使用するように IAP を構成するには、次の主なタスクを行います。
- Workforce プールとプロバイダを設定します。
- OAuth クライアント ID とシークレットを作成します。
- IAP を有効にして、Workforce Identity 連携を使用するように構成します。
Workforce プールとプロバイダを設定する
Workforce プールとプロバイダを設定するには、次のいずれかのプロバイダの手順に沿って操作します。
セッション継続時間を設定する場合は、Workforce Identity 連携セッションによる IAP の管理をご覧ください。
サードパーティの IdP からのメールアドレスを Google Cloudにマッピングするには、
Workforce プール プロバイダでgoogle.emailの属性マッピングを追加する必要があります。
例: 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は後の手順で必要になるため、保存しておきます。
Workforce Identity 連携を使用するように IAP を有効にする
Workforce Identity 連携で IAP を有効にするには、次の手順を行います。
IAP を有効にする
リソースで IAP を有効にします。
Console
- コンソールで、IAP ページを開きます。 Google Cloud
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 を有効にするには、
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/REGION/backendServices/BACKEND_SERVICE_NAME?updateMask=iap.enabledという URL を使用します。
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
- コンソールで、IAP ページを開きます。 Google Cloud
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 リソースタイプ。
または
backend-servicesを指定できます。app-engine - 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.json前の手順で取得した
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"
詳細については、GetIamPolicy と SetIamPolicy をご覧ください。
(省略可)コンテキストアウェア アクセスを設定する
必要に応じて、高度な認可用のコンテキストアウェア アクセス ルールを設定できます。
アクセスレベルを設定するには、 アクセスレベルの作成と適用をご覧ください。 Workforce Identity 連携を使用している場合、デバイス情報に基づくアクセスレベルは使用できません。IP アドレス、日時に関する条件を使用して、リクエスト コンテキストに基づくアクセスレベルを使用できます。
プログラムによる認証
IAP は、Workforce Identity 連携で構成されたアプリケーションのサービス アカウント JWT 認証をサポートしています。手順については、 サービス アカウント JWT での認証をご覧ください。
workforce プールを操作する際の制限
- IAP が有効になっているアプリケーションごとに構成できる workforce プールは 1 つのみです。workforce プールに含めることができるプロバイダは 1 つのみです。
- workforce プール、OAuth クライアント ID とシークレット、IAP が有効になっているアプリケーションはすべて同じ組織に存在する必要があります。
- デバイス関連情報のアクセスレベルはサポートされていません。
- 次の IAP 設定構成のみがサポートされています。
- Workforce Identity 連携を使用したプログラムによるアクセスは、Google サービス アカウントでのみサポートされています。
トラブルシューティング
トラブルシューティングについては、トラブルシューティングとよくある質問をご覧ください。