收集 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 控制台
- 转到 Google Cloud Console。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 Google Cloud-swp-logs)位置类型 根据您的需求进行选择(区域级、双区域级、多区域级) 位置 选择相应位置(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 统一(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
使用 gcloud 命令行工具
或者,使用
gcloud命令创建存储桶:gcloud storage buckets create gs://gcp-swp-logs \ --location=us-central1 \ --default-storage-class=STANDARD- 替换:
gcp-swp-logs:您所需的存储桶名称(全局唯一)。us-central1:您的首选区域(例如us-central1、europe-west1)。
- 替换:
配置 Cloud Logging 以将安全 Web 代理日志导出到 GCS
安全 Web 代理会自动将代理交易日志记录到 Cloud Logging。如需将这些日志导出到 Cloud Storage,您必须创建 Cloud Logging 接收器。
使用 Google Cloud 控制台
- 在 Google Cloud 控制台中,依次前往日志记录 > 日志路由器。
- 点击创建接收器。
- 提供以下配置详细信息:
- 接收器名称:输入一个描述性名称(例如
swp-export-sink)。 - 接收器说明:可选说明。
- 接收器名称:输入一个描述性名称(例如
- 点击下一步。
- 在选择接收器服务部分中:
- 接收器服务:选择 Cloud Storage 存储桶。
- 选择 Cloud Storage 存储桶:从下拉菜单中选择
gcp-swp-logs。
- 点击下一步。
在选择要包含在接收器中的日志部分中,输入以下过滤条件查询:
logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"- 将
<YOUR_PROJECT_ID>替换为您的 Google Cloud 项目 ID。
- 将
点击下一步。
检查配置,然后点击创建接收器。
创建接收器后,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 控制台
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称 (
gcp-swp-logs)。 - 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Cloud Logging 接收器写入者身份服务账号电子邮件地址(例如
serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.com)。 - 分配角色:选择 Storage Object Admin。
- 添加主账号:粘贴 Cloud Logging 接收器写入者身份服务账号电子邮件地址(例如
点击保存。
使用 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 代理日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
GGoogle CloudCP Secure Web Proxy Logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
选择 GCP 安全 Web 代理作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址,以便在下一步中使用。
点击下一步。
为以下输入参数指定值:
- 存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:
gs://gcp-swp-logs/- 替换:
gcp-swp-logs:您的 GCS 存储桶名称。
来源删除选项:根据您的偏好选择删除选项:
- 永不:永不删除转移后的任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
删除已转移的文件和空目录:在成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
向 Google SecOps 服务账号授予 IAM 权限
Google SecOps 服务账号需要对您的 GCS 存储桶具有 Storage Object Viewer 角色。
使用 Google Cloud 控制台
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称。
- 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址。
- 分配角色:选择 Storage Object Viewer。
- 点击保存。
使用 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 专业人士的解答。