【概要】
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 この値はルール更新のタイミングで変わります
【まとめ】
今回は下記を行ってみました。
- Kinesis Firehose の環境構築 (S3の出力先、形式等の設定)
- AWS WAFと連携する
次回は、WafCharmとの連携を行いたいと思います。

