收集 F5 Distributed Cloud Services 日志
解析器版本:6.0
本文档介绍了如何使用 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 Global Log Receiver 要求将以下 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 凭证
- 登录 F5 Distributed Cloud 控制台,网址为
https://<tenant>.console.ves.volterra.io。 - 从首页中选择多云网络连接服务。
- 依次前往管理 > 网站管理 > 云凭证。
- 点击 Add Cloud Credentials(添加云端凭证)。
- 在元数据部分中:
- 名称:输入描述性名称(例如
gcp-chronicle-logs) - 说明(可选):输入
Cloud Storage credentials for Google SecOps log export
- 名称:输入描述性名称(例如
- 在云凭证类型部分中,选择 GCP 凭证。
- 点击 GCP 凭证字段中的配置。
- 在凭证类型下拉菜单中,选择服务账号凭证文件。
- 点击上传文件,然后选择您在前面步骤中下载的 JSON 密钥文件。
- 点击应用。
- 点击保存并退出。
创建全局日志接收器
- 在 F5 Distributed Cloud 控制台中,确保您位于多云网络连接服务中。
- 依次前往管理 > 日志管理 > 全局日志接收器。
- 点击添加全局日志接收器。
在元数据部分中:
- 名称:输入描述性名称(例如
chronicle-gcs-receiver) - 说明(可选):输入
Global log receiver for Google SecOps SIEM
- 名称:输入描述性名称(例如
在日志类型下拉菜单中,选择要导出的日志类型:
- 请求日志:包含用户、路径、方法、响应代码的 HTTP 请求/响应日志
- 安全性事件:WAF 事件、DDoS 攻击、API 防护、机器人防御事件
- 审核日志:通过公共 API 进行的配置更改
- DNS 请求日志:DNS 查询日志
在日志消息选择下拉菜单中,选择以下选项之一:
- 选择当前命名空间中的日志:仅发送当前命名空间中的日志
- 选择所有命名空间中的日志:发送所有命名空间中的日志(建议选择此选项,以获得全面的可见性)
- 选择特定命名空间中的日志:发送指定命名空间中的日志(点击添加项可添加命名空间名称)
在接收器配置下拉菜单中,选择 GCP 存储桶接收器。
在 GCP 存储桶名称字段中,输入 GCS 存储桶的名称(例如
f5-dcs-logs)。在 GCP Cloud Credentials(GCP 云凭证)下拉菜单中,选择您之前创建的云凭证(例如
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 存储桶中读取数据。您必须向此服务账号授予对存储桶的访问权限。
获取服务账号邮箱
- 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > 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 中事件的标签
点击下一步。
在最终确定界面中查看新的新闻信息流配置,然后点击提交。
向 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 | Merged from bot_info_name_label (derived from bot_info.name) |
| bot_info.type | security_result.detection_fields | 从 bot_info_type_label(派生自 bot_info.type)合并 |
| 时间戳 | @timestamp | 使用日期过滤器(RFC 3339、UNIX、ISO8601)进行解析 |
| visitor_id | security_result.detection_fields | 从 visitor_id_label(派生自 visitor_id)合并 |
| 标记 | security_result.detection_fields | 从 tag_label(派生自 tag)合并 |
| 操作 | security_result.action | 如果匹配“允许”,则设置为 ALLOW;如果匹配“拒绝”,则设置为 BLOCK |
| severity | security_result.severity | 如果为错误/警告,则设置为 HIGH;如果为严重,则设置为 CRITICAL;如果为通知,则设置为 MEDIUM;如果为信息/info,则设置为 LOW |
| 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 | Merged from about_app_type (derived from 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 | Merged from about_as_number (converted to string from 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 | Merged from sec_event_name_label (derived from sec_event_name) |
| sec_event_type | security_result.detection_fields | Merged from sec_event_type_label (derived from 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(派生自 time)合并 |
| kubernetes.namespace_name | additional.fields | 已从 namespace_name_label(派生自 kubernetes.namespace_name)合并 |
| src_instance | additional.fields | 从 src_instance_label(派生自 src_instance)合并 |
| violation_rating | additional.fields | Merged from violation_rating_label (derived from violation_rating) |
| req_size | additional.fields | 从 req_size_label 合并(从 req_size 转换为字符串) |
| rsp_code | additional.fields | Merged from rsp_code_label (converted to string from 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 | Merged from recommended_action_label (derived from recommended_action) |
| enforcement_mode | additional.fields | Merged from enforcement_mode_label (derived from 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 | 如果值不为空或不适用,则直接复制 |
| 命名空间 | 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” | |
| 中介 | 中介 | 直接合并 |
rsp_size |
event.idm.read_only_udm.network.received_bytes |
从更新日志映射 |
dst |
event.idm.read_only_udm.target.ip和event.idm.read_only_udm.target.asset.ip之间 |
从更新日志映射 |
has_sec_event |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
app |
event.idm.read_only_udm.target.application |
从更新日志映射 |
node_id |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
sample_rate |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_first_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_first_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_first_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_last_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_last_rx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_last_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
time_to_last_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
timeseries_enabled |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
sni |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
terminated_time |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
rtt_downstream_seconds |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
rtt_upstream_seconds |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
rsp_code_details |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
authority |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
connected_time |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
req_id |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
proxy_type |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
vh_type |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
dst_instance |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
lb_port |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
mtls |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
ja4_tls_fingerprint |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
duration_with_data_tx_delay |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
dst_site |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
protocol and scheme |
event.idm.read_only_udm.network.application_protocol |
从更新日志映射 |
referer |
event.idm.read_only_udm.network.http.referral_url |
从更新日志映射 |
tls_cipher_suite |
event.idm.read_only_udm.network.tls.cipher |
从更新日志映射 |
tls_version |
event.idm.read_only_udm.network.tls.version |
从更新日志映射 |
user_agent |
event.idm.read_only_udm.network.http.user_agent |
从更新日志映射 |
user_agent |
event.idm.read_only_udm.network.http.parsed_user_agent |
从更新日志映射 |
browser_type |
event.idm.read_only_udm.principal.browser.browser_type |
从更新日志映射 |
content-type |
event.idm.read_only_udm.principal.process.file.mime_type |
从更新日志映射 |
response_flags |
security_result.detection_fields |
从更新日志映射 |
original_authority |
event.idm.read_only_udm.target.administrative_domain |
从更新日志映射 |
country |
event.idm.read_only_udm.principal.location.country_or_region |
从更新日志映射 |