このページでは、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 を構成するには、次の主なタスクを実行する必要があります。
- 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 を作成したら、
describe
OAuth クライアントの を実行して、生成されたclientID
を取得します。clientID
を取得したら、update
OAuth クライアントを実行して、allowed-redirect-uris
をhttps://iap.googleapis.com/v1/oauth/clientIds/$CLIENT_ID:handleRedirect
に更新します。ここで、
CLIENT_ID
は前のステップで取得したclientID
です。クライアントシークレットを作成したら、
describe
OAuth クライアントの認証情報を実行して、生成されたclientSecret
を取得します。
後のステップで必要になるため、
clientId
とclientSecret
を保存します。
IAP を有効にして Workforce Identity 連携を使用する
Console
- Google Cloud コンソールで IAP ページを開きます。
IAP ページに移動します - プロジェクトを選択します。プロジェクトは、以前に作成した workforce プールと同じ組織に存在する必要があります。プロジェクトは、OAuth クライアント ID とシークレットを作成したプロジェクトである必要はありません。
- [アプリケーション] タブをクリックし、IAP の使用へのアクセスを制限するアプリケーションを見つけます。
- [IAP] 列で、スイッチをオンに切り替えます。
gcloud
gcloud CLI を使用して IAP を有効にするには、該当するサービスの手順に沿って操作してください。
API
settings.json
ファイルを作成します。cat << EOF > settings.json { "iap": { "enabled":true, } } EOF
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
次の例を参考にして、
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 リソースタイプ。リソースタイプは
app-engine
、iap_web
、compute
、organization
、またはfolder
でなければなりません。 - 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", } } } } EOF
gcloud CLI を使用してリソースの名前を取得し、出力から
RESOURCE_NAME
をコピーします。次の手順で必要になるためです。gcloud iap settings get \ --project=PROJECT \ --resource-type=RESOURCE_TYPE \ --service=SERVICE
以下を置き換えます。
- PROJECT: プロジェクト ID。
- RESOURCE_TYPE: IAP リソースタイプ。リソースタイプは
app-engine
、iap_web
、compute
、organization
、またはfolder
でなければなりません。 - 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.json
RESOURCE_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 アドレス、時刻、日付の条件では、リクエスト コンテキスト ベースのアクセスレベルを引き続き使用できます。
workforce プールを操作する際の制限
- IAP 対応アプリケーションごとに構成できる workforce プールは 1 つだけです。workforce プールには 1 つのプロバイダのみを含めることができます。
- Workforce プール、OAuth クライアント ID とシークレット、IAP 対応アプリケーションはすべて同じ組織に存在する必要があります。
- デバイス関連情報のアクセス権限レベルはサポートされていません。
- 次の IAP 設定構成のみがサポートされています。
- Workforce Identity 連携を使用したプログラムによるアクセスはサポートされていません。