Web アプリケーションファイアウォール (WAF) コンソールのリアルタイムログ照会と分析サービスページは、ログ分析機能とログレポート機能に統合されています。 ドメインに対して WAF ログ収集機能を有効にしたら、リアルタイムログ照会と分析サービスページでリアルタイムの照会と分析を実行し、ダッシュボードを表示または編集し、モニタリングとアラームを設定します。

手順

  1. Web Application Firewall コンソールにログインし、[アプリマーケット] > [アプリの管理] をクリックします。
  2. [リアルタイムログ照会と分析サービス] エリアをクリックして、[Log Service] ページを開きます。
  3. ドメインを選択し、右側の [ステータス] スイッチがオンになっていることを確認します。
  4. [ログ分析] をクリックします。

    現在のページは [照会と分析] ページに統合されています。 クエリ文が自動的に挿入されます。 たとえば、 matched_host: "www.aliyun.com" を使用して、文中のドメインに関連するログエントリをすべて照会します。

  5. クエリ文と分析文を入力し、ログ時間範囲を選択し、[検索と分析] をクリックします。

その他操作

ログ分析ページでは、以下の操作が可能です。
  • 照会と分析のカスタマイズ

    Log Service は、さまざまな複雑なシナリオでログエントリを照会するためのリッチクエリおよび分析構文を提供します。 詳細は、本ページの「照会と分析のカスタマイズ」をご参照ください。

  • 期間ごとのログエントリ分布の表示
    クエリボックスの下に、期間とクエリ文によってフィルターされたログエントリ分布を表示します。 ヒストグラムを使用して分布を示します。横軸は期間を示し、縦軸はログエントリ数を示します。 照会結果内のログエントリの総数も表示されます。
    マウスの左ボタンを押しながらヒストグラムをドラッグして、より短い期間を選択します。 time picker は、期間を自動的に更新し、更新した期間に基づいて照会結果も更新されます。
  • Raw ログエントリの表示

    [Raw ログ] タブで、各ログエントリが単一ページで詳細に示され、ログエントリが生成された時刻、コンテンツ、およびログエントリ内のプロパティが含まれています。 [コンテンツ列の表示] をクリックして、コンテンツ列の長い文字列に対する表示モードを設定します。 (フルラインまたは 改行)。 [列の設定] をクリックして特定のフィールドを表示する、または [ログのダウンロード] ボタンをクリックして照会結果をダウンロードします。

    また、値またはプロパティ名をクリックして、クエリボックスにクエリ条件を追加します。 たとえば、request_method: GET フィールドの値 GET をクリックすると、クエリボックス内のクエリ文は次のように更新されます。

    <The original query statement> and request_method: GET
  • 分析グラフの表示

    Log Service を使用して、分析結果をグラフで表示可能です。 グラフタブで必要に応じてグラフの種類を選択します。 詳細は、「分析グラフ」をご参照ください。

  • クイック分析の実行

    Raw ログタブのクイック分析機能では、ワンクリックの対話型エクスペリエンスが提供されます。指定期間内の単一のプロパティによってログエントリ分布へのすばやいアクセスが提供されます。 この機能により、キーデータのインデックス作成にかかる時間を短縮します。 詳細は、次のセクションの「クイック分析」をご参照ください。

照会と分析のカスタマイズ

ログクエリ文は、照会 (検索) と分析 (分析論) から構成されます。 これら 2 つの部分は縦線で区切られています (|)。

$Search | $Analytics
タイプ 説明
照会 (検索) キーワード、あいまい文字列、数値、範囲、またはその他の抽出条件をクエリ条件に使用します。 組み合わせた条件も使用可能です。 文が空の場合、またはアスタリスク (*) のみが含まれている場合、すべてのログエントリが表示されます。
分析 (分析論) 照会結果またはすべてのログエントリに対して計算と統計を実行します。
照会部分と分析部分はどちらもオプションです。
  • 照会部分が空の場合は、期間内のすべてのログエントリが表示されます。 その後、照会結果は統計に使用されます。
  • 分析部分が空の場合は、照会結果のみが統計なしで返されます。

クエリ構文

