身份感知代理(Identity-Aware Proxy,IAP)通过七层拦截请求并执行身份校验,把访问控制从网络层上移到应用层。与VPN先建立网络通道再允许内网访问不同,IAP只对经过应用负载均衡的HTTPS请求生效,因此不需要开放任何入站防火墙端口,也不用把后端实例配置公网IP。配置IAP的本质是建立一条从用户浏览器到Google身份平台再到后端服务的受控链路,最终由IAP在反向代理层决定是否放行。

在实际配置前,需要先理解IAP的决策顺序:请求先到达外部应用负载均衡,由转发规则匹配后端服务;如果该后端服务启用了IAP,七层代理会检查Cookie中的IAP会话,无有效会话则跳转OAuth授权页;用户完成登录并满足IAP的上下文条件后,代理才会把请求转发给实例组、GKE Pod或Cloud Run服务。这个顺序决定了后续所有配置都必须围绕负载均衡、OAuth客户端和IAM角色三个对象展开。
准备工作:OAuth同意屏幕与IAP客户端
IAP依赖Google OAuth2完成用户认证,所以创建同意屏幕和OAuth客户端是第一步。同意屏幕只需要填写应用名称和支持邮箱,内部应用可以把发布状态设置为测试,避免公开审核。OAuth客户端必须选择Web应用类型,因为IAP跳转回调属于浏览器场景,不能使用桌面客户端或服务账号客户端。授权重定向URI由IAP自动生成,格式为https://iap.googleapis.com/v1/oauth/clientIds/客户端ID:handleRedirect,在控制台启用IAP时系统会提示自动创建,但手工创建能更好地控制客户端名称和密钥轮换。
还需要为用户授予roles/iap.httpsResourceAccessor角色。这个角色允许用户通过HTTPS访问启用了IAP的资源,但不授予任何底层云资源权限。团队通常把这一层理解为应用访问门禁,真正进入实例后仍受操作系统账户或应用账户约束,形成双层控制。服务账号访问IAP后端时不能使用普通账号流程,需要改用服务账号的OpenID Connect令牌,令牌通过元数据服务器获取并放在请求头中。
gcloud services enable iap.googleapis.com gcloud iap oauth-brands create \ --application_title=InternalApps \ --support_email=admin@ipipp.com gcloud iap oauth-clients create projects/PROJECT_ID/brands/BRAND_ID \ --display_name=web-client
配置外部应用负载均衡并启用IAP
IAP目前只支持外部全局应用负载均衡的HTTP/HTTPS后端服务,经典代理负载均衡或内部负载均衡无法启用。因此先要检查转发规则和目标代理是否指向正确的后端服务。创建时至少需要一个健康检查、后端服务以及URL映射,后端可以指向托管实例组或无服务器NEG。全局外部应用负载均衡的URL映射必须匹配域名,建议使用自定义域名并上传TLS证书,IAP对自签名证书会话续期并不友好。
启用IAP可以在控制台后端服务页面直接开启,也可以使用gcloud命令。命令需要指定OAuth客户端ID和密钥,密钥在OAuth客户端详情中显示。执行后会生成Cookie名称和签名密钥,不要手工修改。启用IAP后,未认证请求会返回302重定向到Google登录,这会导致健康检查失败,需要将健康检查路径加入IAP的绕过规则,或者改用TCP健康检查。
gcloud compute backend-services update web-backend \ --iap=enabled \ --oauth2-client-id=YOUR_CLIENT_ID \ --oauth2-client-secret=YOUR_CLIENT_SECRET \ --global
完成上述操作后,还需要把负载均衡的前端IP或域名解析到正确位置。对于内部应用,建议使用Private Service Connect或仅允许指定VPC内的客户端访问,不要在公网DNS中暴露未备案域名。同时检查防火墙规则是否放行来自负载均衡代理的请求,因为IAP转发到后端时源地址属于负载均衡网段而不是最终用户IP。
精细化访问策略与条件配置
默认开启IAP后,任何拥有IAP安全Web应用用户角色的成员都能访问整个后端服务。生产环境通常需要按路径、IP、设备或时间进一步收敛。IAP条件使用CEL表达式,可以针对特定路径前缀放行内部工具,也可以限制只有办公网出口IP才能访问管理后台。例如要求请求路径为/admin且来源网段不在公司出口就拒绝,条件表达式为!request.path.startsWith('/admin') || request.ip_address.startsWith('203.0.113'),这样普通路径仍走常规认证,敏感路径附加IP约束。
IAP设置文件支持更细的OAuth参数,比如loginHint用来预填登录账号,cookieDomain用于跨子域共享会话。还可以配置访问拒绝页和CORS设置。将设置写入YAML文件后使用gcloud iap settings set命令下发,资源类型写compute或backend-services。修改设置会覆盖整个资源,因此建议先在临时项目验证,避免误关闭OAuth客户端绑定。
# 保存为 settings.yaml 后下发
accessSettings:
oauthSettings:
loginHint: user@ipipp.com
gcipSettings:
tenantIds: []
corsSettings: {}
applicationSettings:
cookieDomain: ipipp.com
csmSettings: {}
gcloud iap settings set settings.yaml \ --project=PROJECT_ID \ --resource-type=compute
验证配置与常见故障排查
配置完成后,应先用普通浏览器访问负载均衡IP或域名,确认会跳转Google登录并返回后端响应。然后使用无权限的测试账号访问,应看到403或IAP拒绝页。验证请求头时,IAP会向后端注入X-Goog-Authenticated-User-Email和X-Goog-Authenticated-User-Id等头,应用可以信任这些头,但必须确保后端只接受来自负载均衡的连接,否则攻击者可能直接向后端伪造请求头。
常见故障包括404而不是登录跳转,通常是URL映射没有匹配到后端服务;502错误一般是后端健康检查失败或IAP与后端服务协议不匹配;登录后一直循环重定向多数是Cookie域名配置错误或浏览器禁用了第三方Cookie。日志分析可使用Cloud Logging过滤protoPayload.serviceName=iap.googleapis.com,结合HTTP状态码和IAP决策原因定位。
gcloud logging read 'protoPayload.serviceName="iap.googleapis.com" AND severity>=ERROR' \ --limit=20 \ --format=json
如果所有验证均通过,还可以进一步接入Cloud Audit Logs审计用户访问行为,或者将IAP与VPC Service Controls联合使用,形成更完整的零信任边界。配置完成后应定期轮换OAuth客户端密钥,并检查IAM角色分配是否仍然符合最小权限原则。