收集 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)

  1. Google Cloud 控制台中,依次前往 VPC 网络 > VPC 网络
  2. 点击当前项目中的子网标签页。
  3. 选择要启用流日志的子网。
  4. 点击管理流日志
  5. 点击添加新配置
  6. 输入配置名称。
  7. 配置以下可选设置:
    • 汇总间隔:选择汇总间隔(默认:5 秒)。较短的时间间隔可提供更精细的数据,但会增加日志量。
    • 包含元数据:选择包含所有元数据以包含虚拟机实例和 VPC 详细信息。
    • 次要抽样率:设置抽样率(默认值:对于 Network Management API 为 100%)。采样率越高,捕获的流量越多,但日志量也会增加。
    • 过滤表达式:可选的 CEL 过滤表达式,用于包含或排除特定流量(最多 2,048 个字符)。
  8. 点击保存

使用 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 存储桶

  1. 前往 Google Cloud 控制台
  2. 选择您的项目。
  3. 在导航菜单中,依次前往 Cloud Storage > 存储分区
  4. 点击创建存储分区
  5. 提供以下配置详细信息:

    设置
    为存储桶命名 输入一个全局唯一的名称(例如 vpc-flow-logs-bucket
    位置类型 根据您的需求进行选择(区域级、双区域、多区域)
    位置 选择营业地点(例如 us-central1
    存储类别 标准(建议用于经常访问的日志)
    访问权限控制 均匀(推荐)
    保护工具 可选:启用对象版本控制或保留政策
  6. 点击创建

创建 Logging 接收器以将 VPC 流日志导出到 GCS

Logging 接收器将 VPC 流日志从 Logging 路由到 Cloud Storage 存储桶。然后,Google SecOps 会从相应存储桶中提取导出的对象。

创建日志接收器

  1. Google Cloud 控制台中,前往 Logging > 日志路由器
  2. 点击创建接收器
  3. 提供以下配置详细信息:
    • 接收器名称:输入一个描述性名称(例如 vpc-flow-to-gcs)。
    • 接收器说明:输入 Route VPC Flow Logs to Cloud Storage for Google SecOps ingestion
  4. 点击下一步
  5. 选择接收器服务部分中:
    • 接收器服务:选择 Cloud Storage 存储桶
    • 选择 Cloud Storage 存储桶:选择存储桶 vpc-flow-logs-bucket
  6. 点击下一步
  7. 选择要包含在接收器中的日志部分中,输入以下过滤条件以捕获 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> 替换为目标子网名称。
  8. 点击下一步

  9. 检查配置,然后点击创建接收器

授予接收器写入者向存储桶写入内容的权限

创建接收器后,Logging 会为该接收器分配一个写入者服务账号(写入者身份)。向此身份授予向存储桶写入对象的权限。

  1. 前往日志记录 > 日志路由器
  2. 找到接收器 vpc-flow-to-gcs,点击三点状菜单,然后选择查看接收器详情
  3. 复制写入者身份值(格式为 serviceAccount:p<PROJECT_NUMBER>-<ID>@gcp-sa-logging.iam.gserviceaccount.com)。
  4. 前往 Cloud Storage > 存储分区
  5. 点击存储桶 vpc-flow-logs-bucket
  6. 前往权限标签页。
  7. 点击授予访问权限
  8. 提供以下配置详细信息:
    • 添加主账号:粘贴接收器写入者身份(不带 serviceAccount: 前缀)。
    • 分配角色:选择 Storage Object Creator (roles/storage.objectCreator)。
  9. 点击保存

验证日志是否正在导出

  1. 前往 Cloud Storage > 存储分区
  2. 点击存储桶 vpc-flow-logs-bucket
  3. 等待几分钟,让接收器写入第一个对象。
  4. 验证是否已创建名为 compute.googleapis.com/vpc_flows/ 的文件夹(或包含日期的路径),并且其中包含导出的日志文件。

在 Google SecOps 中配置 Feed 以注入 VPC 流日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 GCP VPC Flow Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 GCP VPC 流作为日志类型
  7. 点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 复制此电子邮件地址。您将在下一步骤中用到它。

  9. 点击下一步

  10. 为以下输入参数指定值:

    • 存储桶 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 中事件的标签。

  11. 点击下一步

  12. 最终确定界面中查看新的 Feed 配置,然后点击提交

向 Google SecOps 服务账号授予 IAM 权限

Google SecOps 服务账号需要对您的 Cloud Storage 存储桶具有 Storage Object Viewer 角色。

  1. 前往 Cloud Storage > 存储分区
  2. 点击存储桶 vpc-flow-logs-bucket
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
    • 分配角色:选择 Storage Object Viewer (roles/storage.objectViewer)。
  6. 点击保存

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 已映射:DEBUGLOW
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 专业人士的解答。