收集 F5 Shape 日志

解析器版本:1.0

支持的平台:

本文档介绍了如何使用 Google Cloud Storage V2 将 F5 Shape 日志注入到 Google Security Operations。

F5 Distributed Cloud Bot Defense(原 Shape Security)通过识别和缓解恶意漫游器来保护应用免遭自动化攻击。Bot Defense 使用 JavaScript 和原生移动 SDK 从客户端浏览器和移动设备收集遥测数据,并在请求到达您的应用之前检查这些遥测数据。该服务提供集成式信息中心和报告,用于查看有关分析的流量的详细信息,包括安全事件、访问日志和审核日志。

准备工作

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

  • Google SecOps 实例
  • 已启用 Cloud Storage API 的 GCP 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 对 F5 Distributed Cloud Console 的特权访问权限
  • 具有 Multi-Cloud Network Connect 或共享配置服务访问权限的 F5 Distributed Cloud 账号

创建 Google Cloud Storage 存储桶

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

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

生成 F5 Shape API 凭据

F5 Distributed Cloud 使用 API 证书 (mTLS) 或 API 令牌进行身份验证。建议使用 API 证书来提高安全性。

创建 API 证书

  1. 登录 F5 Distributed Cloud Console
  2. 在控制台首页中,选择管理
  3. 在左侧导航菜单中,依次前往个人管理 > 凭据
  4. 点击 Add Credentials(添加凭证)。
  5. 元数据部分中,输入证书的名称(例如 secops-integration)。
  6. 凭据类型列表中,选择 API 证书
  7. 输入密码,然后在确认密码字段中确认密码。
  8. 从日历列表中选择到期日期

  9. 点击下载以生成并下载 .p12 文件格式的证书。

  10. 请妥善保存下载的证书文件和密码,以备日后使用。

在 F5 Distributed Cloud 中创建 GCP 云凭据

F5 Distributed Cloud 需要 Google Cloud 服务账号凭据才能将日志写入您的 GCS 存储桶。

创建 Google Cloud 服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 f5-xc-log-writer(或您偏好的名称)。
    • 服务账号说明:输入 Service account for F5 Distributed Cloud to write logs to GCS
  4. 点击创建并继续
  5. 向此服务账号授予对项目的访问权限部分:
    1. 点击选择角色
    2. 搜索并选择 Storage Object Admin
  6. 点击继续
  7. 点击完成

授予对 GCS 存储桶的 IAM 权限

  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称(例如 f5-xc-logs)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:输入服务账号电子邮件地址(例如 f5-xc-log-writer@PROJECT_ID.iam.gserviceaccount.com)。
    • 分配角色:选择 Storage Object Admin
  6. 点击保存

创建服务账号密钥

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 找到服务账号(例如 f5-xc-log-writer),然后点击该账号。
  3. 前往密钥标签页。
  4. 点击添加密钥 > 创建新密钥
  5. 选择 JSON 作为密钥类型。
  6. 点击创建
  7. 系统会自动下载 JSON 密钥文件。请妥善保存此文件。

向 F5 Distributed Cloud 添加 Google Cloud 云凭据

  1. F5 Distributed Cloud Console 中,从首页选择 Multi-Cloud Network ConnectShared Configuration
  2. 在左侧导航菜单中,依次前往管理 > 网站管理 > Cloud 凭据
  3. 点击添加云凭据
  4. 元数据部分中,输入名称(例如 gcp-secops-logs)。
  5. Cloud Credentials Type(云凭据类型)列表中,选择 GCP Credentials(GCP 凭据)。
  6. GCP 凭据部分中,点击配置
  7. 服务账号密钥部分:
    1. 密文类型列表中,选择蒙眼密文
    2. 操作列表中,选择 Blindfold New Secret
    3. 政策类型列表中,选择内置
    4. Secret to Blindfold 字段中,粘贴您下载的 JSON 密钥文件的完整内容。
  8. 点击应用
  9. 点击保存并退出

为 GCS 配置全局日志接收器

F5 Distributed Cloud Global Log Receiver 会以 NDJSON 格式(以换行符分隔的 JSON)每 5 分钟将日志流式传输到 GCS。

