Configures Google Cloud IAP for Compute Engine, App Engine, Cloud Run, GKE to enforce per-request authentication using access levels, context-aware policies, and service accounts. For zero-trust access without VPN.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 需要为 Google Cloud 应用程序(App Engine、Cloud Run、GKE、Compute Engine)提供基于身份的访问保护时
Configures Google Cloud IAP for per-request identity verification on Compute Engine, App Engine, Cloud Run, and GKE using access levels, policies, and service accounts.
Configures Google Cloud Identity-Aware Proxy (IAP) for Compute Engine, App Engine, Cloud Run, and GKE to enforce per-request identity verification with access levels, context-aware policies, and service accounts.
Implements Google's BeyondCorp zero-trust model using IAP, Access Context Manager, and Chrome Enterprise Premium for identity- and device-based secure app access without VPNs. Useful for replacing VPNs, configuring device trust, or context-aware remote access.
Share bugs, ideas, or general feedback.
不适用于无法置于 HTTPS 负载均衡器后方的非 HTTP 应用程序、需要未经认证访问的面向公众的应用程序,或应用程序自行处理认证且 IAP 会与现有认证流程冲突的场景。
gcloud services enable iap.googleapis.com)为不同 GCP 计算平台配置 IAP。
# 启用所需 API
gcloud services enable iap.googleapis.com
gcloud services enable accesscontextmanager.googleapis.com
# 创建 OAuth 同意屏幕
gcloud iap oauth-brands create \
--application_title="Internal Applications" \
--support_email=security@company.com
# 创建 OAuth 客户端
gcloud iap oauth-clients create \
projects/PROJECT_ID/brands/BRAND_ID \
--display_name="IAP Web Client"
# === 在 Compute Engine 后端服务上启用 IAP ===
gcloud compute backend-services update my-backend-service \
--iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET \
--global
# === 在 App Engine 上启用 IAP ===
gcloud iap web enable \
--resource-type=app-engine \
--oauth2-client-id=CLIENT_ID \
--oauth2-client-secret=CLIENT_SECRET
# === 在 Cloud Run 上启用 IAP ===
# 首先授予 IAP 服务账号 Cloud Run Invoker 角色
gcloud run services add-iam-policy-binding my-service \
--member="serviceAccount:service-PROJECT_NUM@gcp-sa-iap.iam.gserviceaccount.com" \
--role="roles/run.invoker" \
--region=us-central1
# 在 Cloud Run 后端服务上启用 IAP
gcloud compute backend-services update my-cloud-run-backend \
--iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET \
--global
# === 为 SSH/RDP 启用 IAP TCP 转发 ===
# 无需负载均衡器 - 使用 IAP 隧道
gcloud compute instances add-iam-policy-binding my-vm \
--member="group:developers@company.com" \
--role="roles/iap.tunnelResourceAccessor" \
--zone=us-central1-a
# 通过 IAP 隧道进行 SSH
gcloud compute ssh my-vm --zone=us-central1-a --tunnel-through-iap
# 通过 IAP 隧道进行 RDP
gcloud compute start-iap-tunnel my-windows-vm 3389 \
--local-host-port=localhost:3390 \
--zone=us-central1-a
向特定用户和组授权,并可选设置访问级别条件。
# 向组授予基本访问权限
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=my-backend-service \
--member="group:engineering@company.com" \
--role="roles/iap.httpsResourceAccessor"
# 使用访问级别条件授予访问权限
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=finance-app \
--member="group:finance@company.com" \
--role="roles/iap.httpsResourceAccessor" \
--condition='expression=request.auth.access_levels.exists(x, x == "accessPolicies/POLICY_ID/accessLevels/corporate-device"),title=RequireCorporateDevice,description=需要托管企业设备'
# 仅在工作时间授予访问权限
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=admin-console \
--member="group:admins@company.com" \
--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'
使用设备属性和网络条件定义基于上下文的访问要求。
# 创建需要加密企业设备的访问级别
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="托管设备" \
--basic-level-spec=managed-device.yaml
为每个应用程序设置会话持续时间和重新认证策略。
# 为后端服务配置重新认证
# 敏感应用每 4 小时需要登录
gcloud iap settings set \
--project=PROJECT_ID \
--resource-type=compute \
--service=finance-app \
reauthSettings.method=LOGIN \
reauthSettings.maxAge=14400s \
reauthSettings.policyType=MINIMUM
通过 IAP 保护的端点启用服务间通信。
#!/usr/bin/env python3
"""使用服务账号凭据访问 IAP 保护的资源。"""
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():
# 获取默认凭据(支持服务账号密钥或工作负载身份)
credentials, project = google.auth.default()
# 创建 IAP 认证请求
authed_session = google.auth.transport.requests.AuthorizedSession(
credentials,
target_audience=IAP_CLIENT_ID
)
# 向 IAP 保护的资源发出请求
response = authed_session.get(IAP_URL)
print(f"状态: {response.status_code}")
print(f"响应: {response.text[:500]}")
return response
if __name__ == "__main__":
access_iap_resource()
为所有 IAP 访问决策配置日志记录。
# 为 IAP 启用数据访问审计日志
gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
# 创建 IAP 访问拒绝的基于日志的指标
gcloud logging metrics create iap-denied-access \
--description="IAP 访问拒绝次数" \
--log-filter='resource.type="gce_backend_service" AND protoPayload.status.code=16'
# 查询 IAP 访问日志
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 | GCP 服务,拦截 Web 请求和 TCP 连接,认证用户并在代理到后端服务前评估访问策略 |
| 后端服务(Backend Service) | IAP 保护的 GCP 负载均衡器组件;可服务于 Compute Engine 实例、GKE Pod、Cloud Run 服务或 App Engine |
| IAP 隧道(IAP Tunnel) | 通过 IAP 的安全 TCP 隧道,允许在没有公开 IP 或 VPN 的情况下 SSH、RDP 访问虚拟机 |
| OAuth 同意屏幕 | GCP 配置,指定 IAP 认证期间向用户显示的应用名称和支持邮箱 |
| 访问级别(Access Level) | Access Context Manager 中 IAP 授权时评估的命名条件(设备态势、IP、地理位置) |
| 重新认证(Re-authentication) | IAP 功能,在可配置的会话持续时间后要求用户重新证明身份 |
场景背景:一家电商公司在 GKE 和 Cloud Run 上运行 15 个内部服务(管理仪表板、内部 API、监控工具)。目前这些服务仅由 VPN 和防火墙规则保护,造成过多网络级访问。
方法:
常见陷阱:IAP 每请求增加 10-50ms 延迟;测试应用性能。通过 IAP 的 WebSocket 连接需要特定后端服务配置。GKE 内部的服务间调用应通过内部服务网格绕过 IAP,而非使用外部 IAP 端点。紧急访问应使用没有访问级别条件的单独 IAM 绑定。
Google Cloud IAP 配置报告
==================================================
项目: ecommerce-internal
报告日期: 2026-02-23
IAP 保护的服务:
后端服务: 12
App Engine: 1
Cloud Run: 2
IAP TCP 隧道: 4(SSH 访问)
总计: 19
访问控制:
IAM 绑定: 34
带访问级别: 18(52.9%)
访问级别: 3(managed-device, corp-network, high-trust)
会话策略:
管理工具: 4 小时重新认证(SECURE_KEY)
敏感应用: 4 小时重新认证(LOGIN)
通用工具: 8 小时重新认证(LOGIN)
访问日志(过去 24 小时):
总请求数: 23,456
已认证: 23,289(99.3%)
IAM 拒绝: 112
访问级别拒绝: 55
唯一用户数: 134