收集 Google Cloud 安全 Web 代理日志

支持的平台:

本文档介绍了如何使用 Google Cloud Storage V2 将 Google Cloud 安全 Web 代理日志注入到 Google Security Operations。

安全 Web 代理是一项云优先服务,可帮助您保护出站 Web 流量(HTTP 和 HTTPS)。它提供了一种受管理的代理解决方案,可基于云优先身份和 Web 应用实现灵活、精细的政策。安全 Web 代理会识别不符合政策的流量,并将其记录到 Cloud Logging 中,以便您监控互联网使用情况、发现网络威胁并响应安全突发事件。

准备工作

确保您满足以下前提条件:

  • Google SecOps 实例
  • 启用了 Cloud Storage API 的 Google Cloud 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 安全 Web 代理已在您的 Google Cloud 环境中处于活动状态并已配置
  • 对 Google Cloud 的特权访问权限以及访问安全 Web 代理日志的相应权限
  • 创建和管理 Cloud Logging 接收器的权限

创建 Google Cloud Storage 存储分区

使用 Google Cloud 控制台

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

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

使用 gcloud 命令行工具

  • 或者,使用 gcloud 命令创建存储桶:

    gcloud storage buckets create gs://gcp-swp-logs \
        --location=us-central1 \
        --default-storage-class=STANDARD
    
    • 替换:
      • gcp-swp-logs:您所需的存储桶名称(全局唯一)。
      • us-central1:您的首选区域(例如 us-central1europe-west1)。

配置 Cloud Logging 以将安全 Web 代理日志导出到 GCS

安全 Web 代理会自动将代理交易日志记录到 Cloud Logging。如需将这些日志导出到 Cloud Storage,您必须创建 Cloud Logging 接收器。

使用 Google Cloud 控制台

  1. Google Cloud 控制台中,依次前往日志记录 > 日志路由器
  2. 点击创建接收器
  3. 提供以下配置详细信息:
    • 接收器名称:输入一个描述性名称(例如 swp-export-sink)。
    • 接收器说明:可选说明。
  4. 点击下一步
  5. 选择接收器服务部分中:
    • 接收器服务:选择 Cloud Storage 存储桶
    • 选择 Cloud Storage 存储桶:从下拉菜单中选择 gcp-swp-logs
  6. 点击下一步
  7. 选择要包含在接收器中的日志部分中,输入以下过滤条件查询:

    logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"
    
    • <YOUR_PROJECT_ID> 替换为您的 Google Cloud 项目 ID。
  8. 点击下一步

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

创建接收器后,Cloud Logging 会显示接收器的写入者身份(一个服务账号电子邮件地址)。复制此服务账号电子邮件地址以供在后续步骤中使用。

使用 gcloud 命令行工具

  • 或者,使用 gcloud 命令创建接收器:

    gcloud logging sinks create swp-export-sink \
        storage.googleapis.com/gcp-swp-logs \
        --log-filter='logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"'
    
    • 替换:
      • swp-export-sink:您所需的接收器名称。
      • gcp-swp-logs:您的 GCS 存储桶名称。
      • <YOUR_PROJECT_ID>:您的 Google Cloud 项目 ID。

向 Cloud Logging 服务账号授予权限

Cloud Logging 接收器写入者身份服务账号需要具备向您的 GCS 存储桶写入日志的权限。

使用 Google Cloud 控制台

  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称 (gcp-swp-logs)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:粘贴 Cloud Logging 接收器写入者身份服务账号电子邮件地址(例如 serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.com)。
    • 分配角色:选择 Storage Object Admin
  6. 点击保存

使用 gcloud 命令行工具

  • 或者,使用 gcloud 命令授予权限:

    gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \
        --member="serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>" \
        --role="roles/storage.objectAdmin"
    
    • 替换:
      • gcp-swp-logs:您的存储桶名称。
      • <LOGGING_SERVICE_ACCOUNT_EMAIL>:Cloud Logging sink 写入者身份服务账号电子邮件地址。

使用 gsutil 命令行工具(旧版)

  • 将 Object Admin 角色分配给您的日志记录服务账号:

    gsutil iam ch serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>:objectAdmin \
        gs://gcp-swp-logs
    

验证权限

  • 如需验证权限是否已正确授予,请执行以下操作:

    gcloud storage buckets get-iam-policy gs://gcp-swp-logs \
        --flatten="bindings[].members" \
        --filter="bindings.role:roles/storage.objectAdmin"
    

您应该会在输出中看到 Cloud Logging 服务账号电子邮件地址。

检索 Google SecOps 服务账号

Google SecOps 使用唯一的服务账号从您的 GCS 存储桶中读取数据。您必须授予此服务账号对您的存储桶的访问权限。

在 Google SecOps 中配置 Feed 以注入 GCP 安全 Web 代理日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 GGoogle CloudCP Secure Web Proxy Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 GCP 安全 Web 代理作为日志类型

  7. 点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 复制此电子邮件地址,以便在下一步中使用。

  9. 点击下一步

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

    • 存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:
    gs://gcp-swp-logs/
    
    • 替换:
      • gcp-swp-logs:您的 GCS 存储桶名称。
    • 来源删除选项:根据您的偏好选择删除选项:

      • 永不:永不删除转移后的任何文件(建议用于测试)。
      • 删除已转移的文件:在成功转移后删除文件。
      • 删除已转移的文件和空目录:在成功转移后删除文件和空目录。

    • 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。

    • 资产命名空间资产命名空间

    • 注入标签:要应用于此 Feed 中事件的标签。

  11. 点击下一步

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

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

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

