为受 IAP 保护的资源创建并应用访问权限级别

本页面介绍如何使用 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.0203.0.113.127 这一子网范围。您还希望确保其设备已加密。您知道,除了审核人员使用的设备之外,不会有任何设备分配给该子网。

控制台

  1. 转到 Google Cloud 控制台中的“Access Context Manager”页面。

    转到 Access Context Manager 页面

  2. 如果收到提示,请选择您的组织。

  3. Access Context Manager 页面的顶部,点击新建

  4. 新建访问权限级别窗格的条件部分中,点击添加属性,然后点击设备政策

  5. 点击存储加密下拉列表,然后选择加密。请注意,仅当在您员工的设备上设置端点验证后,此规则才有效。

  6. 再次点击添加属性,然后选择 IP 子网

  7. IP 子网框中,输入一个或多个格式为 CIDR 的 IPv4 或 IPv6 范围。

    在本示例中,要将访问权限仅授予审核人员,请在 IP 子网框中输入 203.0.113.0/25

  8. 点击保存

gcloud

  1. 为访问权限级别创建一个 .yaml 文件,其中包括一个或多个格式为 CIDR 地址块的 IPv4 或 IPv6 范围。

    在本示例中,要将访问权限仅授予审核人员,您可以在 .yaml 文件中输入以下内容:

    - ipSubnetworks:
        - 203.0.113.0/25
    - devicePolicy:
        allowedEncryptionStatuses
          - ENCRYPTED
    

    如需查看访问权限级别属性及其 YAML 格式的列表,请参阅访问权限级别属性。如需查看所有可能属性的完整 YAML 文件,请参阅此示例访问权限级别 YAML 文件

    请注意,仅在您员工的设备上设置端点验证后,devicePolicy 规则才有效。

  2. 保存文件。在本示例中,该文件命名为 CONDITIONS.yaml

  3. 创建访问权限级别。

    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

  1. 创建请求正文,以创建包含一个或多个格式化为 CIDR 地址块的 IPv4 或 IPv6 范围,以及需要加密存储的设备政策的 AccessLevel 资源。

    在本示例中,要将访问权限仅授予审核人员,您需要在请求正文中输入以下内容:

    {
     "name": "NAME",
     "title": "TITLE",
     "basic": {
       "conditions": [
         {
           "ipSubnetworks": [
             "203.0.113.0/25"
           ]
         },
         {
         "devicePolicy": [
           "allowedEncryptionStatuses": [
             "ENCRYPTED"
           ]
         ]
         }
       ]
     }
    }
    

    其中:

    • NAME 是访问权限级别的唯一名称,必须以字母开头,并且只包含字母、数字和下划线。

    • TITLE 是直观易懂的标题,必须为政策所独有。

  2. 通过调用 accessLevels.create,创建访问权限级别。

    POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels
    

    其中:

    • POLICY_NAME 是您组织的访问权限政策名称。

应用访问权限级别

受 IAP 保护的资源具有将 IAP 角色绑定到资源的 IAM 政策。

向 IAM 政策添加 IAM 条件绑定后,您可以根据请求属性进一步限制对资源的访问。具体请求属性如下:

  • 访问权限级别
  • 网址主机/路径
  • 日期/时间

请注意,与 IAM 条件绑定中指定的 request.hostrequest.path 不同,请求值必须准确无误。例如,如果您限制对以 /internal admin 开头的路径的访问,转到 /internal%20admin 可以绕过此限制。如需了解详情,请参阅使用主机名和路径条件

以下步骤展示了如何通过更新 IAM 政策来向受 IAP 保护的资源添加访问权限级别。

控制台

  1. 转到 IAP 管理页面

    转到 IAP 管理页面

  2. 选中要更新 IAM 权限的资源旁的复选框。

  3. 在右侧的信息面板上,点击添加主账号

  4. 新建主账号框中,输入要为其分配角色的主账号。

  5. 选择角色下拉列表中,选择 IAP-secured Web App User 角色。

  6. 要指定现有访问权限级别,请从访问权限级别下拉列表中进行选择。要查看现有访问权限级别,您需要选择 IAP-secured Web App User 角色,并且具备组织级权限。

    如果您对某项资源应用了多个访问权限级别,只要用户符合您选择的至少一个访问权限级别中指定的条件(列表中各访问权限级别之间的逻辑关系是“或”),就会获得该资源的访问权限。如果您希望用户满足多个访问权限级别中的条件(访问权限级别的逻辑“与”关系),请创建包含多个访问权限级别的访问权限级别。

  7. 要为主账号添加更多角色,请点击添加其他角色

  8. 添加完角色后,点击保存

gcloud

目前,您只能使用 gcloud CLI 设置项目级条件绑定。

如需设置条件绑定,请按照以下流程修改项目的 policy.yaml 文件:

  1. 使用以下 gcloud 命令打开应用的 IAM 政策:

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml
    
  2. 修改 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
    ...
    
  3. 使用 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

  1. 导出以下 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}

  2. 使用 getIamPolicy 方法获取 App Engine 应用的 IAM 政策。最后的空数据位表示将 curl 请求转换为 POST,而不是 GET。

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d '' ${GAE_BASE_URL}/:getIamPolicy
    

  3. 将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是经过修改的 policy.json 文件的示例,该文件会将 iap.httpsResourceAccessor 角色绑定到两个用户,并向他们授予对受 BeyondCorp Enterprise 保护的资源的访问权限。只有在符合 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"
              }
            }
        ]
      }
    }
    

  4. 使用 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 政策,请执行以下操作:

  1. 导出以下附加变量。
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
    
  2. 更新导出的 GAE_BASE_URL 变量。
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. 使用上面显示的 getIamPolicysetIamPolicy 命令获取并设置版本的 IAM 政策。

GKE 和 Compute Engine

  1. 导出后端服务的项目 ID。

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. 使用 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 ''
    

  3. 将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是经过修改的 policy.json 文件的示例,该文件会将 iap.httpsResourceAccessor 角色绑定到两个用户,并向他们授予对受 BeyondCorp Enterprise 保护的资源的访问权限。只有在符合 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"
            }
          }
        ]
      }
    }
    

  4. 使用 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}