收集 Google Cloud VPC 流日志
解析器版本:6.0
本文档介绍了如何使用 Google Cloud 存储将 Google Cloud VPC 流日志注入到 Google Security Operations。
VPC 流日志会记录虚拟机实例(包括用作 Google Kubernetes Engine 节点的实例)发送和接收的网络流样本。这些日志可用于网络监控、取证、实时安全分析和费用优化。流日志会按连接以可配置的时间间隔进行汇总,并通过 Cloud Logging 近乎实时地导出。日志接收器将 VPC 流日志路由到 Cloud Storage 存储桶,Google SecOps 从该存储分区中提取这些日志。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 一个启用了以下 API 的 Google Cloud 项目:
- Cloud Storage API
- Cloud Logging API
- Compute Engine API
- 权限:
- 在子网上启用 VPC 流日志
- 创建和管理 Cloud Storage 存储分区
- 管理 Cloud Storage 存储分区的 IAM 政策
- 创建和管理 Cloud Logging API 接收器
- 您要启用 VPC 流日志的至少一个 VPC 子网
在子网上启用 VPC 流日志
在配置提取流水线之前,请确保目标子网上已启用 VPC 流日志。 Google Cloud 支持两种用于管理 VPC 流日志的 API:Network Management API(推荐)和 Compute Engine API。
使用 Google Cloud 控制台 (Network Management API)
- 在 Google Cloud 控制台中,依次前往 VPC 网络 > VPC 网络。
- 点击当前项目中的子网标签页。
- 选择要启用流日志的子网。
- 点击管理流日志。
- 点击添加新配置。
- 输入配置名称。
- 配置以下可选设置:
- 汇总间隔:选择汇总间隔(默认:5 秒)。较短的时间间隔可提供更精细的数据,但会增加日志量。
- 包含元数据:选择包含所有元数据以包含虚拟机实例和 VPC 详细信息。
- 次要抽样率:设置抽样率(默认值:对于 Network Management API 为 100%)。采样率越高,捕获的流量越多,但日志量也会增加。
- 过滤表达式:可选的 CEL 过滤表达式,用于包含或排除特定流量(最多 2,048 个字符)。
- 点击保存。
使用 gcloud 命令行工具 (Network Management API)
请使用下面的语法:
gcloud network-management vpc-flow-logs-configs create <CONFIG_NAME> \ --location=global \ --subnet=projects/<PROJECT_ID>/regions/<REGION>/subnetworks/<SUBNET_NAME> \ --aggregation-interval=INTERVAL_5_SEC \ --metadata=INCLUDE_ALL_METADATA \ --flow-sampling=1.0
将
<CONFIG_NAME>:描述性配置名称(例如vpc-flow-logs-config)<PROJECT_ID>:您的 Google Cloud 项目 ID。<REGION>:子网区域(例如us-central1)<SUBNET_NAME>:您的子网名称
使用 gcloud 命令行工具 (Compute Engine API)
请使用下面的语法:
gcloud compute networks subnets update <SUBNET_NAME> \ --region=<REGION> \ --enable-flow-logs \ --logging-aggregation-interval=interval-5-sec \ --logging-metadata=include-all \ --logging-flow-sampling=0.5 \ --project=<PROJECT_ID>
将
<SUBNET_NAME>:您的子网名称<REGION>:子网区域(例如us-central1)<PROJECT_ID>:您的 Google Cloud 项目 ID。
创建 Google Cloud Storage 存储桶
- 前往 Google Cloud 控制台。
- 选择您的项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 vpc-flow-logs-bucket)位置类型 根据您的需求进行选择(区域级、双区域、多区域) 位置 选择营业地点(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 均匀(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
创建 Logging 接收器以将 VPC 流日志导出到 GCS
Logging 接收器将 VPC 流日志从 Logging 路由到 Cloud Storage 存储桶。然后,Google SecOps 会从相应存储桶中提取导出的对象。
创建日志接收器
- 在 Google Cloud 控制台中,前往 Logging > 日志路由器。
- 点击创建接收器。
- 提供以下配置详细信息:
- 接收器名称:输入一个描述性名称(例如
vpc-flow-to-gcs)。 - 接收器说明:输入
Route VPC Flow Logs to Cloud Storage for Google SecOps ingestion。
- 接收器名称:输入一个描述性名称(例如
- 点击下一步。
- 在选择接收器服务部分中:
- 接收器服务:选择 Cloud Storage 存储桶。
- 选择 Cloud Storage 存储桶:选择存储桶
vpc-flow-logs-bucket。
- 点击下一步。
在选择要包含在接收器中的日志部分中,输入以下过滤条件以捕获 VPC 流日志:
resource.type="gce_subnetwork" AND log_id("compute.googleapis.com/vpc_flows")resource.type="gce_subnetwork" AND log_id("compute.googleapis.com/vpc_flows") AND resource.labels.subnetwork_name="<SUBNET_NAME>"- 将
<SUBNET_NAME>替换为目标子网名称。
- 将
点击下一步。
检查配置,然后点击创建接收器。
授予接收器写入者向存储桶写入内容的权限
创建接收器后,Logging 会为该接收器分配一个写入者服务账号(写入者身份)。向此身份授予向存储桶写入对象的权限。
- 前往日志记录 > 日志路由器。
- 找到接收器
vpc-flow-to-gcs,点击三点状菜单,然后选择查看接收器详情。 - 复制写入者身份值(格式为
serviceAccount:p<PROJECT_NUMBER>-<ID>@gcp-sa-logging.iam.gserviceaccount.com)。 - 前往 Cloud Storage > 存储分区。
- 点击存储桶
vpc-flow-logs-bucket。 - 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴接收器写入者身份(不带
serviceAccount:前缀)。 - 分配角色:选择 Storage Object Creator (
roles/storage.objectCreator)。
- 添加主账号:粘贴接收器写入者身份(不带
- 点击保存。
验证日志是否正在导出
- 前往 Cloud Storage > 存储分区。
- 点击存储桶
vpc-flow-logs-bucket。 - 等待几分钟,让接收器写入第一个对象。
验证是否已创建名为
compute.googleapis.com/vpc_flows/的文件夹(或包含日期的路径),并且其中包含导出的日志文件。
在 Google SecOps 中配置 Feed 以注入 VPC 流日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
GCP VPC Flow Logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 GCP VPC 流作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址。您将在下一步骤中用到它。
点击下一步。
为以下输入参数指定值:
存储桶 URI:输入带有前缀路径的 GCS 存储桶 URI:
gs://vpc-flow-logs-bucket/compute.googleapis.com/vpc_flows/- 替换:
vpc-flow-logs-bucket:您的 GCS 存储桶名称。compute.googleapis.com/vpc_flows:接收器写入日志的可选前缀/文件夹路径(留空表示根目录)。
- 替换:
来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限(天):包含在过去指定天数内修改的文件。默认值为 180 天。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
向 Google SecOps 服务账号授予 IAM 权限
Google SecOps 服务账号需要对您的 Cloud Storage 存储桶具有 Storage Object Viewer 角色。
- 前往 Cloud Storage > 存储分区。
- 点击存储桶
vpc-flow-logs-bucket。 - 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
- 分配角色:选择 Storage Object Viewer (
roles/storage.objectViewer)。
点击保存。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
_field |
additional.fields |
已合并 |
textpayload_label |
additional.fields |
已合并 |
tunnel_id_label |
additional.fields |
已合并 |
description |
metadata.description |
直接映射 |
timestamp |
metadata.event_timestamp |
解析为 ISO8601 |
ts |
metadata.event_timestamp |
解析为 ISO8601 |
event_type |
metadata.event_type |
直接映射 |
product_event_type |
metadata.product_event_type |
直接映射 |
product_log_id |
metadata.product_log_id |
直接映射 |
product_name |
metadata.product_name |
直接映射 |
product_version |
metadata.product_version |
直接映射 |
vendor_name |
metadata.vendor_name |
直接映射 |
ip_protocol_out |
network.ip_protocol |
直接映射 |
jsonPayload.bytes_sent |
network.sent_bytes |
已重命名/已映射 |
jsonPayload.packets_sent |
network.sent_packets |
已重命名/已映射 |
principal.ip |
principal.asset.ip |
已合并 |
target.ip |
principal.asset.ip |
已合并 |
jsonPayload.src_instance.vm_name |
principal.hostname |
直接映射 |
target.hostname |
principal.hostname |
已重命名/已映射 |
jsonPayload.connection.src_ip |
principal.ip |
直接映射 |
target.ip |
principal.ip |
已合并 |
jsonPayload.src_location.city |
principal.location.city |
直接映射 |
target.location.city |
principal.location.city |
已重命名/已映射 |
jsonPayload.src_location.country |
principal.location.country_or_region |
直接映射 |
target.location.country_or_region |
principal.location.country_or_region |
已重命名/已映射 |
jsonPayload.src_instance.region |
principal.location.name |
直接映射 |
resource.labels.location |
principal.location.name |
直接映射 |
target.location.name |
principal.location.name |
已重命名/已映射 |
jsonPayload.src_location.region |
principal.location.state |
直接映射 |
target.location.state |
principal.location.state |
已重命名/已映射 |
jsonPayload.src_vpc.project_id |
principal.namespace |
直接映射 |
jsonPayload.src_vpc.vpc_name |
principal.namespace |
直接映射 |
target.namespace |
principal.namespace |
已重命名/已映射 |
jsonPayload.connection.src_port |
principal.port |
直接映射 |
_field |
principal.resource.attribute.labels |
已合并 |
key |
principal.resource.attribute.labels |
已映射:jsonPayload_src_google_service_type → _field |
src_gke_cluster_location |
principal.resource.attribute.labels |
已合并 |
src_gke_cluster_name |
principal.resource.attribute.labels |
已合并 |
src_gke_namespace |
principal.resource.attribute.labels |
已合并 |
src_gke_pod_name |
principal.resource.attribute.labels |
已合并 |
logName |
security_result.category_details |
已合并 |
severity |
security_result.severity |
已映射:DEBUG → LOW |
principal.ip |
target.asset.ip |
已合并 |
target.ip |
target.asset.ip |
已合并 |
jsonPayload.dest_instance.vm_name |
target.hostname |
直接映射 |
principal.hostname |
target.hostname |
已重命名/已映射 |
jsonPayload.connection.dest_ip |
target.ip |
直接映射 |
principal.ip |
target.ip |
已合并 |
jsonPayload.dest_location.city |
target.location.city |
直接映射 |
principal.location.city |
target.location.city |
已重命名/已映射 |
jsonPayload.dest_location.country |
target.location.country_or_region |
直接映射 |
principal.location.country_or_region |
target.location.country_or_region |
已重命名/已映射 |
jsonPayload.dest_instance.region |
target.location.name |
直接映射 |
principal.location.name |
target.location.name |
已重命名/已映射 |
jsonPayload.dest_location.region |
target.location.state |
直接映射 |
principal.location.state |
target.location.state |
已重命名/已映射 |
jsonPayload.dest_vpc.project_id |
target.namespace |
直接映射 |
jsonPayload.dest_vpc.vpc_name |
target.namespace |
直接映射 |
principal.namespace |
target.namespace |
已重命名/已映射 |
jsonPayload.connection.dest_port |
target.port |
已重命名/已映射 |
dest_gke_cluster_location |
target.resource.attribute.labels |
已合并 |
dest_gke_cluster_name |
target.resource.attribute.labels |
已合并 |
dest_gke_namespace |
target.resource.attribute.labels |
已合并 |
dest_gke_pod_name |
target.resource.attribute.labels |
已合并 |
service_name_label |
target.resource.attribute.labels |
已合并 |
service_namespace_label |
target.resource.attribute.labels |
已合并 |
subnetwork_id_field |
target.user.attribute.labels |
已合并 |
| 不适用 | network.direction |
常量:OUTBOUND |
| 不适用 | network.ip_protocol |
常量:network.ip_protocol |
| 不适用 | network.sent_bytes |
常量:network.sent_bytes |
| 不适用 | principal.hostname |
常量:target.hostname |
| 不适用 | principal.location.city |
常量:target.location.city |
| 不适用 | principal.location.country_or_region |
常量:target.location.country_or_region |
| 不适用 | principal.location.name |
常量:target.location.name |
| 不适用 | principal.location.state |
常量:target.location.state |
| 不适用 | principal.namespace |
常量:target.namespace |
| 不适用 | principal.port |
常量:principal.port |
| 不适用 | security_result.severity |
常量:LOW |
| 不适用 | target.hostname |
常量:principal.hostname |
| 不适用 | target.location.city |
常量:principal.location.city |
| 不适用 | target.location.country_or_region |
常量:principal.location.country_or_re... |
| 不适用 | target.location.name |
常量:principal.location.name |
| 不适用 | target.location.state |
常量:principal.location.state |
| 不适用 | target.namespace |
常量:principal.namespace |
| 不适用 | target.port |
常量:-99 |
resource.labels.subnetwork_id |
target.user.attribute.labels |
从变更日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。