【Google Cloud】VPC Service Controls 的试运行模式

ops/2024/12/15 22:28:58/

本文介绍了 VPC 服务控制的试运行模式。

什么是 VPC Service Controls

VPC Service ControlsGoogle Cloud(以前称为 GCP)的一项安全功能。它通过设置一个被称为 边界 的逻辑围栏,防止从内部到外部和从外部到内部的双向意外访问,从而增强对 Google 云各种服务 API 的安全保护。

详情说明如下另请参见

  • VPC Service Controls 解说

试运行模式

试运行模式(试运行配置) 是指在 Google Cloud 上对资源和服务进行评估时,虚拟地应用设定的边界以检查其影响的一种模式。

如果不经过评估就直接应用这些边界,可能会因为潜在的问题而引发意外的访问拒绝等问题。

因此,在使用 VPC Service Controls 功能时,通过试运行模式对边界设置进行适当的评估,然后再将其应用于实际环境,是一种更为稳妥的做法。

  • 参考:服务边界的试运行模式

试运行模式的工作原理

设置为试运行模式的边界是虚拟应用的,因此实际访问并不会被阻止。

然而,在 Cloud Logging 中会记录这些日志。因此,管理员可以通过查看记录的日志来识别并解决潜在的问题,从而将边界设置调整到正确的状态。

  • 参考:试运行模式的优势

试运行模式

概要

构成

在此部分中,我们将通过一个案例来解释如何通过干运行模式(dry run mode)对边界设置进行评估。

假设存在一个用于存储验证项目日志的 BigQuery 数据集,在这种情况下,我们将评估边界设置是否允许来自特定 IP 地址的访问。

设定项目

上述配置使用以下服务

#服务设置目的
1VPC 服务控制边界(Perimeter)周边根据访问条件保护 BigQuery API
2访问上下文管理器访问级别(访问条件)定义上下文(此处为访问源的 IP 地址)

Access Context Manager 访问上下文管理器

访问上下文管理器是 BeyondCorp Enterprise 零信任安全组件之一。它可以定义背景信息(上下文),如设备信息、账户信息和连接状态,这些信息可以与 VPC 服务控件关联。

  • 参考:访问上下文管理器概述
  • 参考:访问级别

设置

权限

要进行以下设置操作,需要按照官方文档为 principal 分配IAM角色。

  • 参考:通过IAM进行访问控制

访问级别

通过访问级别设置,使用Access Context Manager根据特定的IP地址来控制对边界内的BigQuery的访问。

访问级别设置示例

配置方法可参考如下所述的官方文档:

  • 参考:创建基本访问权限级别

边界(试运行模式)

接下来,我们将从 VPC Service Controls 中以干运行模式设置边界。

请按照以下图片所示,在选择试运行模式标签的情况下,点击新建边界

在这里插入图片描述

边界(试运行模式)配置示例

配置方法参考如下所述的官方文档:

  • 参考:创建服务边界

实例解说

评估过程

在完成试运行模式下的边界设置后,我们将按照以下流程对设置进行评估:

  1. 检查是否存在错误日志;
  2. 查看日志中的 metadata.violationReason 字段,以确定错误的原因并进一步核实详细信息;
  3. 再次确认日志、边界设置和访问级别,以定位可疑部分并进行修正。

实例1

日志检查

首先,我们将通过日志确认是否存在错误。

访问 BigQuery 后,我们将在 Cloud Logging 的日志浏览器中执行以下查询,以检查错误日志。

如果如图所示记录了错误日志,则我们将进一步确定其原因。

  • 参考:确定被阻止的请求

错误原因的确认

以下是实际的错误日志。(项目ID等值已做部分处理)

从第46行的 metadata.violationReason(错误原因)可以看出,其记录的内容为 NO_MATCHING_ACCESS_LEVEL

