为网站域名开启WAF日志采集后,您可以使用日志查询功能对采集到的日志数据进行实时查询与分析,并基于查询与分析结果生成统计图表、创建告警等。

前提条件

已开通WAF日志服务。具体操作,请参见快速使用WAF日志服务

查询和分析日志

  1. 登录Web应用防火墙控制台,在顶部菜单栏,选择WAF实例的资源组和地域(中国内地非中国内地)。
  2. 在左侧导航栏,选择安全运营 > 日志服务
  3. 从域名下拉列表中选择要开启日志采集的网站域名,打开右侧的状态开关,开启该网站域名的日志采集功能。开启日志采集
    域名下拉列表(图示①)仅包含已接入WAF防护的网站域名。如果您还未将网站域名接入WAF防护,请先完成网站接入。具体操作,请参见使用教程
  4. 日志查询页签,通过查询与分析语句,对WAF日志数据进行查询与分析。日志查询
    1. 在语句输入框(图示①),输入查询语句。
      查询语句采用阿里云日志服务专用语法,关于该语法的详细介绍,请参见查询语法。查询语句中使用WAF日志包含的字段作为查询字段,关于支持使用的查询字段,请参见WAF日志字段
      如果您不了解日志查询语法,推荐您使用高级搜索。您只需在语句输入框上方展开高级搜索,设置搜索条件并单击搜索,语句输入框即可自动生成与搜索条件匹配的日志查询语句。下表描述了高级搜索支持设置的搜索条件。
      搜索条件 说明
      IP 发起请求的客户端的IP地址。
      Trace ID WAF为客户端请求生成的唯一标识。WAF向客户端返回拦截页面或者滑块验证响应时会提供该ID,用于问题分析与故障排查。
      Rule ID 请求命中的WAF防护规则ID。您可以在安全报表或者系统管理 > 防护规则组页面,获取规则ID信息。
      服务器响应状态码 源站服务器响应WAF回源请求的HTTP状态码。
      WAF返回客户端响应码 WAF响应客户端请求的HTTP状态码。
      拦截规则 请求命中的WAF防护规则的类型。关于WAF防护模块的介绍及不同模块防护规则的配置方法,请参见概述
    2. 如果您需要对查询结果进行计算和统计分析,可以在语句输入框(图示①)已输入的查询语句后,输入分析语句。如果您只需要查询满足条件的日志数据,可跳过该步骤。
      分析语句和查询语句间使用竖线(|)分隔。分析语句采用标准的SQL92语法,关于分析语句的更多介绍,请参见分析概述
    3. 通过时间选择器(图示②),修改日志查询时间范围。
    4. 单击查询/分析(图示③)。
      查询与分析结果(即命中查询条件的WAF日志数据)将会显示在页面下方,包含日志分布直方图、原始日志统计图表。您可以基于查询结果进行快速分析、生成统计图表、设置告警等。具体操作,请参见操作查询和分析结果创建告警
    更多关于日志查询与分析的案例,请参见查询与分析案例

操作查询和分析结果

WAF日志服务为您提供日志分布直方图、原始日志和统计图表形式的展示查询分析结果,并支持设置告警、快速查询等操作。
  • 日志分布直方图
    日志分布直方图主要展示查询到的日志在时间上的分布。 分布直方图
    • 鼠标指向绿色数据块时,可以查看该数据块代表的时间范围和日志命中次数。
    • 单击绿色数据块,可以查看更细时间粒度的日志分布,同时在原始日志页签中同步展示指定时间范围内的查询结果。
  • 原始日志
    您可以在原始日志页签中,查看日志查询结果。 原始日志
    • 快速分析
      单击别名图标,选择显示KeyKey的别名,该别名可在创建索引时配置。例如host_name的别名为host,如果你选择显示别名,则在快速分析列表中显示host
      说明 当某字段没有别名时,您选择显示别名,在快速分析列表中仍显示字段名(Key)。

      更多信息,请参见快速分析

    • 查看日志详情
      • 单击表格,查看表格形式的日志。
      • 单击原始,查看原始形式的日志。
        • 单击复制图标,复制日志。
        • 单击tag详情图标,查看tag详情。
      • 单击换行,关闭或开启换行显示日志。
      • 单击时间,开启按时间顺序显示日志。
      • 单击下载日志图标,可以将日志下载到本地计算机,支持直接下载、通过Cloud Shell下载、通过命令行工具下载等方式。更多信息,请参见下载日志
      • 单击设置图标,配置Tag设置列设置JSON设置事件配置
  • 统计图表
    您可以在统计图表页签,查看可视化的查询分析结果。您必须在语句输入框中输入SQL92分析语句,才可以在统计图表页签查看对应的统计图表。
    • 切换图表类型:选择不同的图表类型来查看分析结果。关于不同图表类型的介绍,请参见图表设置
    • 预览图表:切换图表类型后,查看图表预览效果。

      单击添加到仪表盘,可以将当前图表添加到仪表盘。单击下载日志,可以将日志下载到本地计算机,支持直接下载通过Cloud Shell下载通过命令行工具下载等方式。具体操作,请参见下载日志

    • 修改统计图表配置
      操作 说明
      通用配置 对统计图表进行全局配置。例如选择颜色方案后,整个统计图表的颜色都基于该颜色方案进行展示。
      字段配置 对单个查询分析的结果或单个查询分析结果中的单列数据进行个性化的可视化设置。例如选择某个查询分析后,再选择颜色方案,则该查询分析结果相关的图形颜色基于该颜色方案进行展示。
      设置交互事件 对单个查询分析的结果或单个查询分析结果中的单列数据进行交互设置,加深数据分析的维度。
  • 日志聚类

    日志聚类页签,单击开启日志聚类,可实现在采集日志时将相似度高的日志聚合。更多信息,请参见日志聚类