Log Service のクエリ構文は、フルテキストインデックスフィールド検索をサポートしています。 クエリボックスで、改行表示モード、構文の強調表示、その他の機能を有効にします。
  • フルテキストインデックス

    プロパティを指定することなくキーワードを入力し、フルテキストインデックスを使用して、照会を実行します。 キーワードを含む照会ログエントリに二重引用符 ("") で囲んだキーワードを入力します。 スペースまたは and を追加してキーワードを区切ることも可能です。

    • 複数キーワード照会

      次の文を使用して、 www.aliyun.comerror を含むすべてのログエントリを照会します。

      www.aliyun.com error または www.aliyun.com and error

    • 条件クエリ

      次の文を使用して、 www.aliyun.comerror または 404 を含むすべてのログエントリを検索します。

      www.aliyun.com and (error or 404)
    • プレフィックス照会

      次の文を使用して、 www.aliyun.com を含み、かつ failed_ で始まるすべてのログエントリを照会します。

      www.aliyun.com and failed_*
      アスタリスク (*) をサフィックスとして追加できますが、 をプレフィックスとして追加することはできません。 たとえば、文は *_error にはなり得ません。
  • フィールド検索

    指定したフィールドに基づいてより正確な照会を実行します。

    フィールド検索は、数値型のフィールドに対する比較クエリをサポートしています。 形式は field name:value または field name>=value です。 また、and または or を使用して組み合わせクエリを実行します。これは、フルテキストインデックスと組み合わせて使用されます。
    WAF Log Service のドメイン名に対するアクセス、操作、および攻撃を記録するログエントリの照会もフィールドで実行されます。 フィールドの意味、種類、形式、およびその他の情報の詳細については、「WAF ログエントリのフィールド」をご参照ください。
    • 複数フィールド照会

      次の文を使用して、 www.aliyun.com ドメインに対する HTTP フラッド攻撃を記録し、WAF によって阻止されるすべてのログエントリを照会します。

      matched_host: www.aliyun.com and cc_blocks: 1

      IP アドレスが 1.2.3.4 である特定のクライアントから www.aliyun.com へのアクセスを記録するすべてのログエントリを照会する場合で、404 エラーによってアクセスがブロックされている場合は、次の文を使用します。

      real_client_ip: 1.2.3.4 and matched_host: www.aliyun.com and status: 404
      この例では、matched_hostcc_blocksreal_client_ip、および status フィールドは WAF ログに定義されているフィールドです。
    • 数値フィールド照会

      次の文は、応答時間が5秒を超えるすべてのログエントリをクエリするために使用できます。

      request_time_msec > 5000

      範囲クエリもサポートしています。 たとえば、応答時間が 5 秒を超え、10 秒以下であるすべてのログエントリを照会します。

      request_time_msec in (5000 10000]
      次のクエリ文は同じ機能を持ちます。
      request_time_msec > 5000 and request_time_msec <= 10000
    • フィールド存在照会

      フィールドの存在に基づいて照会を実行します。

      • 次の文を使用して ua_browser フィールドが存在するすべてのログエントリを検索します。
        ua_browser: *
      • 次の文を使用して、ua_browser フィールドが存在しないすべてのログエントリを検索します。
        not ua_browser: *
Log Service でサポートされているクエリ構文の詳細については、「インデックスと照会」をご参照ください。

分析用構文

ログデータの分析と統計には SQL/92 構文を使用します。

Log Service でサポートされている構文と機能の詳細は、「構文の説明」をご参照ください。
  • SQL 標準構文に続く from table name 部分は、分析文から省略可能です。 WAF Log Service で、 from log は省略可能です。
  • 最初の 100 件の結果がデフォルトで返され、LIMIT 構文を使用して返される結果の数を変更します。

照会と分析の例

時間ベースのログ照会と分析

各 WAF ログエントリには time フィールドがあり、ログエントリが生成された時刻を表すために使用されます。 このフィールドの値の形式は、 <year>-<month>-<day>T<hour>:<minute>:<second>+<time zone> です。 たとえば、2018-05-31T20:11:58+08:00 は、2018 年 5 月 15 日 20:11:58 UTC+8 (北京時間) です。

