收集 Azure WAF 日志

解析器版本:4.0

支持的平台:

本文档介绍了如何使用 Azure 存储账号将 Azure Web 应用防火墙 (WAF) 日志导出到 Google Security Operations。解析器以 JSON 格式处理日志,并将其转换为 UDM。它通过迭代处理包含 records 数组的日志,并将特定字段映射到 UDM 属性。如果 records 数组不存在,解析器会将日志作为单个事件处理,并相应地提取和映射字段。

准备工作

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

  • Google SecOps 实例
  • 有效的 Azure 租户
  • 对 Azure 的特权访问权限

配置 Azure 存储账号

  1. 在 Azure 控制台中,搜索存储账号。
  2. 点击创建。
  3. 为以下输入参数指定值:
    • 订阅:选择相应订阅。
    • 资源组:选择资源组。
    • 区域:选择区域。
    • 性能:选择性能(建议选择“标准”)。
    • 冗余:选择冗余(建议使用 GRS 或 LRS)。
    • 存储账号名称:为新存储账号输入一个名称。
  4. 点击 Review + create(检查 + 创建)。
  5. 查看账号概览,然后点击创建。
  6. 在存储账号概览页面上,选择安全性 + 网络中的访问密钥子菜单。
  7. 点击 key1 或 key2 旁边的显示。
  8. 点击复制到剪贴板以复制密钥。
  9. 将密钥保存在安全的位置,以供日后使用。
  10. 在存储账号概览页面中,选择设置中的终结点子菜单。
  11. 点击复制到剪贴板以复制 Blob 服务端点网址;例如,https://<storageaccountname>.blob.core.windows.net。
  12. 将端点网址保存在安全的位置,以供日后使用。

如何为 Azure WAF 日志配置日志导出

  1. 使用您的特权账号登录 Azure 门户。
  2. 前往 Web 应用防火墙 (WAF) 规则,然后选择要监控的 WAF。
  3. 依次选择监控 > 诊断设置。
  4. 点击 + 添加诊断设置。
    • 为诊断设置输入描述性名称。
  5. 选择 allLogs。
  6. 选择归档到存储账号复选框作为目标位置。
    • 指定订阅和存储账号。
  7. 点击保存。

设置 Feed

您可以通过两种不同的入口点在 Google SecOps 平台上设置 Feed:

  • SIEM Settings(SIEM 设置)> Feeds(Feed)> Add New Feed(添加新 Feed)
  • 内容中心 > 内容包 > 开始使用

