mcpField
C
configuring-identity-aware-proxy-with-google-iap

configuring-identity-aware-proxy-with-google-iap

github.com/mukul975セキュリティ35.2k76 回インストール8 週間前に更新
リポジトリ

configuring-identity-aware-proxy-with-google-iap について

Google Cloud Identity-Aware Proxy を設定し、ウェブアプリや TCP サービスへのアクセスを制御する実用スキルです。IAM ポリシー、コンテキストベースのアクセス、セッション、サービスアカウント、監査ログを扱います。

主な機能

  1. 01GCP サービス向け IAP の設定
  2. 02IAM アクセスバインディングの設定
  3. 03デバイスとネットワークのアクセスレベル定義
  4. 04セッションと再認証ルールの設定
  5. 05サービスアカウントアクセスの有効化
  6. 06監査ログの設定

活用シーン

  1. 01ユーザーやグループごとの内部アプリ制限
  2. 02機密サービスでの管理対象デバイスの必須化
  3. 03パブリック IP を使わない SSH または RDP アクセス
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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 ProxyWeb リクエストと TCP 接続を傍受し、ユーザーを認証してアクセス ポリシーを評価した後、バックエンドサービスにプロキシする GCP サービス
Backend ServiceIAP が保護する GCP ロードバランサーのコンポーネント。Compute Engine インスタンス、GKE ポッド、Cloud Run サービス、App Engine に対応します
IAP Tunnelパブリック IP アドレスや VPN を使わずに、SSH、RDP、その他の TCP アクセスを VM に提供する、IAP 経由のセキュアな TCP トンネル
OAuth Consent ScreenIAP 認証中にユーザーに表示するアプリケーション名とサポート用メールアドレスを指定する GCP の設定
Access LevelIAP 認可時に評価される、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 とファイアウォールルールだけで保護されており、ネットワークレベルで過剰なアクセスが可能になっています。

アプローチ:

  1. マネージド SSL 証明書を使用して、すべてのサービスを HTTPS ロードバランサーの背後に配置します
  2. 各バックエンドサービスで IAP を有効にし、サービスごとに OAuth クライアントを設定します
  3. Google グループを特定のサービスに対応付ける IAM バインディングを作成します(管理者グループ → 管理ダッシュボード、エンジニアリンググループ → 監視)
  4. アクセスレベルを定義します:managed-device(暗号化+画面ロック)、corp-network(オフィスの IP 範囲)
  5. 管理ダッシュボードと財務ツールに managed-device アクセスレベルを適用します
  6. GKE ノードへの SSH アクセス用に IAP TCP トンネリングを設定し、SSH 踏み台ホストを置き換えます
  7. 管理ツールでは再認証を 4 時間、監視では 8 時間に設定します
  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

コメント