创建全局日志接收器

  1. F5 Distributed Cloud Console 中,从首页选择 Multi-Cloud Network ConnectShared Configuration
    • 对于 Multi-Cloud Network Connect:前往管理 > 日志管理 > 全局日志接收器
    • 对于共享配置:前往管理 > 全局日志接收器
  2. 点击 Add Global Log Receiver
  3. 元数据部分中,输入名称(例如 secops-gcs-receiver)。
  4. (可选)添加标签说明
  5. 日志类型列表中,选择要收集的日志类型:

    • 请求日志:来自负载平衡器的 HTTP 访问日志
    • 安全事件:机器人防御和 WAF 安全事件
    • 审核日志:配置和管理审核日志
    • DNS 请求日志:DNS 查询日志
  6. 日志消息选择列表中:

    • 如果使用 Multi-Cloud Network Connect 服务,请选择从当前命名空间中选择日志(系统命名空间)。
    • 如果使用共享配置服务,请选择以下选项之一:
      • 选择当前命名空间中的日志:仅发送共享命名空间中的日志。
      • 选择所有命名空间的日志:发送所有命名空间的日志。
      • 选择特定命名空间中的日志:输入特定命名空间名称,然后点击添加项以添加更多命名空间。
  7. 接收器配置列表中,选择 GCP Bucket

  8. GCP 存储分区部分中,提供以下配置:

    • GCP 存储桶名称:输入您的 GCS 存储桶名称(例如 f5-xc-logs)。
    • GCP Cloud 凭据:从列表中选择您创建的 Cloud 凭据(例如 gcp-secops-logs)。

配置高级设置(可选)

  1. 点击显示高级字段切换开关。
  2. 批处理选项部分,配置以下内容(可选):

    • 批处理超时选项:选择超时秒数,然后输入一个值(默认值:300 秒)。
    • 批次最大事件数:选择最大事件数,然后输入介于 32 到 2000 之间的值(可选)。
    • 批处理字节数:选择最大字节数,然后输入介于 4096 和 1048576 之间的值(默认值:10485760 字节 / 10 MB)。

完成并测试配置

  1. 点击保存并退出以创建全局日志接收器。
  2. 全局日志接收器列表中,找到您的接收器(例如 secops-gcs-receiver)。
  3. 操作列中,点击三点状图标 ...,然后选择测试连接
  4. 等待测试完成。成功消息表示连接正常。

  5. 验证日志是否正在写入 GCS:

    1. 在 GCP Console 中,前往 Cloud Storage > 存储分区
    2. 点击您的存储桶名称(例如 f5-xc-logs)。
    3. 在 5-10 分钟内,您应该会看到创建的文件夹,其结构如下:
      • 每日文件夹:YYYY-MM-DD/
      • 每小时子文件夹:YYYY-MM-DD/HH/
      • 日志文件:YYYY-MM-DD/HH/logs_YYYYMMDDHHMMSS.ndjson.gz

配置防火墙许可名单

F5 Distributed Cloud 要求在防火墙中允许特定 IP 范围,以便传送日志。

将以下 IP 地址范围添加到防火墙的许可名单中:

  • 193.16.236.64/29
  • 185.160.8.152/29

检索 Google SecOps 服务账号

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