创建告警

您可以基于当前查询与分析语句创建告警。创建告警后,日志服务将定期检查查询与分析结果,并在检查结果满足预设条件时,向您发送告警通知,实现实时的服务状态监控。

在查询分析页面上,选择另存为告警 > 新版告警,可为查询分析结果设置告警。更多信息,请参见设置告警

查询与分析案例

  • 15分钟为步长,分析在整点时刻由不同WAF防护模块拦截的攻击请求的数量,展示时间(time)、WAF规则防护引擎拦截请求数(wafmodule)、IP黑名单及自定义防护策略(ACL访问控制)拦截请求数(aclmodule)、CC安全防护及自定义防护策略(CC攻击防护)拦截请求数(httpfloodmodule)。
    * |
    SELECT
      time_series(__time__, '15m', '%H:%i', '0') as time,
      COUNT_if(final_plugin = 'waf') as "wafmodule",
      COUNT_if(final_plugin = 'acl') as "aclmodule",
      COUNT_if(final_plugin = 'cc') as "httpfloodmodule"
    GROUP by
      time
    ORDER by
      time
  • 分析触发了WAF最终防护动作的防护模块类型(final_plugin)的分布情况,展示命中次数(times)、被请求域名(host)和最终防护模块(final_plugin)。
    * |
    SELECT
      count(*) as times,
      host,
      final_plugin
    GROUP by
      host,
      final_plugin
    ORDER by
      times desc
  • 15分钟为步长,分析整点时刻的QPS,展示时间(time)和QPS(QPS)。
    * |
    SELECT
      time_series(__time__, '15m', '%H:%i', '0') as time,
      count(*) / 900 as QPS
    GROUP by
      time
    ORDER by
      time
  • 分析受CC攻击次数最多的域名,展示CC攻击拦截次数(times)和被访问域名(host)。
    *
    and acl_action :block |
    SELECT
      count(*) as times,
      host
    GROUP by
      host
    ORDER by
      times desc
  • 以秒为步长,分析网站请求日志的详情,展示时间(time)、被访问域名(host)、被访问路径(request_path)、请求方法(request_method)、WAF响应客户端请求的HTTP状态码(status)、源站响应WAF回源请求的HTTP状态码(upstream_status)、查询字符串(querystring)。
    * |
    SELECT
      date_format(date_trunc('second', __time__), '%H:%i:%s') as time,
      host,
      request_path,
      request_method,
      status,
      upstream_status,
      querystring
    LIMIT
      10
  • 查询网站(your_domain_name)遭受的最近10条攻击请求记录,展示请求发起时间(time)、真实客户端IP(real_client_ip)和客户端类型(http_user_agent)。
    matched_host: your_domain_name
    and final_action: block |
    SELECT
      time,
      real_client_ip,
      http_user_agent
    ORDER by
      time desc
    LIMIT
      10
  • 分析网站(your_domain_name)遭受的攻击请求被WAF拦截后经过的天数(days_passed,保留1位小数)。
    matched_host: your_domain_name
    and final_action: block |
    SELECT
      time,
      round((to_unixtime(now())-__time__) / 86400, 1) as "days_passed",
      real_client_ip,
      http_user_agent
    ORDER by
      time desc
    LIMIT
      10
  • 分析网站(your_domain_name)遭受的攻击请求次数按天的变化趋势。
    matched_host: your_domain_name
    and final_action: block |
    SELECT
      date_trunc('day', __time__) as dt,
      count(1) as PV
    GROUP by
      dt
    ORDER by
      dt
    date_trunc函数用于对当前时间进行按天对齐分组。关于该函数的更多信息,请参见日期和时间函数
  • 分析网站(your_domain_name)遭受的攻击请求的来源国家(country)分布。
    matched_host: your_domain_name
    and final_action: block |
    SELECT
      ip_to_country(
        if(real_client_ip = '-', remote_addr, real_client_ip)
      ) as country,
      count(1) as "攻击次数"
    GROUP by
      country
    WAF日志中real_client_ip字段表示真实客户端IP。如果由于用户通过代理服务器访问或请求头中IP字段有误等原因无法获取真实客户端IP(real_client_ip取值为-),也可以直接使用remote_addr字段(表示直连客户端IP)作为真实客户端IP。
  • 分析网站(your_domain_name)遭受的攻击请求的来源省份(province)分布。
    matched_host: your_domain_name
    and final_action: block |
    SELECT
      ip_to_province(
        if(real_client_ip = '-', remote_addr, real_client_ip)
      ) as province,
      count(1) as "攻击次数"
    GROUP by
      province
    ip_to_province函数用于获取真实客户端IP对应的省份信息。关于该函数的更多信息,请参见IP函数