为受 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.0 到 203.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.host 和 request.path 不同,请求值必须准确无误。例如,如果您限制对以 /internal admin 开头的路径的访问,转到 /internal%20admin 可以绕过此限制。如需了解详情,请参阅 使用主机名和路径条件 。

将访问权限级别应用于 IAP 资源时,请确保 访问权限级别位于组织级,而不是项目 或文件夹级。以下步骤展示了如何通过更新 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 命令将政策绑定到应用。none 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 角色绑定到两个用户,并向他们授予对受 Chrome Enterprise Premium 保护的资源的访问权限。已添加 IAM 条件,只有在符合 ACCESS_LEVEL_NAME 访问权限级别要求,并且资源网址路径以 / 开头时,才会向这些用户授予对资源的访问权限。每个绑定只能有一个条件。

    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. 使用 getIamPolicy 和 setIamPolicy 命令获取并设置版本的 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 角色绑定到两个用户,并向他们授予对受 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"
            }
          }
        ]
      }
    }

  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}