创建自定义访问权限级别

您可以使用 Access Context Manager 中的 自定义访问权限级别,通过使用在 Google Cloud 通用表达式语言 (CEL) 的子集中编写的布尔表达式来控制对 资源的访问权限。您可以评估请求属性(例如来源网络项目、IP 地址、身份和来自第三方安全服务的设备数据),以强制执行精细的情境感知访问权限要求。

如需在自定义访问权限级别表达式中使用设备 属性,您必须拥有 付费订阅。如需详细了解如何构建 CEL 表达式,请参阅自定义访问权限级别 规范。创建自定义访问权限级别后,您可以像管理基本 访问权限级别一样管理它。

准备工作

创建自定义访问权限级别

您可以使用 Google Cloud 控制台、 gcloud 命令行工具、REST API 或 RPC 创建自定义访问权限级别。

控制台

如需使用 Google Cloud 控制台创建自定义访问权限级别,请执行以下 操作:

  1. 在 Google Cloud 控制台中打开 Access Context Manager 页面。

    打开 Access Context Manager 页面

  2. 如果出现提示,请选择您的组织。

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

  4. 在新建访问权限级别窗格中,执行以下操作:

    1. 在访问权限级别标题框中,输入访问权限级别的标题。标题最多不能超过 50 个字符,以字母开头,并且只能包含数字、字母、下划线和空格。

    2. 按照在以下条件中创建条件,选择高级模式。

    3. 在条件部分中,输入自定义访问权限级别的表达式。条件必须解析为单个布尔值。

      有关通用表达式语言 (CEL) 支持和自定义访问权限级别的示例和更多信息,请参阅自定义访问权限级别规范。

    4. 点击保存。

gcloud

如需使用 gcloud 命令行工具创建自定义访问权限级别,请使用 gcloud access-context-manager levels create 命令。

gcloud access-context-manager levels create LEVEL_NAME \
--title=TITLE \
--custom-level-spec=FILE \
--description=DESCRIPTION \
--policy=POLICY_NAME

替换以下内容:

  • LEVEL_NAME:访问权限级别的唯一名称。 此名称必须以字母开头,且只能包含字母、数字和下划线。此名称最多可以包含 50 个字符。

  • TITLE:访问权限级别的人类可读简短标题。

  • FILE:一个 YAML 文件,其中包含您的 CEL 表达式,格式为单个键值对: expression: "CEL_EXPRESSION"。

    有关通用表达式语言 (CEL) 支持和自定义访问权限级别的示例和更多信息,请参阅 自定义访问权限级别规范。

  • DESCRIPTION:访问权限级别的人类可读说明。

  • POLICY_NAME:您组织的访问权限政策的数字名称。

或者,您可以添加任何在 gcloud范围适用的标志。

custom-level-spec YAML 文件

使用 gcloud 命令行工具创建自定义访问权限级别时,您必须为 custom-level-spec 选项提供 YAML 文件。YAML 文件定义了一个解析为单个布尔值的 CEL 表达式。YAML 文件 必须包含一个格式为 expression: "CEL_EXPRESSION" 的键值对。expression 的值必须是字符串。

YAML 文件示例

expression: "device.encryption_status == DeviceEncryptionStatus.ENCRYPTED && (origin.region_code in ['US'] || device.is_admin_approved_device)"

示例命令

gcloud access-context-manager levels create Custom_Trust \
    --custom-level-spec=customspec.yaml \
    --description="Custom access level for corp." \
    --title="Custom Trust Level" \
    --policy=1521580097614100

REST

如需使用 REST API 创建自定义访问权限级别,请使用 accessPolicies.accessLevels.create 方法。

请求正文

在调用的请求正文中,添加 AccessLevel 对象的实例。

{
  "name": string,
  "title": string,
  "description": string,
  "custom": {
    "expr": {
      "expression": string,
      "title": string,
      "description": string
    }
  }
}

对于 custom 字段,请创建一个对象,其中包含自定义访问权限级别的 CEL 表达式。完整表达式必须解析为布尔值。title 和 description 字段为选填字段。

示例

{
  "name": "example_custom_level",
  "title": "Example custom level",
  "description": "An example custom access level.",
  "custom":  {
    "expr": {
      "expression": "device.is_corp_owned == true || (device.os_type != OsType.OS_UNSPECIFIED && device.is_admin_approved_device == true)",
      "title": "Check for known devices",
      "description": "Permits requests from corp-owned devices and admin-approved devices with a known OS."
    }
  }
}

RPC

如需使用 RPC 创建自定义访问权限级别,请调用 CreateAccessLevel。

对于 access_level 字段,请添加 AccessLevel 的实例。

字段
name
类型 字符串
说明

必需。

访问权限级别的资源名称。 POLICY_ID 是您 组织的访问权限政策的数字名称。SHORT_NAME 必须以字母开头,且 只能包含字母、数字和下划线。

格式:

            accessPolicies/policy_id/accessLevels/short_name
            
title
类型 字符串
说明

访问权限级别的人类可读标签。访问权限级别 必须具有唯一名称。

description
类型 字符串
说明

访问权限级别的说明。

custom
类型 字符串
说明

自定义访问权限级别的 CEL 表达式。完整表达式必须解析为布尔值。

自定义访问权限级别示例

本部分提供了自定义访问权限级别的示例。

根据来源项目限制访问权限

您可以限制对资源的访问权限,以仅允许源自 特定 Google Cloud 项目和相关租户项目的请求。基于项目的 访问权限限制有助于保护 Workload Identity(属于项目的非人类 身份)的互动 Google Cloud 。工作负载身份包括服务账号、Workload Identity Federation 身份、受管工作负载身份和代理身份。

如果请求来自 projects/123456789,则以下表达式会授予访问权限:

originatesFromProjects(origin, ["projects/123456789"])

限制 Workload Identity 对其自身网络项目的访问权限

您可以限制 Workload Identity,使其只能从与拥有该 Workload Identity 的 Google Cloud 项目关联的网络发出请求。该项目可以是顶级项目,也可以是顶级项目的租户项目。基于项目的访问权限限制有助于保护 Workload Identity 互动。与 originatesFromProjects 不同,您无需在表达式中指定项目编号,这让您可以在多个项目中重复使用同一访问权限级别。

如果来源网络项目(或其关联的租户项目)与拥有调用 Workload Identity 的项目匹配,则以下表达式会授予访问权限:

request.auth.matchesNetworkProject(origin)