如何设置 Azure WAF Feed

  1. 点击 Azure Platform 软件包。
  2. 找到 Azure WAF 日志类型,然后点击添加新 Feed。
  3. 为以下字段指定值:

    • 来源类型:Microsoft Azure Blob Storage V2。
    • Azure URI:Blob 端点网址。
      • ENDPOINT_URL/BLOB_NAME
        • 替换以下内容:
          • ENDPOINT_URL:Blob 端点网址 (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME:blob 的名称(例如 <logname>-logs)
    • 源删除选项:根据您的提取偏好选择删除选项。 注意:如果您选择 Delete transferred files 或 Delete transferred files and empty directories 选项,请确保您已向服务账号授予适当的权限。
    • 文件存在时间上限:包含在过去指定天数内修改过的文件。默认值为 180 天。
    • 共享密钥:Azure Blob Storage 的访问密钥。高级选项

    • Feed 名称:用于标识 Feed 的预填充值。

    • 资产命名空间:与 Feed 关联的命名空间。

    • 提取标签:应用于相应 Feed 中所有事件的标签。

  4. 点击创建 Feed。

如需详细了解如何为该产品系列中的不同日志类型配置多个 Feed,请参阅按产品配置 Feed。

UDM 映射表

日志字段 UDM 映射 逻辑
backendPoolName additional.fields[?key=='backendPoolName'].value.string_value 该值取自原始日志中的 backendPoolName 字段。
backendSettingName additional.fields[?key=='backendSettingName'].value.string_value 该值取自原始日志中的 backendSettingName 字段。
category metadata.product_event_type 该值取自原始日志中的 category 字段。
EventEnqueuedUtcTime additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 EventEnqueuedUtcTime 字段。
EventProcessedUtcTime additional.fields[?key=='EventProcessedUtcTime'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 EventProcessedUtcTime 字段。
operationName additional.fields[?key=='operationName'].value.string_value 该值取自原始日志中的 operationName 字段。
properties.action additional.fields[?key=='action'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 properties.action 字段。
properties.action security_result.action_details 如果 records 字段不存在,则该值取自原始日志中的 properties.action 字段。
properties.clientIP,properties.clientIp principal.asset.ip,principal.ip 该值取自原始日志中的 properties.clientIP 或 properties.clientIp 字段,优先取自 clientIP。
properties.clientPort principal.port 该值取自原始日志中的 properties.clientPort 字段。
properties.clientResponseTime principal.resource.attribute.labels[?key=='Client Response Time'].value 如果不存在 records 字段,则该值取自原始日志中的 properties.clientResponseTime 字段。
properties.details.data additional.fields[?key=='Properties data'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 properties.details.data 字段。
properties.details.file principal.process.file.full_path 如果 records 字段不存在,则该值取自原始日志中的 properties.details.file 字段。
properties.details.matches[].matchVariableName,properties.details.matches[].matchVariableValue additional.fields[?key.startsWith('%{idx} ')].value.string_value 该值取自原始日志中的 properties.details.matches 数组。UDM 中的 key 是使用索引 (idx) 和 matchVariableName 构建的。value 取自 matchVariableValue。
properties.details.message metadata.description 该值取自原始日志中的 properties.details.message 字段(移除反斜杠和引号后)。
properties.details.msg metadata.description 如果存在 records 字段,则该值取自原始日志中的 properties.details.msg 字段。
properties.httpMethod network.http.method 该值取自原始日志中的 properties.httpMethod 字段。
properties.httpStatus network.http.response_code 该值取自原始日志中的 properties.httpStatus 字段。
properties.httpVersion network.application_protocol 如果 properties.httpVersion 字段包含 HTTP,则分配值 HTTP。
properties.host、properties.hostname、properties.originalHost principal.asset.hostname,principal.hostname 该值取自 properties.originalHost、properties.host 或 properties.hostname,并按此顺序优先考虑。
properties.policyId security_result.detection_fields[?key=='policyId'].value 该值取自原始日志中的 properties.policyId 字段。
properties.policyMode security_result.detection_fields[?key=='policyMode'].value 如果存在 records 字段,则该值取自原始日志中的 properties.policyMode 字段。
properties.policy additional.fields[?key=='Properties policy'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 properties.policy 字段。
properties.receivedBytes network.received_bytes 该值取自原始日志中的 properties.receivedBytes 字段。
properties.requestUri target.url 该值取自原始日志中的 properties.requestUri 字段。
properties.ruleId security_result.rule_id 该值取自原始日志中的 properties.ruleId 字段。
properties.ruleName security_result.rule_name 如果存在 records 字段,则该值取自原始日志中的 properties.ruleName 字段。
properties.ruleName,ruleSetType security_result.rule_name 该值取自 properties.ruleName 字段,如果该字段为空,则在 records 字段不存在时,该值取自原始日志中的 ruleSetType 字段。
properties.ruleSetVersion security_result.detection_fields[?key=='ruleSetVersion'].value 该值取自原始日志中的 properties.ruleSetVersion 字段。
properties.sentBytes network.sent_bytes 该值取自原始日志中的 properties.sentBytes 字段。
properties.serverResponseLatency additional.fields[?key=='Server Response Latency'].value.string_value 如果 records 字段不存在,则该值取自原始日志中的 properties.serverResponseLatency 字段。
properties.serverRouted target.asset.ip、target.ip、target.port IP 和端口是从 properties.serverRouted 字段中提取的。
properties.sslCipher network.tls.cipher 该值取自原始日志中的 properties.sslCipher 字段。
properties.sslClientCertificateIssuerName network.tls.server.certificate.issuer 该值取自原始日志中的 properties.sslClientCertificateIssuerName 字段。
properties.sslProtocol network.tls.version 该值取自原始日志中的 properties.sslProtocol 字段。
properties.timeTaken additional.fields[?key=='Properties Timetaken'].value.string_value 如果不存在 records 字段,则该值取自原始日志中的 properties.timeTaken 字段。
properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 properties.trackingReference 字段。
properties.transactionId network.session_id 该值取自原始日志中的 properties.transactionId 字段。
properties.userAgent network.http.user_agent 该值取自原始日志中的 properties.userAgent 字段。
properties.WAFEvaluationTime additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value 如果不存在 records 字段,则该值取自原始日志中的 properties.WAFEvaluationTime 字段。
properties.WAFMode additional.fields[?key=='Properties WAFMode'].value.string_value 如果不存在 records 字段,则该值取自原始日志中的 properties.WAFMode 字段。
rec.category metadata.product_event_type 如果存在 records 字段,则该值取自原始日志中的 rec.category 字段。
rec.operationName additional.fields[?key=='operationName'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 rec.operationName 字段。
rec.properties.clientIP,rec.properties.clientIp principal.asset.ip,principal.ip 该值取自原始日志中的 rec.properties.clientIP 或 rec.properties.clientIp 字段,当 records 字段存在时,优先取 clientIP。
rec.properties.clientPort principal.port 如果原始日志中存在 records 字段,则该值取自 rec.properties.clientPort 字段。
rec.properties.host principal.asset.hostname,principal.hostname 如果存在 records 字段,则该值取自原始日志中的 rec.properties.host 字段。
rec.properties.policy additional.fields[?key=='Properties policy'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 rec.properties.policy 字段。
rec.properties.requestUri target.url 如果存在 records 字段,则该值取自原始日志中的 rec.properties.requestUri 字段。
rec.properties.ruleName security_result.rule_name 如果存在 records 字段,则该值取自原始日志中的 rec.properties.ruleName 字段。
rec.properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value 如果存在 records 字段,则该值取自原始日志中的 rec.properties.trackingReference 字段。
rec.resourceId target.resource.id 如果存在 records 字段,则该值取自原始日志中的 rec.resourceId 字段。
rec.time metadata.event_timestamp 如果存在 records 字段,则该值取自原始日志中的 rec.time 字段。
resourceId target.resource.id 如果 records 字段不存在,则该值取自原始日志中的 resourceId 字段。
timeStamp metadata.event_timestamp 如果不存在 records 字段,则该值取自原始日志中的 timeStamp 字段。
不适用 metadata.event_type 如果主账号(主机名或客户端 IP)和目标 IP 同时存在,则该值设置为 NETWORK_CONNECTION。如果存在主体但缺少目标 IP,则设置为 STATUS_UPDATE。否则,该值默认为 GENERIC_EVENT 或 event_type 字段的值。
不适用 metadata.log_type 该值已硬编码为 AZURE_WAF。
不适用 metadata.product_name 该值已硬编码为 Azure WAF Logs。
不适用 metadata.vendor_name 该值已硬编码为 Microsoft。
不适用 security_result.action 如果 properties.action 为 Matched,则该值设置为 ALLOW;如果 properties.action 为 Block,则该值设置为 BLOCK。

更新日志

查看此解析器的更新日志

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