获取服务账号电子邮件地址

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

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

  9. 点击下一步

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

    • 存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:

      gs://f5-xc-logs/
      
      • f5-xc-logs 替换为您的实际 GCS 存储桶名称。
      • 如果您在全局日志接收器中配置了特定前缀,请将其包含在路径中(例如 gs://f5-xc-logs/bot-defense/)。
    • 来源删除选项:根据您的偏好选择删除选项:

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

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

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

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

  11. 点击下一步

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

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

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

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

UDM 映射表

日志字段 UDM 映射 逻辑
msg.requestHeaders.Proxy-Client-IP、msg.requestHeaders.WF-Forwarded-For、msg.requestHeaders.X-Forwarded-For、msg.requestHeaders.wl-proxy-client-ip、msg.hashedUserAgent、msg.transactionId、msg.hashedUsername、msg.dcgShapeFailedOn、ShapeShifterId、eventType、eventId、latRequest、latResponse、latTotal、latRspWait、count、latEccWait additional.fields 从根据各种字段创建的标签合并而来
中介 中介 如果值不为空,则直接复制
说明 metadata.description 直接复制值
目标,has_principal_machine metadata.event_type 如果 target != "",则设置为 NETWORK_HTTP;否则,如果 has_principal_machine == true,则设置为 STATUS_UPDATE;否则设置为 GENERIC_EVENT
应用 network.application_protocol 值已转换为大写
requestMethod、msg.method network.http.method 如果 requestMethod 不为空,则返回 requestMethod 中的值;否则返回 msg.method
requestClientApplication、msg.requestHeaders.User-Agent network.http.parsed_user_agent 如果 requestClientApplication 不为空,则使用该值;否则使用 msg.requestHeaders.User-Agent,并转换为已解析的用户代理
requestContext、msg.requestHeaders.Referer network.http.referral_url 如果 requestContext 不为空,则为 requestContext 中的值;否则为 msg.requestHeaders.Referer
msg.sseResponseCode, prCode network.http.response_code 如果 msg.sseResponseCode 不为空,则为该值;否则为 prCode,转换为整数
requestClientApplication、msg.requestHeaders.User-Agent network.http.user_agent 如果 requestClientApplication 不为空,则为该值;否则为 msg.requestHeaders.User-Agent
requestHeader.x-shape-src-virtual observer.ip 直接复制值
主账号 主账号 直接复制值
msg.host principal.asset.hostname 直接复制值
src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For principal.asset.ip 如果 src 不为空,则为 src 中的值;否则为 msg.src;否则为 msg.trueClientIP;否则为 X-Forwarded-For 中的第一个 IP(如果 != src)
msg.host principal.hostname 直接复制值
src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For principal.ip 如果 src 不为空,则为 src 中的值;否则为 msg.src;否则为 msg.trueClientIP;否则为 X-Forwarded-For 中的第一个 IP(如果 != src)
msg.requestHeaders principal.resource.attribute.labels 从 msg.requestHeaders 中的键值对合并而来
msg.uri principal.url 直接复制值
security_result security_result 直接复制值
deviceExternalId security_result.about.asset_id 直接复制值
flowLabel、agentLabel、requestHeader.Content-Length、requestHeader.Content-Type、requestHeader.Accept、requestHeader.Accept-Encoding、browserType、accountInfo、requestHeader.Via、asn、tid、ctag、requestHeader.Cache-Control、transactionResult security_result.about.labels 从根据各种字段创建的标签合并而来
act, msg.transactionResult security_result.action 如果 act 与 PASS 相匹配且为 isAttack,则设置为 ALLOW,否则设置为 UNKNOWN_ACTION;或者,如果 msg.transactionResult 为 Success,则设置为 ALLOW,如果为 Failure,则设置为 BLOCK
act, msg.transactionResult security_result.action_details 如果来自 activity 的值不为空,则为该值;否则为 msg.transactionResult
和程度上减少 security_result.severity 如果为“错误”“error”“警告”,则设置为“高”;如果为“严重”,则设置为“严重”;如果为“通知”,则设置为“中”;如果为“信息”“info”“INFO”,则设置为“低”
和程度上减少 security_result.severity_details 直接复制值
attackCause security_result.threat_name 直接复制值
目标 目标 直接复制值
appName target.application 直接复制值
dst、msg.dst target.asset.ip 如果 dst 不为空,则为 dst 中的值,否则为 msg.dst
dhost target.hostname 直接复制值
dst、msg.dst target.ip 如果 dst 不为空,则为 dst 中的值,否则为 msg.dst
countryName target.location.country_or_region 直接复制值
dpt target.port 转换为整数
msg.responseHeaders target.resource.attribute.labels 从 msg.responseHeaders 中的键值对合并而来
请求 target.url 直接复制值
requestHeader.X-Forwarded-For intermediary.ip 设置为 X-Forwarded-For 数组中的后续 IP
metadata.product_name 设置为“形状”
metadata.vendor_name 设置为“F5”
requestHeaders_id_array.User-Agent network.http.user_agent 从变更日志映射
requestHeaders_id_array.Referer network.http.referral_url 从变更日志映射
requestHeaders_id_array.Proxy-Client-IP", "requestHeaders_id_array.WF-Forwarded-For", "requestHeaders_id_array.X-Forwarded-For", and "requestHeaders_id_array.wl-proxy-client-ip additional.fields 从变更日志映射

更新日志

查看相应解析器的更改日志

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