收集 Cloudflare WAF 日志

支持的平台:

此解析器会从 Cloudflare Web 应用防火墙 (WAF) JSON 日志中提取字段,并将其转换并映射到 Unified Data Model (UDM)。它会处理各种 Cloudflare 操作,使用元数据和网络信息丰富数据,然后将输出结构化为 UDM 格式。

准备工作

  • 确保您拥有 Google SecOps 实例。
  • 确保您拥有对 Google Cloud的特权访问权限。
  • 确保您已订阅 Cloudflare 企业版方案。
  • 确保您拥有对 Cloudflare 的超级用户访问权限。

创建 Google Cloud 存储分区

  1. 登录 Google Cloud 控制台
  2. 前往 Cloud Storage 存储分区页面。

    进入“存储桶”

  3. 点击创建

  4. 配置存储分区:

    • 名称:输入符合存储分区名称要求的唯一名称(例如 cloudflare-waf)。
    • 选择数据存储位置:选择一个位置。
    • 为数据选择一个存储类别:为存储分区选择默认存储类别,或者选择 Autoclass 以自动管理存储类别。
    • 选择如何控制对象的访问权限:选择以强制执行禁止公开访问,然后为存储分区对象选择访问权限控制模型
    • 存储类别:根据您的需求进行选择(例如标准)。
  5. 点击创建

向 Cloudflare IAM 用户授予存储分区权限

  1. 在 Google Cloud中,依次前往存储 > 浏览器 > 存储分区 > 权限
  2. 为账号 logpush@cloudflare-data.iam.gserviceaccount.com 授予 Storage Object Admin 权限。

使用 Cloudflare 界面为 WAF 日志创建 Logpush 作业

  1. 登录 Cloudflare。
  2. 依次前往分析和日志 > Logpush
  3. 选择创建 Logpush 作业
  4. 选择目标位置中,选择 Google Cloud Storage
  5. 输入以下目的地详细信息:
    • 存储分区: Google Cloud 存储分区名称
    • 路径:存储容器中的存储分区位置
    • 选择将日志整理到每日子文件夹中
  6. 点击继续
  1. 选择要推送到存储空间的安全性 (WAF) 数据集。
  2. 配置 logpush 作业:
    • 输入作业名称
    • 在“如果日志匹配”下,您可以选择要包含和/或从日志中移除的事件。如需了解详情,请参阅过滤条件。并非所有数据集都提供此选项。
    • 发送以下日志字段中,您可以选择将所有日志推送到存储目的地,也可以选择要推送的日志。
  3. 点击提交

在 Google SecOps 中配置 Feed 以提取 Cloudflare WAF 日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击新增
  3. Feed 名称字段中,输入 Feed 的名称(例如 Cloudflare WAF 日志)。
  4. 选择 Google Cloud Storage 作为来源类型
  5. 选择 Cloudflare WAF 作为日志类型
  6. 点击获取服务账号
  7. 点击下一步
  8. 为以下输入参数指定值:

    • GCS URI:Cloud Storage 网址。
    • URI 是:选择包含子目录的目录
    • 来源删除选项:根据您的偏好选择删除选项。
    • 资源命名空间资源命名空间
    • 提取标签:要应用于此 Feed 中的事件的标签。
  9. 点击下一步

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

UDM 映射表

