configuring-identity-aware-proxy-with-google-iap について
Google Cloud Identity-Aware Proxy を設定し、ウェブアプリや TCP サービスへのアクセスを制御する実用スキルです。IAM ポリシー、コンテキストベースのアクセス、セッション、サービスアカウント、監査ログを扱います。
主な機能
- 01GCP サービス向け IAP の設定
- 02IAM アクセスバインディングの設定
- 03デバイスとネットワークのアクセスレベル定義
- 04セッションと再認証ルールの設定
- 05サービスアカウントアクセスの有効化
- 06監査ログの設定
活用シーン
- 01ユーザーやグループごとの内部アプリ制限
- 02機密サービスでの管理対象デバイスの必須化
- 03パブリック IP を使わない SSH または RDP アクセス
- 04IAP 経由のサービス間アクセス設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill configuring-identity-aware-proxy-with-google-iapインストール後、Claude Code で/configuring-identity-aware-proxy-with-google-iapを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Google IAP で Identity-Aware Proxy を構成する
使用する場面
- Google Cloud アプリケーション(App Engine、Cloud Run、GKE、Compute Engine)を ID ベースのアクセスで保護する場合
- デバイスの状態や場所の検証が必要な、コンテキストアウェアなアクセスを実装する場合
- VPN やパブリック IP アドレスへの公開なしで、内部ツールへのセキュアなアクセスを提供する場合
- Web アプリケーションや TCP サービスに対して、リクエストごとの認証と認可が必要な場合
- サービスアカウントを使用して、IAP で保護されたリソースへのプログラムからのアクセスを構成する場合
HTTPS ロードバランサーの背後に配置できない非 HTTP アプリケーション、未認証のアクセスが必要な一般公開アプリケーション、またはアプリケーションが独自の認証を処理しており、IAP が既存の認証フローと競合する場合は、使用しないでください。
前提条件
- 課金が有効になっている Google Cloud プロジェクト
- IAP API が有効になっていること(
gcloud services enable iap.googleapis.com) - HTTPS Load Balancer、App Engine、または Cloud Run の背後にアプリケーションがデプロイされていること
- ユーザー管理用の Cloud Identity または Google Workspace
- アクセスレベル用の Access Context Manager API が有効になっていること
- プロジェクトの OAuth 同意画面が構成されていること
ワークフロー
ステップ 1:バックエンドサービスで IAP を有効にする
各種 GCP コンピューティングプラットフォームで IAP を構成します。
# Enable required APIs
gcloud services enable iap.googleapis.com
gcloud services enable accesscontextmanager.googleapis.com
# Create OAuth consent screen
gcloud iap oauth-brands create \
--application_title="Internal Applications" \
[email protected]
# Create OAuth client
gcloud iap oauth-clients create \
projects/PROJECT_ID/brands/BRAND_ID \
--display_name="IAP Web Client"
# === Enable IAP on Compute Engine Backend Service ===
gcloud compute backend-services update my-backend-service \
--iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET \
--global
# === Enable IAP on App Engine ===
gcloud iap web enable \
--resource-type=app-engine \
--oauth2-client-id=CLIENT_ID \
--oauth2-client-secret=CLIENT_SECRET
# === Enable IAP on Cloud Run ===
# First grant IAP service account the Cloud Run Invoker role
gcloud run services add-iam-policy-binding my-service \
--member="serviceAccount:[email protected]" \
--role="roles/run.invoker" \
--region=us-central1
# Enable IAP on the Cloud Run backend service
gcloud compute backend-services update my-cloud-run-backend \
--iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET \
--global
# === Enable IAP TCP Forwarding for SSH/RDP ===
# No load balancer needed - uses IAP tunnel
gcloud compute instances add-iam-policy-binding my-vm \
--member="group:[email protected]" \
--role="roles/iap.tunnelResourceAccessor" \
--zone=us-central1-a
# SSH through IAP tunnel
gcloud compute ssh my-vm --zone=us-central1-a --tunnel-through-iap
# RDP through IAP tunnel
gcloud compute start-iap-tunnel my-windows-vm 3389 \
--local-host-port=localhost:3390 \
--zone=us-central1-a
ステップ 2:アクセス制御用の IAM バインディングを構成する
必要に応じてアクセスレベルの条件を指定し、特定のユーザーやグループにアクセス権を付与します。
# Grant basic access to a group
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=my-backend-service \
--member="group:[email protected]" \
--role="roles/iap.httpsResourceAccessor"
# Grant access with access level condition
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=finance-app \
--member="group:[email protected]" \
--role="roles/iap.httpsResourceAccessor" \
--condition='expression=request.auth.access_levels.exists(x, x == "accessPolicies/POLICY_ID/accessLevels/corporate-device"),title=RequireCorporateDevice,description=Requires managed corporate device'
# Grant access only during business hours
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=admin-console \
--member="group:[email protected]" \
--role="roles/iap.httpsResourceAccessor" \
--condition='expression=request.time.getHours("America/New_York") >= 8 && request.time.getHours("America/New_York") <= 18 && request.time.getDayOfWeek("America/New_York") >= 1 && request.time.getDayOfWeek("America/New_York") <= 5,title=BusinessHoursOnly'
# Grant access to a specific URL path
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=internal-api \
--member="group:[email protected]" \
--role="roles/iap.httpsResourceAccessor" \
--condition='expression=request.path.startsWith("/api/v2/"),title=APIv2Access'
ステップ 3:Access Context Manager でアクセスレベルを作成する
デバイス属性やネットワーク条件を使って、コンテキストベースのアクセス要件を定義します。
# Create access level requiring encrypted corporate device
cat > managed-device.yaml << 'EOF'
- devicePolicy:
allowedEncryptionStatuses:
- ENCRYPTED
osConstraints:
- osType: DESKTOP_WINDOWS
minimumVersion: "10.0.19045"
- osType: DESKTOP_MAC
minimumVersion: "14.0"
- osType: DESKTOP_CHROME_OS
requireScreenlock: true
requireAdminApproval: true
allowedDeviceManagementLevels:
- ADVANCED
EOF
gcloud access-context-manager levels create managed-device \
--policy=POLICY_ID \
--title="Managed Device" \
--basic-level-spec=managed-device.yaml
# Create access level for corporate network
cat > corp-network.yaml << 'EOF'
- ipSubnetworks:
- "203.0.113.0/24"
- "198.51.100.0/24"
regions:
- US
- GB
EOF
gcloud access-context-manager levels create corp-network \
--policy=POLICY_ID \
--title="Corporate Network" \
--basic-level-spec=corp-network.yaml
# Create custom access level using CEL for complex logic
cat > high-trust.yaml << 'EOF'
expression: >
device.encryption_status == DeviceEncryptionStatus.ENCRYPTED &&
device.is_admin_approved_device == true &&
(
origin.ip in ["203.0.113.0/24"] ||
device.os_type == OsType.DESKTOP_CHROME_OS
) &&
request.auth.claims.hd == "company.com"
EOF
gcloud access-context-manager levels create high-trust \
--policy=POLICY_ID \
--title="High Trust" \
--custom-level-spec=high-trust.yaml
ステップ 4:セッション設定と再認証を構成する
アプリケーションごとに、セッション期間と再認証ポリシーを設定します。
# Configure re-authentication for a backend service
# Requires login every 4 hours for sensitive apps
gcloud iap settings set \
--project=PROJECT_ID \
--resource-type=compute \
--service=finance-app \
reauthSettings.method=LOGIN \
reauthSettings.maxAge=14400s \
reauthSettings.policyType=MINIMUM
# Configure session settings for App Engine
gcloud iap settings set \
--project=PROJECT_ID \
--resource-type=app-engine \
reauthSettings.method=SECURE_KEY \
reauthSettings.maxAge=3600s \
reauthSettings.policyType=MINIMUM
# View current IAP settings
gcloud iap settings get \
--project=PROJECT_ID \
--resource-type=compute \
--service=finance-app
ステップ 5:サービスアカウントによるプログラムからのアクセスを構成する
IAP で保護されたエンドポイントを介した、サービス間通信を有効にします。
#!/usr/bin/env python3
"""Access IAP-protected resource using service account credentials."""
import google.auth
import google.auth.transport.requests
from google.auth import impersonated_credentials
import requests as req
IAP_CLIENT_ID = "YOUR_IAP_OAUTH_CLIENT_ID.apps.googleusercontent.com"
IAP_URL = "https://my-app.company.com/api/data"
def access_iap_resource():
# Get default credentials (works with service account key or workload identity)
credentials, project = google.auth.default()
# Create IAP-authenticated request
authed_session = google.auth.transport.requests.AuthorizedSession(
credentials,
target_audience=IAP_CLIENT_ID
)
# Make request to IAP-protected resource
response = authed_session.get(IAP_URL)
print(f"Status: {response.status_code}")
print(f"Response: {response.text[:500]}")
return response
if __name__ == "__main__":
access_iap_resource()
ステップ 6:監査ログとモニタリングを設定する
すべての IAP アクセス判断を記録するように構成します。
# Enable data access audit logs for IAP
gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
# Add IAP audit config to policy.json:
# {
# "service": "iap.googleapis.com",
# "auditLogConfigs": [
# {"logType": "ADMIN_READ"},
# {"logType": "DATA_READ"},
# {"logType": "DATA_WRITE"}
# ]
# }
gcloud projects set-iam-policy PROJECT_ID policy.json
# Create log-based metric for denied access
gcloud logging metrics create iap-denied-access \
--description="Count of IAP access denials" \
--log-filter='resource.type="gce_backend_service" AND protoPayload.status.code=16'
# Create alerting policy for high denial rates
gcloud alpha monitoring policies create \
--display-name="IAP High Denial Rate" \
--condition-display-name="Denied access > 50 in 5 min" \
--condition-filter='metric.type="logging.googleapis.com/user/iap-denied-access"' \
--condition-threshold-value=50 \
--condition-threshold-duration=300s \
--notification-channels=projects/PROJECT_ID/notificationChannels/CHANNEL_ID
# Query IAP access logs
gcloud logging read '
resource.type="gce_backend_service"
protoPayload.serviceName="iap.googleapis.com"
timestamp >= "2026-02-22T00:00:00Z"
' --project=PROJECT_ID --format='table(timestamp,protoPayload.authenticationInfo.principalEmail,protoPayload.status.code,resource.labels.backend_service_name)' --limit=50
主な概念
| 用語 | 定義 |
|---|---|
| Identity-Aware Proxy | Web リクエストと TCP 接続を傍受し、ユーザーを認証してアクセス ポリシーを評価した後、バックエンドサービスにプロキシする GCP サービス |
| Backend Service | IAP が保護する GCP ロードバランサーのコンポーネント。Compute Engine インスタンス、GKE ポッド、Cloud Run サービス、App Engine に対応します |
| IAP Tunnel | パブリック IP アドレスや VPN を使わずに、SSH、RDP、その他の TCP アクセスを VM に提供する、IAP 経由のセキュアな TCP トンネル |
| OAuth Consent Screen | IAP 認証中にユーザーに表示するアプリケーション名とサポート用メールアドレスを指定する GCP の設定 |
| Access Level | IAP 認可時に評価される、Access Context Manager の名前付き条件(デバイスの状態、IP アドレス、地理的位置) |
| Re-authentication | 設定可能なセッション期間の経過後に、ユーザーに本人確認を再度求める IAP の機能 |
ツールとシステム
- Google Cloud IAP:GCP アプリケーションと TCP サービス向けの ID アウェアなリバースプロキシ
- Access Context Manager:デバイス、ネットワーク、地理的属性に基づいてアクセスレベルを定義します
- gcloud CLI:IAP、アクセスレベル、IAM バインディングを構成するコマンドラインツール
- IAP TCP Forwarding:パブリック IP アドレスを使わずに SSH/RDP で VM にアクセスするためのトンネルベースの機能
- Cloud Audit Logs:コンプライアンス対応のために、すべての IAP アクセス判断を改ざん不可能な形で記録します
- Endpoint Verification:アクセスレベルの評価に使うデバイス属性を収集する Chrome 拡張機能
よくあるシナリオ
シナリオ:IAP で 15 個の社内 GCP サービスを保護する
コンテキスト:ある EC 企業は、GKE と Cloud Run 上で 15 個の社内サービス(管理ダッシュボード、社内 API、監視ツール)を運用しています。現在、これらのサービスは VPN とファイアウォールルールだけで保護されており、ネットワークレベルで過剰なアクセスが可能になっています。
アプローチ:
- マネージド SSL 証明書を使用して、すべてのサービスを HTTPS ロードバランサーの背後に配置します
- 各バックエンドサービスで IAP を有効にし、サービスごとに OAuth クライアントを設定します
- Google グループを特定のサービスに対応付ける IAM バインディングを作成します(管理者グループ → 管理ダッシュボード、エンジニアリンググループ → 監視)
- アクセスレベルを定義します:managed-device(暗号化+画面ロック)、corp-network(オフィスの IP 範囲)
- 管理ダッシュボードと財務ツールに managed-device アクセスレベルを適用します
- GKE ノードへの SSH アクセス用に IAP TCP トンネリングを設定し、SSH 踏み台ホストを置き換えます
- 管理ツールでは再認証を 4 時間、監視では 8 時間に設定します
- Cloud Audit Logs を設定し、拒否の繰り返しに対するアラートを作成します
注意点:IAP によってリクエストごとに 10~50ms のレイテンシが加わるため、アプリケーションのパフォーマンスをテストしてください。IAP 経由の WebSocket 接続には、特定のバックエンドサービス設定が必要です。GKE 内のサービス間呼び出しでは、外部の IAP エンドポイントではなく、内部サービスメッシュを使用して IAP を回避してください。緊急アクセスには、アクセスレベル条件を設定しない別の IAM バインディングを使用してください。
出力形式
Google Cloud IAP Configuration Report
==================================================
Project: ecommerce-internal
Report Date: 2026-02-23
IAP-PROTECTED SERVICES:
Backend Services: 12
App Engine: 1
Cloud Run: 2
IAP TCP Tunnels: 4 (SSH access)
Total: 19
ACCESS CONTROL:
IAM Bindings: 34
With Access Levels: 18 (52.9%)
Access Levels: 3 (managed-device, corp-network, high-trust)
SESSION POLICIES:
Admin tools: 4h re-auth (SECURE_KEY)
Sensitive apps: 4h re-auth (LOGIN)
General tools: 8h re-auth (LOGIN)
ACCESS LOGS (last 24h):
Total requests: 23,456
Authenticated: 23,289 (99.3%)
Denied by IAM: 112
Denied by access level: 55
Unique users: 134