您可以使用 Access Context Manager 中的 自定义访问权限级别,通过使用在 Google Cloud 通用表达式语言 (CEL) 的子集中编写的布尔表达式来控制对 资源的访问权限。您可以评估请求属性(例如来源网络项目、IP 地址、身份和来自第三方安全服务的设备数据),以强制执行精细的情境感知访问权限要求。
如需在自定义访问权限级别表达式中使用设备 属性,您必须拥有 付费订阅。如需详细了解如何构建 CEL 表达式,请参阅自定义访问权限级别 规范。创建自定义访问权限级别后,您可以像管理基本 访问权限级别一样管理它。
准备工作
创建自定义访问权限级别
您可以使用 Google Cloud 控制台、
gcloud 命令行工具、REST API 或 RPC 创建自定义访问权限级别。
控制台
如需使用 Google Cloud 控制台创建自定义访问权限级别,请执行以下 操作:
在 Google Cloud 控制台中打开 Access Context Manager 页面。
如果出现提示,请选择您的组织。
在 Access Context Manager 页面的顶部,点击新建。
在新建访问权限级别窗格中,执行以下操作:
在访问权限级别标题框中,输入访问权限级别的标题。标题最多不能超过 50 个字符,以字母开头,并且只能包含数字、字母、下划线和空格。
按照在以下条件中创建条件,选择高级模式。
在条件部分中,输入自定义访问权限级别的表达式。条件必须解析为单个布尔值。
有关通用表达式语言 (CEL) 支持和自定义访问权限级别的示例和更多信息,请参阅自定义访问权限级别规范。
点击保存。
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
|
|
||||
title
|
|
||||
description
|
|
||||
custom
|
|
||||
自定义访问权限级别示例
本部分提供了自定义访问权限级别的示例。
根据来源项目限制访问权限
您可以限制对资源的访问权限,以仅允许源自 特定 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)