BLOG

2018/09/19

AWS WAF Full Log を S3 に出力する

【概要】

2018年9月1日(日本時間)にAWS WAFよりFull Log機能が発表されました。今までは検知ログを見ようとしてもサンプリングで3時間前までと制限がありましたが、今回のリリースを上手く使いこなせばそのような制限も無く、より詳細なリクエスト内容を保存することができます。今回はFull Log記事第一弾として「Kinesis Firehose を構築し、S3にFull Logを出す」ところまでをやってみます。

【Kinesis Firehose】

Kinesis Firehose はほぼリアルタイムで生成されるデータを設定した出力先に保存するサービスです。生成されたデータをS3やRedshiftに保存してデータの解析などを行うことができます。まずはKinesis Firehoseの環境を構築し、その後AWS WAFと連携させます。

【Kinesis Firehoseの設定】

Amazon Kinesis のページに行きます。

[ Create delivery streams ] をクリックします。
ALBの場合はWAF (Web ACL)と同じRegion、 CloudFrontで利用するときはRegionを「N. Virginia」(米国東部(バージニア北部))にします。

「Delivery stream name*」を入力します。好きな名前で構いませんが、先頭に「aws-waf-logs-」を付けてください。

「Source*」は「Direct PUT or other sources」を選択します。

[ Next ]をクリックします。

「Transform source records with AWS Lambda」ですが今回はAWS WAFが出力するログをそのままの形でS3に出力させたいので、「Disabled」を選択します。

「Convert record format」もそのままの形でS3に出力させたいので「Disabled」を選択し、[ Next ]をクリックします。

「Destination」は「Amazon S3」を選択します。

ログを出力したいS3 bucket、必要であればPrefixを設定します。Prefixの後に ”/” を入れてください。「Next」をクリックします。

データをバッファするサイズ、時間を決めます。時間は最短で確認ができる60秒をオススメします。

続いてログの圧縮方法ですが、S3の容量を少なくする為「GZIP」にします。暗号化はここではあまり考えず、「Disabled」を選択します。

エラーログはデフォルトで「Enabled」になっているのでそのままにします。

[ Create new or choose ]をクリックします。

遷移したページにて IAMのロールを選択 or 新規作成します。名前は好きな名前で良いです。

[ Allow ]をクリックします。

「IAM role」に先ほど作成した roleが 設定されていることを確認したら、「Next」をクリックします。

最後にレビューが行われるので設定に間違いがないか確認します。

問題なければ[ Create delivery stream ] をクリックします。

作成中です。しばし待ちます。

作成できました。

【Kinesis Firehose を AWS WAF と連携させる】

ここからは先ほど作成した Kinesis Firehose を AWS WAF と連携させます。
これを行うことで今までは3時間前までの一部のログしか取得できなかったリクエストログをS3に保存することができます。

サービスから[ WAF & Shield ]を選択します。

[ Go to AWS WAF ] をクリックします。

サイドバーから[ Web ACLs ]をクリックします。

適用対象の Web ACL をクリックします。

[ Logging ] をクリックします。

[ Enable Logging ] をクリックします。

「Amazon Kinesis Data Firehose」で先ほど作成した Kinesis Firehoseを選択します。「Redacted fields」はログに出力しないフィールドを選択することができます。(例)URI, Query string
設定できましたら、[ Create ] をクリックします。

設定できました。

これでKinesis FirehoseのログをS3に出力できるようになりました。(以下例)

以下がサンプリングとFullログの比較です。

サンプリングで見える部分 フルログで見える部分
Source IP Client IP
URI URI
Matches rule Rule ID ※1
Action Action
Time Timestamp
Country Country
Method httpMethod
Host Host
Content-Length Content-Length
upgrade-insecure-requests upgrade-insecure-requests
user-agent user-agent
accsept accsept
accept-encoding accept-encoding
accept-language accept-language
cookie cookie
format version
Web ACL ID
RuleType
http Source Name
http Source Id
rule Group List
rateBased Rule List
non Terminating Matching Rules
args
HTTP Version
Request ID

※1 この値はルール更新のタイミングで変わります

【まとめ】

今回は下記を行ってみました。

  1. Kinesis Firehose の環境構築 (S3の出力先、形式等の設定)
  2. AWS WAFと連携する

次回は、WafCharmとの連携を行いたいと思います。