{"protoPayload": {"@type": "type.googleapis.com/google.cloud.audit.AuditLog","status": {"code": 7,"message": "(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: 9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg","details": [{"@type": "type.googleapis.com/google.rpc.PreconditionFailure","violations": [{"type": "VPC_SERVICE_CONTROLS","description": "9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg"}]}]},"authenticationInfo": {"principalEmail": "yu...i@g-...p"},"requestMetadata": {"callerIp": "2.3.4.5","requestAttributes": {},"destinationAttributes": {}},"serviceName": "bigquery.googleapis.com","methodName": "bigquery.datasets.get","resourceName": "projects/111111111111","metadata": {"securityPolicyInfo": {"organizationId": "333333333333","servicePerimeterName": "accessPolicies/596827900003/servicePerimeters/test"},"@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata","vpcServiceControlsUniqueId": "9eFMI2pfYddKGBxQtFGub4I66MZpMSBV0li3aN0EkyYmGOiL6T0-Sg","ingressViolations": [{"targetResource": "projects/111111111111","servicePerimeter": "accessPolicies/596827900003/servicePerimeters/test","targetResourcePermissions": ["bigquery.datasets.get"]}],"violationReason": "NO_MATCHING_ACCESS_LEVEL","dryRun": true,"intermediateServices": ["bigquery.googleapis.com"],"deviceState": "Unknown","resourceNames": ["projects/111111111111/datasets/logdestination"]}},"insertId": "4fwkn7d1pqp","resource": {"type": "audited_resource","labels": {"project_id": "yutakei-test-prj","method": "bigquery.datasets.get","service": "bigquery.googleapis.com"}},"timestamp": "2024-01-30T13:05:14.094591814Z","severity": "ERROR","logName": "projects/yutakei-test-prj/logs/cloudaudit.googleapis.com%2Fpolicy","receiveTimestamp": "2024-01-30T13:05:14.915645252Z"
}

详细确认

根据以下官方指南,NO_MATCHING_ACCESS_LEVEL 是这样描述的。

如果 IP 地址、设备要求或用户身份与分配给边界的任何入站流量规则或访问权限级别都不匹配,就会出现此问题。

例如,与审核记录的 callerIp 字段对应的 IP 地址与服务边界的访问权限级别中定义的任何 CIDR 范围都不匹配。

  • 参考:调试被 VPC Service Controls 阻止的请求

理解与应对

再次查看日志后发现,第23行的 callerIp(呼叫源IP地址)为 2.3.4.5

因此,可以认为这个错误是由“访问级别中定义的IP地址与呼叫源IP地址不匹配”导致的(即访问级别的设置有误)。所以,我们将对相应的设置进行修正以解决此问题。

实例2

日志检查

我们将再次检查是否有错误。这次记录的错误与之前的不同。

错误原因的确认

以下是实际的错误日志内容(项目ID等值已做部分处理):

虽然metadata.violationReason仍为NO_MATCHING_ACCESS_LEVEL(访问级别不匹配),但其他字段中显示出不同的特征。

{"protoPayload": {"@type": "type.googleapis.com/google.cloud.audit.AuditLog","status": {"code": 7,"message": "(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ","details": [{"@type": "type.googleapis.com/google.rpc.PreconditionFailure","violations": [{"type": "VPC_SERVICE_CONTROLS","description": "RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ"}]}]},"authenticationInfo": {"principalEmail": "service-222222222222@gcp-sa-logging.iam.gserviceaccount.com"},"requestMetadata": {"callerIp": "private","requestAttributes": {},"destinationAttributes": {}},"serviceName": "bigquery.googleapis.com","methodName": "google.cloud.bigquery.v2.TableDataService.InsertAll","resourceName": "projects/111111111111","metadata": {"@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata","ingressViolations": [{"servicePerimeter": "accessPolicies/596827900003/servicePerimeters/test","targetResource": "projects/111111111111"}],"dryRun": true,"resourceNames": ["test-prj","projects/222222222222"],"securityPolicyInfo": {"servicePerimeterName": "accessPolicies/596827900003/servicePerimeters/test","organizationId": "333333333333"},"vpcServiceControlsUniqueId": "RmvvqAujYKJhXMxPzN-bkSzBmHGRHuIXUXvLuvR8Gbh_ZZYCtEFOlQ","violationReason": "NO_MATCHING_ACCESS_LEVEL","deviceState": "Unknown"}},"insertId": "3vwwvwd2hpq","resource": {"type": "audited_resource","labels": {"service": "bigquery.googleapis.com","method": "google.cloud.bigquery.v2.TableDataService.InsertAll","project_id": "yutakei-test-prj"}},"timestamp": "2024-02-20T13:09:17.367737498Z","severity": "ERROR","logName": "projects/test-prj/logs/cloudaudit.googleapis.com%2Fpolicy","receiveTimestamp": "2024-02-20T13:09:18.644856847Z"
}

详细确认 之一

