创建和实施访问权限级别

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

控制台

  1. 在 Cloud Console 中,转到 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 工具设置项目级条件绑定。

如需设置条件绑定,请按照以下流程修改项目的 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 步骤之前,请先完成下述操作:

  1. 在部署了您的应用的项目中,创建一个服务帐号
  2. 通过使用 gcloud auth activate-service-account 对新服务帐号进行身份验证。
  3. 下载新服务帐号的 JSON 凭据文件。

    1. 转到“服务帐号”页面
      转到“服务帐号”页面

    2. 点击您的服务帐号的电子邮件地址。

    3. 点击修改

    4. 点击创建密钥

    5. 选择 JSON 作为密钥类型。

    6. 点击创建并关闭出现的确认窗口,以创建新的密钥。

  4. 导出以下变量。

    export PROJECT_NUM=PROJECT_NUMBER
    export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for
    setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  5. 运行以下命令,以使用 Oauth2l 将服务帐号凭据 JSON 文件转换为 OAuth 访问令牌。

    oauth2l header --json ${JSON_CREDS} cloud-platform

  6. 如果这是您第一次运行上述命令,请在系统提示时执行以下操作:

    1. 点击显示的链接并复制代码,以获取验证码。
    2. 将验证码粘贴到您的应用提示中。
    3. 复制返回的不记名令牌。
    4. 导出分配有返回的不记名令牌的变量。
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  7. 如果您之前运行过此命令,请导出以下变量。

    export CLOUD_OAUTH_TOKEN ="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

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 "${CLOUD_OAUTH_TOKEN}" ${GAE_BASE_URL}/:getIamPolicy \
         -d ''
    

  3. 将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是经过修改的 policy.json 文件的示例,该文件会将 iap.httpsResourceAccessor 角色绑定到两个用户,并授予他们访问情境感知访问权限保护的资源的权限。只有在符合 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 "${CLOUD_OAUTH_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 "${CLOUD_OAUTH_TOKEN}" ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
         -d ''

  3. 将 IAM 条件绑定添加到 IAM 政策 JSON 文件。以下是经过修改的 policy.json 文件的示例,该文件会将 iap.httpsResourceAccessor 角色绑定到两个用户,并授予他们访问情境感知访问权限保护的资源的权限。只有在符合 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 "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}