收集 F5 Distributed Cloud Services 日志
本文档介绍了如何使用 Google Cloud Storage V2 将 F5 Distributed Cloud Services 日志注入到 Google Security Operations 中。
F5 Distributed Cloud Services 是一个基于 SaaS 的安全、网络和应用管理平台,可在多云和边缘位置提供分布式云基础架构、应用交付、API 安全和 Web 应用防火墙功能。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 启用了 Cloud Storage API 的 Google Cloud 项目
- 创建和管理 GCS 存储分区的权限
- 管理 GCS 存储分区的 IAM 政策的权限
- 对 F5 Distributed Cloud 控制台的特权访问权限
- 在 F5 Distributed Cloud 中创建全局日志接收器对象的权限
创建 Google Cloud Storage 存储分区
- 前往 Google Cloud 控制台。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 f5-dcs-logs)位置类型 根据您的需求进行选择(区域级、双区域级、多区域级) 位置 选择相应位置(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 统一(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
配置 F5 Distributed Cloud 以导出到 GCS
将 GCS 存储桶添加到防火墙许可名单
F5 Distributed Cloud 全球日志接收器要求将以下 IP 地址范围添加到防火墙许可名单:
193.16.236.64/29185.160.8.152/29
如果您的 GCS 存储桶使用 VPC Service Controls 或防火墙规则,请将这些 IP 范围添加到许可名单。
为 F5 Distributed Cloud 创建 Google Cloud 服务账号
- 在 Google Cloud 控制台中,依次前往 IAM 和管理 > 服务账号。
- 点击创建服务账号。
提供以下配置详细信息:
- 服务账号名称:输入
f5-dcs-log-writer(或一个描述性名称) - 服务账号说明:输入
Service account for F5 Distributed Cloud to write logs to GCS
- 服务账号名称:输入
点击创建并继续。
在向此服务账号授予对项目的访问权限部分中:
- 点击选择角色。
- 搜索并选择 Storage Object Admin。
点击继续。
点击完成。
创建服务账号密钥
- 在服务账号列表中,点击您创建的服务账号(例如
f5-dcs-log-writer)。 - 前往密钥标签页。
- 点击添加密钥 > 创建新密钥。
- 选择 JSON 作为密钥类型。
- 点击创建。
- JSON 密钥文件将下载到您的计算机。
- 请妥善保存此文件。您将在后续步骤中用到此名称。
授予对 GCS 存储桶的 IAM 权限
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称(例如
f5-dcs-logs)。 - 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:输入服务账号电子邮件地址(例如
f5-dcs-log-writer@PROJECT_ID.iam.gserviceaccount.com) - 分配角色:选择 Storage Object Admin
- 添加主账号:输入服务账号电子邮件地址(例如
- 点击保存。
在 F5 Distributed Cloud 控制台中创建 Google Cloud 凭据
- 前往
https://<tenant>.console.ves.volterra.io,登录 F5 Distributed Cloud 控制台。 - 从首页中选择 Multi-Cloud Network Connect 服务。
- 依次前往管理 > 网站管理 > 云凭据。
- 点击添加云凭据。
- 在元数据部分中:
- 名称:输入一个描述性名称(例如
gcp-chronicle-logs) - 说明(可选):输入
Cloud Storage credentials for Google SecOps log export
- 名称:输入一个描述性名称(例如
- 在 Cloud 凭据类型部分中,选择 GCP 凭据。
- 点击 GCP 凭据字段中的配置。
- 在凭据类型下拉菜单中,选择服务账号凭据文件。
- 点击上传文件,然后选择您在之前的步骤中下载的 JSON 密钥文件。
- 点击应用。
- 点击保存并退出。
创建全局日志接收器
- 在 F5 Distributed Cloud Console 中,确保您位于 Multi-Cloud Network Connect 服务中。
- 依次前往管理 > 日志管理 > 全局日志接收器。
- 点击 Add Global Log Receiver。
在元数据部分中:
- 名称:输入一个描述性名称(例如
chronicle-gcs-receiver) - 说明(可选):输入
Global log receiver for Google SecOps SIEM
- 名称:输入一个描述性名称(例如
在日志类型下拉菜单中,选择要导出的日志类型:
- 请求日志:包含用户、路径、方法、响应代码的 HTTP 请求/响应日志
- 安全事件:WAF 事件、DDoS 攻击、API 保护事件、Bot 防御事件
- 审核日志:通过公共 API 进行的配置更改
- DNS 请求日志:DNS 查询日志
在日志消息选择下拉菜单中,选择以下选项之一:
- 选择当前命名空间中的日志:仅发送当前命名空间中的日志
- 选择所有命名空间的日志:发送所有命名空间的日志(建议选择此选项,以便全面了解情况)
- 选择特定命名空间中的日志:发送指定命名空间中的日志(点击添加项以添加命名空间名称)
在接收器配置下拉菜单中,选择 GCP Bucket 接收器。
在 GCP Bucket Name 字段中,输入您的 GCS 存储桶的名称(例如
f5-dcs-logs)。在 GCP Cloud Credentials 下拉菜单中,选择您之前创建的云凭据(例如
gcp-chronicle-logs)。可选:展开显示高级字段以配置批处理选项:
- 批处理超时选项:选择超时秒数,然后输入一个值(默认值:
300秒) - 批次最大事件数:选择最大事件数,然后输入介于 32 到 2000 之间的值(如果未设置,则表示没有限制)
- 批处理字节数:选择最大字节数,然后输入介于 4096 和 1048576 之间的值(默认值:
10485760字节 / 10 MB)
- 批处理超时选项:选择超时秒数,然后输入一个值(默认值:
点击保存并退出。
测试连接
- 在全局日志接收器列表中,找到您创建的接收器(例如
chronicle-gcs-receiver)。 - 点击操作列中的三点状图标 (...)。
- 选择测试连接。
- 等待测试完成。
系统应会显示一条消息,表明连接成功。
验证 GCS 存储桶中的日志
- 在 GCP 控制台中,前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称(例如
f5-dcs-logs)。 - 验证日志文件是否正在存储桶中创建。
F5 Distributed Cloud 会按以下文件夹结构整理日志:
YYYY/MM/DD/HH/- 系统会为每一天创建一个文件夹 (YYYY/MM/DD)
- 在每个日期文件夹中,系统会为每个小时 (HH) 创建一个子文件夹
- 每 5 分钟,新的压缩 gzip 文件会写入到每小时子文件夹中
- 文件采用 NDJSON 格式(以换行符分隔的 JSON)
点击 gzip 文件即可下载并检查日志格式。
检索 Google SecOps 服务账号
Google SecOps 使用唯一的服务账号从您的 GCS 存储桶中读取数据。您必须向此服务账号授予对您的存储桶的访问权限。
获取服务账号电子邮件地址
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
F5 DCS Logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 F5 Distributed Cloud Services 作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com复制此电子邮件地址,以便在下一步中使用。
点击下一步。
为以下输入参数指定值:
存储桶网址:输入 GCS 存储桶 URI:
gs://f5-dcs-logs/将
f5-dcs-logs替换为您的 GCS 存储桶名称。来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:成功转移后删除文件。
删除已转移的文件和空目录:成功转移后删除文件和空目录。
文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
资产命名空间:资产命名空间
注入标签:要应用于此 Feed 中事件的标签
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
向 Google SecOps 服务账号授予 IAM 权限
Google SecOps 服务账号需要对您的 GCS 存储桶具有 Storage Object Viewer 角色。
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称(例如
f5-dcs-logs)。 - 前往权限标签页。
- 点击授予访问权限。
提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址
- 分配角色:选择 Storage Object Viewer
点击保存。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| _id | metadata.product_log_id | 直接复制值 |
| src | principal.namespace | 直接复制值 |
| kubernetes_labels_app | target.resource.attribute.labels | 从 app_label(派生自 kubernetes_labels_app)合并 |
| kubernetes_host | target.hostname | 直接复制值 |
| kubernetes_container_name | target.resource.product_object_id | 直接复制值 |
| bot_info.classification | security_result.detection_fields | 从 bot_info_classification_label(派生自 bot_info.classification)合并 |
| bot_info.name | security_result.detection_fields | 从 bot_info_name_label(派生自 bot_info.name)合并 |
| bot_info.type | security_result.detection_fields | 从 bot_info_type_label(派生自 bot_info.type)合并 |
| 时间戳 | @timestamp | 使用 RFC3339、UNIX、ISO8601 的日期过滤器进行解析 |
| visitor_id | security_result.detection_fields | 从 visitor_id_label(派生自 visitor_id)合并 |
| 标记 | security_result.detection_fields | 从 tag_label(派生自代码)合并 |
| 操作 | security_result.action | 如果匹配项允许,则设置为 ALLOW;如果匹配项拒绝,则设置为 BLOCK |
| 和程度上减少 | security_result.severity | 如果出现错误/警告,请设置为“高”;如果出现严重错误,请设置为“严重”;如果出现通知,请设置为“中”;如果出现信息/信息,请设置为“低” |
| 和程度上减少 | security_result.severity_details | 直接复制值 |
| api_endpoint | target.labels | 从 api_endpoint_label(派生自 api_endpoint)合并 |
| app_firewall_name | principal.process.command_line | 直接复制值 |
| app_type | security_result.detection_fields | 从 about_app_type(派生自 app_type)合并 |
| as_org | security_result.detection_fields | 从 about_as_org(派生自 as_org)合并 |
| asn | security_result.detection_fields | 从 about_asn(派生自 asn)合并 |
| kubernetes.pod_id | security_result.detection_fields | 从 about_pod_id(派生自 kubernetes.pod_id)合并 |
| kubernetes.pod_name | security_result.detection_fields | 从 about_pod_name(派生自 kubernetes.pod_name)合并 |
| 纬度 | principal.location.region_latitude | 转换为浮点数 |
| longitude | principal.location.region_longitude | 转换为浮点数 |
| req_params | additional.fields | 从 about_req_params(派生自 req_params)合并 |
| as_number | additional.fields | 从 about_as_number 合并(从 as_number 转换为字符串) |
| x_forwarded_for | intermediary.ip | 如果 IP 有效,则合并 |
| x_forwarded_for | security_result.about.resource.attribute.labels | 如果不是 IP,则从 x_forwarded_for_label 合并 |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | 从 malicious_user_label(派生自 policy_hit.malicious_user_mitigate_action)合并 |
| policy_hit.policy | security_result.about.resource.attribute.labels | 从 policy_label 合并(派生自 policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | 从 policy_namespace_label(派生自 policy_hit.policy_namespace)合并 |
| policy_hit.policy_rule | security_result.rule_name | 直接复制值 |
| policy_hit.policy_rule_description | security_result.description | 直接复制值 |
| policy_hit.policy_set | target.resource.name | 直接复制值 |
| policy_hit.result | additional.fields | 从 result_label(派生自 policy_hit.result)合并 |
| vhost_id | security_result.detection_fields | 从 vhostlabel(派生自 vhost_id)合并 |
| messageid | security_result.detection_fields | 从 messageid_label(派生自 messageid)合并而来 |
| sec_event_name | security_result.detection_fields | 从 sec_event_name_label(派生自 sec_event_name)合并 |
| sec_event_type | security_result.detection_fields | 从 sec_event_type_label(派生自 sec_event_type)合并 |
| vh_name | security_result.detection_fields | 从 vhost_name_label(派生自 vh_name)合并 |
| tls_fingerprint | security_result.detection_fields | 从 tls_fingerprint_label(派生自 tls_fingerprint)合并 |
| 时间 | additional.fields | 从 time_label(派生自时间)合并 |
| kubernetes.namespace_name | additional.fields | 从 namespace_name_label(派生自 kubernetes.namespace_name)合并 |
| src_instance | additional.fields | 从 src_instance_label(派生自 src_instance)合并 |
| violation_rating | additional.fields | 从违规评级标签(派生自违规评级)合并 |
| req_size | additional.fields | 从 req_size_label(从 req_size 转换为字符串)合并 |
| rsp_code | additional.fields | 从 rsp_code_label 合并(从 rsp_code 转换为字符串) |
| rsp_code_class | additional.fields | 从 rsp_code_class_label(从 rsp_code_class 转换为字符串)合并 |
| rsp_size | additional.fields | 从 rsp_size_label(从 rsp_size 转换为字符串)合并 |
| original_path | additional.fields | 从 original_path_label(派生自 original_path)合并 |
| req_path | target.url | 直接复制值 |
| req_headers_size | additional.fields | 从 req_headers_size_label(派生自 req_headers_size)合并 |
| recommended_action | additional.fields | 从 recommended_action_label(派生自 recommended_action)合并 |
| enforcement_mode | additional.fields | 从 enforcement_mode_label(派生自 enforcement_mode)合并 |
| src_ip | principal.ip、principal.asset.ip | 如果匹配 IPv4 正则表达式,则合并 |
| 主机 | principal.ip、principal.asset.ip | 如果匹配 IPv4 正则表达式,则合并 |
| 主机名 | principal.hostname、principal.asset.hostname | 如果值不为空,则直接复制;否则 - |
| http_version | network.application_protocol_version | 直接复制值 |
| http_version | network.application_protocol | 如果包含 HTTP,则设置为 HTTP;如果包含 HTTPS,则设置为 HTTPS |
| 网络 | principal.nat_ip | 如果匹配 IPv4 正则表达式,则合并 |
| dst_ip | target.ip、target.asset.ip | 如果匹配 IPv4 正则表达式,则合并 |
| dst_port | target.port | 转换为整数 |
| src_port | principal.port | 转换为整数 |
| src_site | additional.fields | 从 src_site_field(派生自 src_site)合并 |
| 网站 | additional.fields | 从 site_field(派生自 site)合并 |
| cluster_name | additional.fields | 从 cluster_name_field(源自 cluster_name)合并 |
| 域名 | principal.administrative_domain | 直接复制值 |
| 方法 | network.http.method | 如果值不为空或不是 N/A,则直接复制该值 |
| 命名空间 | target.namespace | 直接复制值 |
| city | principal.location.city | 直接复制值 |
| 流式传输 | security_result.detection_fields | 从 stream_label(派生自 stream)合并 |
| 区域 | principal.location.country_or_region | 直接复制值 |
| 用户 | principal.user.userid | 使用 user_id 的 Grok 模式从用户处提取 |
| user_ip | target.ip、target.asset.ip | 从提取的 user_ip 合并 |
| Cookie | additional.fields | 从 Cookie 合并(派生自 req_headers 中的 Cookie) |
| X-F5-Request-Id | security_result.detection_fields | 从 x_f5_request_id(派生自 req_headers 中的 X-F5-Request-Id)合并 |
| X-Request-Id | security_result.detection_fields | 从 request_id(派生自 req_headers 中的 X-Request-Id)合并 |
| security_result | security_result | 直接合并 |
| has_network、has_principal、has_target | metadata.event_type | 如果全部为 true,则设置为 NETWORK_CONNECTION;如果 has_principal 为 true,则设置为 STATUS_UPDATE;否则设置为 GENERIC_EVENT |
| metadata.vendor_name | 设置为“F5_DCS” | |
| metadata.product_name | 设置为“F5 DCS” | |
| 中介 | 中介 | 直接合并 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。