检查第20行的 principalEmail(调用方账户的邮箱),我们发现这是一个 服务账号,而不是一个普通的 Google 账号。

服务账号的邮件地址格式为 “项目ID前缀+@+服务名称后缀”

由此可以推测出, projects/2222222222222 中的某个日志同步功能,正在访问 projects/111111111111 的 BigQuery API”

  • 参考:写入ID(日志同步的服务账号)

详细确认 之二

VPC 服务控制中包含有故障排查工具。

通过在第47行的 vpcServiceControlsUniqueId(每个违规行为所附带的唯一标识符)中记录的ID,输入到VPC服务控制的故障排查工具中,可以实现对错误原因的可视化分析。

  • 参考:访问VPC服务控制中的故障排查工具

也可通过故障排除工具进行分析。

根据其他项目的设置,可以推测这些项目已经配置了日志sink,正在向本项目的BigQuery API导出日志数据。

理解和应对

根据以往的结果,在评估过程中发现最初的构架是不充分的,因此我们将根据实际情况调整边界设定。

通过添加上行(内向)策略的规则并保存设置,可以实现这一点。

这样,在入站方向上,其他项目的服务账户就能够访问本项目边界内的 BigQuery API。

  • 参考:上行(内向)规则参考文档
#属性项目设定值
1来源ID其他项目的日志同步服务账号
2来源所有源
3目标项目本项目
4目标服务BigQuery API (所有方法)

服务改进后,所有的错误日志都消除了

结语

VPC 服务控制在增强安全性的同时,也可能在不知不觉中引入潜在的缺陷,从而影响服务。

在应用之前,建议使用干运行模式来评估设置,并提前确认其对实际服务的影响。

希望本文能为 VPC 服务控制的正确使用提供一些帮助。


http://www.ppmy.cn/ops/142224.html

相关文章

文本编辑器与正则表达式

1. VIM 编辑器 1.1 VIM 基本概念 VIM 是一个高度可定制的文本编辑器,广泛用于程序员的日常开发中。与传统的文本编辑器不同,VIM 基于模式操作,具有以下几个主要特点: 普通模式:用于浏览和修改文本。插入模式&#x…

ogg基本架构原理

OGG的基本概念 1.OGG简介 Oracle GoldenGate软件是一种基于日志的结构化数据复制软件。GoldenGate 能够实现大量交易数据的实时捕捉、变换和投递,实现源数据库与目标数据库的数据同步,保持亚秒级的数据延迟。可简称为OGG。文档路径:https:/…

单元测试,集成测试,系统测试的区别是什么?

实际的测试工作当中,我们会从不同的角度对软件测试的活动进行分类,题主说的“单元测试,集成测试,系统测试”,是按照开发阶段进行测试活动的划分。这种划分完整的分类,其实是分为四种 “单元测试&#xff0c…

代码随想录第43天

300.最长递增子序列 # Dynamic programming. class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if not nums: return 0dp [1] * len(nums)for i in range(len(nums)):for j in range(i):if nums[j] < nums[i]: # 如果要求非严格递增&#xff0c;将此行 …

基于PLC的工业搬运机器人设计

摘要 随着科技的不断发展&#xff0c;自动化技术的智能化越来越能体现出在工业生产当中的重要性&#xff0c;提高了我们的生产效率。自动化控制的设备可以代替人工进行全天候不间断工作&#xff0c;很大程度上解放了劳动力降低了人工成本。机器人一直以来都是科技发展前沿自动…

【5】数据分析基础(series2)

前面&#xff0c;我们了解了Series这种数据结构&#xff0c;学习了如何创建一个Series。 接下来&#xff0c;我们学习访问Series的数据的两种方式&#xff1a; 1. 位置索引访问 2. 索引标签访问 访问Series的数据 1. 位置索引访问 这种访问方式和列表相同&#xff0c;是基于…

jvm结构介绍

Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换为机器码 1. 类加载子系统&#xff08;Class Loading Subsystem&#xff09;&#xff1a; • 负责将Java类加载到JVM中。这包括从文件系统、网络或其他来源读取.class文件&#x…

六、nginx负载均衡

负载均衡&#xff1a;将四层或者七层的请求分配到多台后端的服务器上。 从而分担整个业务的负载。提高系统的稳定性&#xff0c;也可以提高高可用&#xff08;备灾&#xff0c;其中一台后端服务器如果发生故障不影响整体业务&#xff09;. 负载均衡的算法 round robin 轮询 r…