本页面介绍如何使用 Access Context Manager 创建访问权限级别,并将其应用于 Identity-Aware Proxy (IAP) 保护的资源。
概览
访问权限级别是基于请求来源而为请求分配的一组属性。您可以使用设备类型、IP 地址和用户身份等信息,指定要授予的访问权限级别。例如,您可以为公司网络内连接分配“High_Trust”级别,为运行已批准操作系统的外部设备分配“Medium_Trust”级别。
设置端点验证后,系统会按访问权限级别收集并引用设备信息。端点验证会创建所有访问公司资源的公司和个人设备的清单。
通过在 IAP 保护的资源上将访问权限级别添加为身份和访问权限管理 (IAM) 条件,即可强制执行访问权限级别。IAP 让您可应用精细的资源级访问权限控制模型,而不是使用网络级防火墙。例如,您可以指定“Medium_Trust”可以使用许多资源,但某些更敏感的资源需要“High_Trust”级别。
如需了解详情,请参阅 Access Context Manager 概览。
准备工作
在开始之前,您需要执行以下操作:
- 使用 IAP 保护资源。
- 设置端点验证。请注意,仅当您希望根据用户设备信息(如存储加密状态)限制对资源的访问时,才需要执行此操作。
确保您在项目中授予以下一个角色。
- Access Context Manager 管理员
- Access Context Manager 编辑者
创建访问权限级别
以下过程将创建一个访问权限级别。
在本示例中,假设您要创建一个允许
内部审核人员群组来访问项目的 Google Cloud Observability。这些审核人员的所有设备分配到的 IP 属于 203.0.113.0
到 203.0.113.127
这一子网范围。您还希望确保其设备已加密。您知道,除了审核人员使用的设备之外,不会有任何设备分配给该子网。
控制台
前往 Google Cloud 控制台中的 Access Context Manager 页面。
如果收到提示,请选择您的组织。
在 Access Context Manager 页面的顶部,点击新建。
在新建访问权限级别窗格的条件部分中,点击添加属性,然后点击设备政策。
点击存储加密下拉列表,然后选择加密。请注意,仅当在您员工的设备上设置端点验证后,此规则才有效。
再次点击添加属性,然后选择 IP 子网。
在 IP 子网框中,输入一个或多个格式为 CIDR 的 IPv4 或 IPv6 范围。
在本示例中,要将访问权限仅授予审核人员,请在 IP 子网框中输入
203.0.113.0/25
。点击保存。
gcloud
为访问权限级别创建一个 .yaml 文件,其中包括一个或多个格式为 CIDR 地址块的 IPv4 或 IPv6 范围。
在本示例中,要将访问权限仅授予审核人员,您可以在 .yaml 文件中输入以下内容:
- ipSubnetworks: - 203.0.113.0/25 - devicePolicy: allowedEncryptionStatuses - ENCRYPTED
如需查看访问权限级别属性及其 YAML 格式的列表,请参阅访问权限级别属性。如需查看所有可能属性的完整 YAML 文件,请参阅此示例访问权限级别 YAML 文件。
请注意,仅在您员工的设备上设置端点验证后,
devicePolicy
规则才有效。保存文件。在本示例中,该文件命名为 CONDITIONS.yaml。
创建访问权限级别。
gcloud access-context-manager levels create NAME \ --title TITLE \ --basic-level-spec CONDITIONS.yaml \ --policy=POLICY_NAME
其中:
NAME 是访问权限级别的唯一名称,必须以字母开头,并且只包含字母、数字和下划线。
TITLE 是直观易懂的标题,必须为政策所独有。
POLICY_NAME 是您组织的访问权限政策名称。
您应看到如下输出:
Create request issued for: NAME Waiting for operation [accessPolicies/POLICY_NAME/accessLevels/NAME/create/1521594488380943] to complete...done. Created level NAME.
API
创建请求正文,以创建包含一个或多个格式化为 CIDR 地址块的 IPv4 或 IPv6 范围,以及需要加密存储的设备政策的
AccessLevel
资源。在本示例中,要将访问权限仅授予审核人员,您需要在请求正文中输入以下内容:
{ "name": "NAME", "title": "TITLE", "basic": { "conditions": [ { "ipSubnetworks": [ "203.0.113.0/25" ] }, { "devicePolicy": [ "allowedEncryptionStatuses": [ "ENCRYPTED" ] ] } ] } }
其中:
NAME 是访问权限级别的唯一名称,必须以字母开头,并且只包含字母、数字和下划线。
TITLE 是直观易懂的标题,必须为政策所独有。
通过调用
accessLevels.create
,创建访问权限级别。POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels
其中:
- POLICY_NAME 是您组织的访问权限政策名称。
应用访问权限级别
受 IAP 保护的资源具有将 IAP 角色绑定到资源的 IAM 政策。
向 IAM 政策添加 IAM 条件绑定后,您可以根据请求属性进一步限制对资源的访问。具体请求属性如下:
- 访问权限级别
- 网址主机/路径
- 日期/时间
请注意,与 IAM 条件绑定中指定的 request.host
和 request.path
不同,请求值必须准确无误。例如,如果您限制对以 /internal admin
开头的路径的访问,转到 /internal%20admin
可以绕过此限制。如需了解详情,请参阅使用主机名和路径条件。
以下步骤展示了如何通过更新 IAM 政策来向受 IAP 保护的资源添加访问权限级别。
控制台
转到 IAP 管理页面。
选中要更新 IAM 权限的资源旁的复选框。
在右侧的信息面板上,点击添加主账号。
在新建主账号框中,输入要为其分配角色的主账号。
在选择角色下拉列表中,选择 IAP-secured Web App User 角色。
要指定现有访问权限级别,请从访问权限级别下拉列表中进行选择。要查看现有访问权限级别,您需要选择 IAP-secured Web App User 角色,并且具备组织级权限。
当您向资源应用多个访问权限级别时,只要用户符合您所选择的至少一个访问权限级别中指定的条件(列表中各访问权限级别之间的逻辑关系是“或”),系统就会授予用户对该资源的访问权限。如果您希望用户满足多个访问权限级别中的条件(访问权限级别之间的逻辑关系是“与”),则需要创建包含多个访问权限级别的访问权限级别。
要为主账号添加更多角色,请点击添加其他角色。
添加完角色后,点击保存。
gcloud
目前,您只能使用 gcloud CLI 设置项目级条件绑定。
如需设置条件绑定,请按照以下流程修改项目的 policy.yaml
文件:
使用以下 gcloud 命令打开应用的 IAM 政策:
gcloud projects get-iam-policy PROJECT_ID > policy.yaml
修改
policy.yaml
文件以指定以下内容:- 要应用 IAM 条件的用户和组。
iap.httpsResourceAccessor
角色会授予他们访问资源的权限。- IAM 条件与您的访问权限级别。
如果用户和组符合 ACCESS_LEVEL_NAME 访问权限级别要求,并且资源网址路径以
/
开头,以下条件即会向其授予相应访问权限。... - members: - group:EXAMPLE_GROUP@GOOGLE.COM - user:EXAMPLE_USER@GOOGLE.COM role: roles/iap.httpsResourceAccessor condition: expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/") title: CONDITION_TITLE ...
使用
set-iam-policy
命令将政策绑定到应用。gcloud projects set-iam-policy PROJECT_ID policy.yaml
API
如需修改应用的 policy.json
文件,请根据应用类型按照以下相应流程操作。如需详细了解如何使用 IAM API 管理访问权限政策,请参阅管理对受 IAP 保护的资源的访问权限。
在完成以下应用专属 API 步骤之前,请导出以下内容 变量:
export PROJECT_NUM=PROJECT_NUMBER export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
App Engine
导出以下 App Engine 变量:
# The APP_ID is usually the project ID export GAE_APP_ID=APP_ID export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}
使用
getIamPolicy
方法获取 App Engine 应用的 IAM 政策。最后的空数据位表示将curl
请求转换为 POST,而不是 GET。curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -d '' ${GAE_BASE_URL}/:getIamPolicy
将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是一个 一个修改后的
policy.json
文件,用于绑定iap.httpsResourceAccessor
角色授予两位用户,授予他们对 Chrome Enterprise Premium 的访问权限, 安全的资源只有在符合 ACCESS_LEVEL_NAME 访问权限级别要求,并且资源网址路径以/
开头时,添加 IAM 条件才会向这些用户授予对资源的访问权限。每个绑定只能有一个条件。
policy.json 文件示例{ "policy": { "bindings": [ { "role": "roles/iap.httpsResourceAccessor", "members": [ "group:EXAMPLE_GROUP@GOOGLE.COM", "user:EXAMPLE_USER@GOOGLE.COM" ], "condition": { "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")", "title": "CONDITION_NAME" } } ] } }
使用
setIamPolicy
方法设置新的policy.json
文件。curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}
App Engine 服务和版本
您还可以更新 App Engine 服务、所有版本或特定服务版本的 IAM 政策。如需更新特定服务版本的 Cloud IAM 政策,请执行以下操作:
- 导出以下附加变量。
export GAE_SERVICE=SERVICE_NAME export GAE_VERSION=VERSION_NAME
- 更新导出的 GAE_BASE_URL 变量。
export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
- 使用上面显示的
getIamPolicy
和setIamPolicy
命令获取并设置版本的 IAM 政策。
GKE 和 Compute Engine
导出后端服务的项目 ID。
export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME
使用
getIamPolicy
方法获取 Compute Engine 应用的 IAM 政策。最后的空数据位表示将curl
请求转换为 POST,而不是 GET。curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \ -d ''
将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是一个 一个修改后的
policy.json
文件,用于绑定iap.httpsResourceAccessor
角色授予两位用户,授予他们使用 Chrome Enterprise Premium- 安全的资源只有在符合 ACCESS_LEVEL_NAME 访问权限级别要求,并且资源网址路径以/
开头时,添加 IAM 条件才会向这些用户授予对资源的访问权限。每个绑定只能有一个条件。
policy.json 文件示例{ "policy": { "bindings": [ { "role": "roles/iap.httpsResourceAccessor", "members": [ "group":EXAMPLE_GROUP@GOOGLE.COM, "user:EXAMPLE_USER@GOOGLE.COM" ], "condition": { "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")", "title": "CONDITION_NAME" } } ] } }
使用
setIamPolicy
方法设置新的policy.json
文件。curl -i -H "Content-Type:application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \ -d @${JSON_NEW_POLICY}