本页面介绍如何配置 Identity-Aware Proxy (IAP) 以使用员工身份联合。
使用 IAP 配置员工身份联合时,您可以使用外部身份提供方 (IdP) 通过 Identity and Access Management (IAM) 对员工(一组用户,例如员工、合作伙伴和承包商)进行身份验证和授权,以便用户安全地访问部署在 Google Cloud 或本地的服务。
通过员工身份联合配置 IAP,您可以针对受 IAP 保护的应用执行以下操作:
- 将最终用户重定向到外部 IdP(例如 Okta)以登录。
- 配置一个介于 15 分钟到 12 小时之间的登录会话。
- 仅允许 IdP 中的特定最终用户或最终用户集访问您的应用。
- 指定最终用户可在其中访问应用的上下文。例如,仅允许在一天中的特定时间内进行访问。
您可以在 IAP 支持的所有现有资源和负载平衡器上将 IAP 与员工身份联合搭配使用。
使用员工身份联合为应用配置 IAP
使用员工身份联合配置 IAP 包括以下主要任务:
- 设置员工池和提供方。
- 创建 OAuth 客户端 ID 和密钥。
- 启用 IAP 并将其配置为使用员工身份联合。
设置员工池和提供方
如需设置员工池和提供方,请按照员工身份联合中的说明操作;在设置会话时长时,请参阅通过员工身份联合会话管理 IAP。
如果要将电子邮件地址从第三方 IdP 映射到 Google Cloud,您必须在员工池提供方中为 google.email
添加属性映射。示例:google.email=assertion.email
。
创建 OAuth 客户端 ID 和密钥
按照说明在将用于此配置的员工池所属的项目下创建 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 以使用员工身份联合
控制台
- 在 Google Cloud 控制台中,打开 IAP 页面。
转到 IAP 页面 - 选择一个项目。该项目必须与您之前创建的员工池位于同一组织中。该项目不一定是您在其中创建了 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,请使用以下网址:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/REGION/backendServices/BACKEND_SERVICE_NAME?updateMask=iap.enabled
。
更新 IAP 设置
如需将 IAP 配置为使用员工身份联合,您必须配置以下设置:
WorkforceIdentitySettings
:之前创建的 OAuth 客户端 ID 和密钥。IdentitySources
:身份源。
如需了解详情,请参阅 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 settings set。
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 保护的 Web 应用用户角色。您可以将受 IAP 保护的 Web 应用用户角色授予单个用户(主账号)或一组用户(主账号集,该主账号会映射到一个群组、特定属性或整个用户池)。
不支持不受限制地访问受 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:主账号标识符。
- PROJECT_ID:项目 ID。
- RESOURCE_TYPE:IAP 资源类型,可以是
app-engine
或backend-services
。 - SERVICE:服务名称。当
resource-type
为app-engine
时,此项为可选项。 - CONDITION:(可选)IAM Conditions。 以下是使用访问权限级别配置的条件示例:
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
文件中,移除 version 行和 etag 行,然后添加要为主账号标识符添加的绑定。如需了解详情,请参阅了解允许政策。{ "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。
(可选)设置情境感知访问权限
您还可以选择为高级授权设置情境感知访问权限规则。
如需设置访问权限级别,请参阅创建和应用访问权限级别。使用员工身份联合时,无法使用基于设备信息的访问权限级别。您仍然可以使用基于请求情境的访问权限级别,以及有关 IP 地址、时间和日期的条件。
使用员工池时的限制
- IAP 仅支持一个员工池,并且员工池只能包含一个提供方。
- 员工池、OAuth 客户端 ID 和密钥以及支持 IAP 的应用必须位于同一组织中。
- 系统不支持获取设备相关信息的访问权限级别。
- 仅支持以下 IAP 设置配置:
- 不支持通过员工身份联合进行程序化访问。