さらに、各ログエントリには __time __ という組み込みフィールドがあり、これはログエントリが生成された時刻を示すためにも使用されます。 このフィールドは、統計を実行するときに計算に使用されます。 このフィールドの形式は UNIX タイムスタンプであり、このフィールドの値は 1970 年 1 月 1 日 00:00:00 世界標準時 (UTC) から経過した秒数を示します。 したがって、計算結果を表示する場合は、最初に形式を変換する必要があります。
  • 時間の選択および表示
    time フィールドに基づいてログを照会します。 たとえば、 www.aliyun.com に対する HTTP フラッド攻撃を記録し、WAF によって阻止された最新の 10 件のログエントリを検索します。 そして、時間フィールド、送信元 IP フィールド、およびクライアントフィールドを表示します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | select time, real_client_ip, http_user_agent
        order by time desc
        limit 10
  • 時刻を使った計算。
    __time __ フィールドを使用して、時刻を使って計算します。 たとえば、ドメインが HTTP フラッド攻撃を受けてから経過した日数を計算します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    round((to_unixtime(now()) - __time__)/86400, 1) as "days_passed", real_client_ip, http_user_agent
          order by time desc
          limit 10
    この例では、 round((to_unixtime(now()) - __time__)/86400, 1) を使用して、ドメインが HTTP フラッド攻撃を受けてから経過した日数を計算します。 まず、 now() を使用して現在時刻を取得し、to_unixtime を使用して現在時刻を UNIX タイムスタンプに変換します。 次に、変換した時刻を組み込みフィールド __time __ の値で減算して経過した秒数を取得します。 最後に、86400 (1 日の合計秒数) で割り算し、round(data, 1) 関数を適用して小数第 1 位とします。 結果は、各攻撃ログエントリが生成されてから経過した日数です。
  • 特定の時間に基づくグループ統計の実行
    指定期間内のドメインに対する HTTP フラッド攻撃の傾向に基づいてログを照会します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | select date_trunc('day', __time__) as dt, count(1) as PV 
          group by dt 
          order by dt
    この例では、date_trunc('day', ..) 関数によって組み込みフィールド __time __ を使用して、エントリーの時間を日ごとに揃えます。 ログエントリが生成された日に基づいて、各ログエントリをグループに割り当てます。 count(1) を使用して各グループのログエントリの総数をカウントします。 その後、これらのエントリをグループごとに順序付けます。 date_trunc 関数の最初のパラメーターに他の値を使用して、secondminutehourweekmonthyear など、他の時間単位に基づいてログエントリをグループ化します。 この関数の詳細については、「日付と時刻の関数」をご参照ください。
    折れ線グラフで結果を表示することも可能です。
  • 時間に基づいたグループ統計の実行。
    より柔軟なグループ化を使用して時間に基づいてログを分析する場合は、複雑な計算が必要です。 たとえば、5 分以内ごとのドメインに対する HTTP フラッド攻撃の傾向に基づいてログを照会します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | select from_unixtime(__time__ - __time__% 300) as dt, 
             count(1) as PV 
          group by dt 
          order by dt 
          limit 1000
    この例では、組み込みフィールドは、式 __time__ - __time__% 300 を使用して時間を揃えるために使用され、from_unixtime 関数は結果の形式を変換します。 次に、各エントリを 5 分 (300 秒) の期間を示すグループに割り当て、count(1) を使用して各グループ内のログエントリの総数をカウントします。 最後に、照会結果はグループごとに順序付けされ、最初の 1,000 個の結果が返されます。これには、指定された期間以前の 83 時間以内に生成されたログエントリが含まれます。
    折れ線グラフで結果を表示することも可能です。
date_parsedate_format 関数を使用して時間形式を変換します。 時間フィールドの解析に使用できる関数の詳細については、「日付と時刻の関数」をご参照ください。

クライアント IP アドレスベースのログ照会と分析

WAF ログには、フィールド real_client_ip が含まれ、実際のクライアント IP アドレスを示しています。 ユーザーがプロキシサーバーを介して Web サイトにアクセスする場合、またはリクエストヘッダーの IP アドレスが間違っている場合は、ユーザーの実際の IP アドレスを取得できません。 ただし、remote_addr フィールドは、クライアントへの直接接続を形成し、これを使用して実際の IP アドレスを取得します。
  • 攻撃者の国別の分類
    HTTP フラッド攻撃者の国別分布に基づいてログを照会します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | SELECT ip_to_country(if(real_client_ip='-', remote_addr, real_client_ip)) as country, 
             count(1) as "number of attacks" 
             group by country
    この例では、関数 if(condition, option1, option2) は実際のクライアント IP アドレスを返します。 real_client_ip- の場合、この関数は remote_addr の値を返します。 それ以外の場合、この関数は real_client_ip を返します。 次に、ip_to_country を使用して、クライアント IP アドレスから国情報を取得します。
    世界地図で結果を表示することも可能です。
  • 都道府県別の訪問者の分布
    都道府県別の訪問者の分布を知るには、ip_to_province 関数を使用して IP アドレスから都道府県情報を取得します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | SELECT ip_to_province(if(real_client_ip='-', remote_addr, real_client_ip)) as province, 
             count (1) as "number of attacks" 
             group by province
    この例では、ip_to_province 関数を使用して、クライアントの実際の IP アドレスから国の情報を取得します。 IP アドレスが中国本土にない場合、この関数は国フィールドに IP アドレスの都道府県を返します。 ただし、結果を中国の地図で表示することを選択した場合、中国本土にない IP アドレスは表示されません。
    中国地図で結果を表示することも可能です。
  • 攻撃者の分布を示すヒートマップ
    ip_to_geo 関数を使用して、クライアントの実際の IP アドレスから地理情報 (緯度と経度) を取得します。 この情報を使用して、攻撃の密度を示すためのヒートマップを生成します。
    matched_host: www.aliyun.com and cc_blocks: 1 
    | SELECT ip_to_geo(if(real_client_ip='-', remote_addr, real_client_ip)) as geo, 
             count (1) as "number of attacks" 
             group by geo
             limit 10000
    この例では、ip_to_geo 関数を使用して、クライアントの実際の IP アドレスから緯度と経度を取得します。 最初の 10,000 件の結果が返されます。

    [Amap] をクリックして [ヒートマップの表示] をクリックします。

ip_to_provider 関数を使用して IP プロバイダー名を取得し、ip_to_domain 関数を使用して IP がパブリック IP かプライベート IP かを判別します。 IP アドレスを解決するために使用できる関数の詳細については、「IP 関数」をご参照ください。