使用 Google Cloud 控制台

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

使用 gcloud 命令行工具

  • 或者,使用 gcloud 命令授予权限:

    gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \
        --member="serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>" \
        --role="roles/storage.objectViewer"
    
    • 替换:
      • gcp-swp-logs:您的存储桶名称。
      • <SECOPS_SERVICE_ACCOUNT_EMAIL>:Google SecOps 服务账号电子邮件地址。

使用 gsutil 命令行工具(旧版)

  • 运行以下命令,向 SecOps 服务账号授予对象查看者权限:

    gsutil iam ch serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>:objectViewer \
        gs://gcp-swp-logs
    

验证权限

  • 如需验证权限是否已正确授予,请执行以下操作:

    gcloud storage buckets get-iam-policy gs://gcp-swp-logs \
        --flatten="bindings[].members" \
        --filter="bindings.role:roles/storage.objectViewer"
    

您应该会在输出中看到 Google SecOps 服务账号电子邮件地址。

UDM 映射表

日志字段 UDM 映射 逻辑
httpRequest.latency、jsonPayload.@type、logName additional.fields 与 latency_label(键为“HTTPRequest Latency”,值为延迟时间)、type_label(键为“Log Type”,值为 @type)、logname(键为“Log Name”,值为 logName)合并
receiveTimestamp metadata.collected_timestamp 解析为 RFC3339 时间戳
metadata.event_type 如果 has_principal 为 true、has_target 为 true 且协议与 (?i)http 匹配,则设置为 NETWORK_HTTP;如果 has_principal 为 true、has_target 为 true 且网络不为空,则设置为 NETWORK_CONNECTION;如果 has_principal 为 true、has_target 为 true 且 has_principal_user 为 true,则设置为 USER_LOGIN;如果 has_principal 为 true,则设置为 STATUS_UPDATE;否则设置为 GENERIC_EVENT
insertId metadata.product_log_id 直接复制值
httpRequest.protocol network.application_protocol 使用 grok 模式 %{DATA:protocol}/%{INT:http_version} 提取的协议,如果协议为“HTTP”或“HTTPS”,则进行设置
httpRequest.protocol network.application_protocol_version 使用 Grok 模式 %{DATA:protocol}/%{INT:http_version} 提取了 http_version
httpRequest.requestMethod network.http.method 直接复制值
httpRequest.userAgent network.http.parsed_user_agent 直接复制的值,已转换为 parseduseragent
httpRequest.status network.http.response_code 转换为字符串,然后转换为整数
httpRequest.userAgent network.http.user_agent 直接复制值
httpRequest.responseSize network.received_bytes 直接复制的值,已转换为无符号整数
httpRequest.requestSize network.sent_bytes 直接复制的值,已转换为无符号整数
httpRequest.serverIp principal.asset.ip 使用 grok 模式 %{IP:server_ip} 提取的 IP,如果不为空,则设置
httpRequest.serverIp principal.ip 使用 grok 模式 %{IP:server_ip} 提取的 IP,如果不为空,则设置
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action security_result.action 如果 rule.action == ALLOW,则设置为 ALLOW;如果 rule.action == DENIED,则设置为 BLOCK
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action security_result.action_details 直接从 rule.action 复制的值
jsonPayload.enforcedGatewaySecurityPolicy.requestWasTlsIntercepted, resource.labels.gateway_name, resource.labels.resource_container, resource.labels.gateway_type security_result.detection_fields 与 tls_intercepted_label(键“requestWasTlsIntercepted”,值来自 requestWasTlsIntercepted)、gateway_name_label(键“gateway-name”,值来自 gateway_name)、resource_container_label(键“resource_container”,值来自 resource_container)、gateway_type_label(键“gateway-type”,值来自 gateway_type)合并
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].name security_result.rule_name 直接复制值
和程度上减少 security_result.severity 如果严重程度为 CRITICAL,则设置为 CRITICAL;如果严重程度为 ERROR,则设置为 ERROR;如果严重程度为 ALERT 或 EMERGENCY,则设置为 HIGH;如果严重程度为 INFO 或 NOTICE,则设置为 INFORMATIONAL;如果严重程度为 DEBUG,则设置为 LOW;如果严重程度为 WARNING,则设置为 MEDIUM;否则设置为 UNKNOWN_SEVERITY
jsonPayload.enforcedGatewaySecurityPolicy.hostname target.asset.hostname 直接复制值
httpRequest.remoteIp target.asset.ip 使用 Grok 模式 %{IP:remote_ip} 提取 IP,如果非空,则进行设置
jsonPayload.enforcedGatewaySecurityPolicy.hostname target.hostname 直接复制值
httpRequest.remoteIp target.ip 使用 Grok 模式 %{IP:remote_ip} 提取 IP,如果非空,则进行设置
resource.labels.location target.resource.attribute.cloud.availability_zone 直接复制值
resource.labels.network_name, resource.type target.resource.attribute.labels 与 rc_network_name_label(键为“rc_network_name”,值为 network_name)、resource_type(键为“Resource Type”,值为 resource.type)合并
httpRequest.requestUrl target.url 直接复制值

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。