はじめに

AWS WAFのログが全て取得できるようになりました!! WAFのログ分析担当の方はぜひご一読いただきたい内容となっています。

Fullログとは

現在、Ruleにマッチしたログを取得するGetSampledRequestsという機能があります。 便利な機能なのですが、3時間以内の一部のログしか取得できない制約が設定されています。 しかし、今回のFullログ化により、全てのログが取得できるようになりました。

Full ログで取れるもの

Full ログでは AWS WAF に来た全てのアクセスが記録されます。"全て" というのがポイントで、これには検知した場合のログだけでなく、いずれの Rule にもマッチしなかった場合、すなわち Default Action が発火した場合のログも出力されます。そのため、検知データのみを分析したいといった場合には、このような値を除外する必要があります。

POST Body は取れるのか?

AWS WAF を運用しているて最も困るのが POST Body での誤検知。従来の SampledRequests では POST Body は出力されず、実質的に誤検知の調査ができない状態にありました。では、Full ログではどうでしょうか?残念ながら Full ログでも POST Body はログに出ないようです。Full ログの Full は全てのアクセスを記録するという意味のようです。

Format

1アクセス分の情報

Fullログは、sampleログと同様に1アクセスにつき1JSONの形式で取得します。 1アクセス分のデータは以下の通りです。

{
  "timestamp"          :1534531102630,
  "formatVersion"      :1,
  "webaclId"           :"360cb717-5a9f-4f2f-ac64-09ab912af591",
  "terminatingRuleId"  :"Default_Action",
  "terminatingRuleType":"REGULAR",
  "action"             :"ALLOW",
  "httpSourceName"     :"CF",
  "httpSourceId"       :"i-123",
  "ruleGroupList"      :[
    {
      "ruleGroupId"    :"61f4eb08-4e1b-4394-92b5-e8abf834fad6",
      "terminatingRule":null,"nonTerminatingMatchingRules":[]
    }
  ],
  "rateBasedRuleList":[
    {
      "rateBasedRuleId":"7c968ef6-32ec-4fee-96cc-51198e412e7f",
      "limitKey"       :"IP",
      "maxRateAllowed" :2000
    },
    {
      "rateBasedRuleId":"4659b169-2083-4a91-bbd4-08851a9aaf74",
      "limitKey"       :"IP",
      "maxRateAllowed" :2000
    }
  ],
  "nonTerminatingMatchingRules":[
    {
      "ruleId":"7c968ef6-32ec-4fee-96cc-51198e412e7f",
      "action":"COUNT"
    }
  ],
  "httpRequest":{
    "clientIp":"192.10.23.10",
    "country" :"US",
    "headers" :[
      {"name":"Host","value":"127.0.0.1:1989"},
      {"name":"User-Agent","value":"curl/7.53.1"},
      {"name":"Accept","value":"*/*"}
    ],
    "uri"        :"REDACTED",
    "args"       :"",
    "httpVersion":"HTTP/1.1",
    "httpMethod" :"GET",
    "requestId"  :"distribution_id"
  }
}

httpRequestの中にソースIP、国、ヘッダー、URIなどのアクセス内容に関する項目が含まれます。 上記以外には、webaclIdやterminatingRuleIdといったAWS WAF上の情報が含まれており、 どのWebACLのどのRuleが検知したのか判断できるようになっています。

出力ファイル形式

Full ログのファイルとしては下記のように1アクセス分の JSON が連結された形式でファイルに書き出されます。 この形式に関しては従来の Kinesis FireHose を踏襲しています。

{1アクセス分のJSON}{1アクセス分のJSON}{1アクセス分のJSON}...

…が!
ここで朗報がひとつ。上記のように JSON が単純に連結された形式ではそのままの状態で Athena に入れることができず、従来は lambda を書く必要がありました。なんと今回の Full ログでは 改行コード付きでJSON を出力可能です!!!!!!!!
形式は以下のような感じです。このアップデートにより、Athena に入れて分析という流れがだいぶやりやすくなったのではないでしょうか。

{1アクセス分のJSON}\n{1アクセス分のJSON}\n{1アクセス分のJSON}\n...

SampledRequestとの相違点

1アクセスごとのJSONの内容に関しては違いは無いようです。 そのため、Fullログになった事でPOSTのBodyが取れるようになったり…ということはないようです。 SampledRequestとの相違点をまとめてみました。

保存期間 サンプル
SampledRequest 3h 一部
Full log All 全ログ

Fullログの取得方法

WAF FullログはKinesis Firehoseを通じて取得可能です。 出力先としては、Firehoseで選択可能なサービスには対応しているようです。 したがって、S3, RedShift, ElasticSearchといったサービスへ連携可能です。 各サービスへ格納する際の前処理はKinesisの機能によって行います。

  • コンソールにアクセス
  • 出力先のパスを指定(S3, Athena など)

さいごに

以上、AWS WAF Fullログについての解説でした。 今回のFullログ化により、検知状況の収集、分析が一段と進む事になるのではないでしょうか。

当記事はChief WafCharm Developer 佐々木がお送りいたしました。