日志字段 UDM 映射 逻辑
Action security_result.action_details 原始日志中的 Action 值会直接分配给此 UDM 字段。
Action security_result.action 此字段的值派生自原始日志中的 Action 字段。如果 Action 为“允许”,则 UDM 字段设置为 ALLOW。如果 Action 为“challengeSolved”“jschallengeSolved”“managedchallengenoninteractivesolved”或“managedchallengeinteractivesolved”,则 UDM 字段会设置为 ALLOW_WITH_MODIFICATION。如果 Action 为“drop”“block”或“connectionclose”,则 UDM 字段会设为 BLOCK。如果 Action 为“challengefailed”或“jschallengefailed”,则 UDM 字段会设置为 FAIL。否则,该值会设置为 UNKNOWN_ACTION
ClientASN network.asn 将原始日志中的 ClientASN 值转换为字符串后,系统会将其直接分配给此 UDM 字段。
ClientASNDescription additional.fields.key 该键会静态设置为“ClientASNDescription”。
ClientASNDescription additional.fields.value.string_value 原始日志中的 ClientASNDescription 值会直接分配给此 UDM 字段。
ClientCountry principal.location.country_or_region 原始日志中的 ClientCountry 值会直接分配给此 UDM 字段。
ClientIP principal.ip 原始日志中的 ClientIP 值会直接分配给此 UDM 字段。
ClientRefererHost intermediary.hostname 原始日志中的 ClientRefererHost 值会直接分配给此 UDM 字段。
ClientRefererPath network.http.referral_url 原始日志中的 ClientRefererPath 值会直接分配给此 UDM 字段。
ClientRequestHost target.hostname 原始日志中的 ClientRequestHost 值会直接分配给此 UDM 字段。
ClientRequestMethod network.http.method 原始日志中的 ClientRequestMethod 值会直接分配给此 UDM 字段。
ClientRequestPath target.file.full_path 原始日志中的 ClientRequestPath 值会直接分配给此 UDM 字段。
ClientRequestProtocol network.application_protocol ClientRequestProtocol 的协议部分(例如“HTTP/1.1”中的“HTTP”)使用 grok 提取,转换为大写,然后分配给此 UDM 字段。
ClientRequestUserAgent network.http.user_agent 原始日志中的 ClientRequestUserAgent 值会直接分配给此 UDM 字段。
Datetime metadata.event_timestamp 系统会将原始日志中的 Datetime 值解析为 RFC 3339 时间戳,并将其分配给此 UDM 字段。
EdgeColoCode additional.fields.key 该键会静态设置为“EdgeColoCode”。
EdgeColoCode additional.fields.value.string_value 原始日志中的 EdgeColoCode 值会直接分配给此 UDM 字段。
EdgeResponseStatus network.http.response_code 原始日志中的 EdgeResponseStatus 值会直接分配给此 UDM 字段并转换为整数。
Kind metadata.product_event_type 原始日志中的 Kind 值会直接分配给此 UDM 字段。
Metadata.filter target.resource.attribute.labels.value 原始日志中的 Metadata.filter 值会分配给 target.resource.attribute.labels 中标签的 value 字段。此标签的 key 已静态设置为“元数据过滤器”。
Metadata.type target.resource.attribute.labels.value 原始日志中的 Metadata.type 值会分配给 target.resource.attribute.labels 中标签的 value 字段。此标签的 key 已静态设置为“元数据类型”。此字段的值是根据 ClientIPClientRequestHostapp_protocol 的存在性和值派生的。如需了解具体逻辑,请参阅解析器代码。将静态值设为“Cloudflare”。将静态值设为“Cloudflare Log Aggregator”。将静态值设为“CLOUDFLARE_WAF”。
RayID metadata.product_log_id 原始日志中的 RayID 值会直接分配给此 UDM 字段。
RuleID security_result.rule_id 原始日志中的 RuleID 值会直接分配给此 UDM 字段。
Source security_result.rule_name 原始日志中的 Source 值会直接分配给此 UDM 字段。
timestamp metadata.event_timestampevents.timestamp 原始日志中的 timestamp 值会直接分配给这些 UDM 字段。

变化

2024-08-08

  • 从“ClientRequestHost”和“ClientRequestURI”中提取数据,将其合并,并将结果映射到“target.url”。

2023-08-30

  • 初始化了字段“ClientRequestPath”。

2023-02-02

  • 在将“security_result”值合并到事件之前对其进行了验证。

2022-09-16

  • 将“Action”字段映射到了“security_result.action_details”。
  • 当操作包含“challengeSolved”“jschallengeSolved”“managedchallengenoninteractivesolved”“managedchallengeinteractivesolved”时,将“security_result.action”映射到“ALLOW_WITH_MODIFICATION”。
  • 将“security_result.action”映射到“BLOCK”,前提是操作包含“drop”“block”“connectionclose”。
  • 将“security_result.action”映射到“FAIL”,前提是操作包含“challengefailed”“jschallengefailed”。

2022-07-25

  • 新创建的解析器

需要更多帮助?向社区成员和 Google SecOps 专业人士寻求解答。