WAF LOG Athena
AWSのWAFのlog機能とAthenaを使って分析しようとした件
結果から言うとまだ分析してなにかを達成したわけではないですが…
とりあえずWAFで何をブロックしてるのかを調査する為の方法を紹介したいと思って書きます。
WAFのlog機能(+Kinesis )
まずはWAFのlog機能設定です。簡単な手順で言うと以下の通りです。
詳細は参考のサイトを見ていただければできると思います。
①AWS WAFのログ出力先となる Amazon Kinesis Data Firehoseと、ログ保管場所として利用するS3バケットの設置
②WAFに①で設置したKinesis Data Firehoseを設定
参考:
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging.html
https://dev.classmethod.jp/cloud/aws/awf-waf-comprehensive-logging/
上記の作業をするとS3バケットに指定した時間毎にアクセスがあれば出力されます。
これでも何か発生した際にはその時間のログを確認すれば調査は可能なのですが、
ウェブに関しては大量のアクセスがあったりするので大量のログを一つ一つ見ていくのは時間もコストもかかってしまうと思います。
そこで下記のサービスを使用することで解決できます。
Athena
Amazon Athena
実行するクエリに対してのみ料金が発生します。各クエリでスキャンされるデータ量に基づいて課金されます。データの圧縮、分割、列形式への変換を行うと、大幅なコスト削減とパフォーマンス向上を実現できます。このようなオペレーションにより、Athena でクエリを実行するためにスキャンする必要のあるデータ量が減少するためです。
参照:
S3に出力したWAFのlogをAthena 使用して分析
簡単なイメージ的にはS3のlogのデータをテーブルにして①、
テーブルにしたデータから分析したいデータを検索(SELECT)する②。
検索した結果をCSVで吐き出せます。
①以下のクエリを実行
CREATE EXTERNAL TABLE IF NOT EXISTS Database名.作成したいテーブル名 (
`timestamp` timestamp,
`webaclId` string,
`terminatingRuleId` string,
`terminatingRuleType` string,
`action` string,
`httpRequest` struct<
`clientIp`:string,
`country`:string,
`uri`:string,
`httpVersion`:string,
`httpMethod`:string,
`headers`:array < struct >,
`requestId`:string
>,
`HostHeader` string
)
ROW FORMAT SERDE ‘org.openx.data.jsonserde.JsonSerDe’
LOCATION ‘s3://バケット名/参照したいディレクトリ/’;
Database名は何も作ってなければ”default”になっていると思います。
参照したいディレクトリは上記を参照してlogをS3にあげてるとしたら2019/9のログを分析するなら”2019/09″になると思います。
②は①で作ったファイルを検索なのでブロックされたログだけを抽出する場合は以下のクエリを実行
このようなカタチで月毎WAFの調査が行えると思います。
もし参考になれば嬉しいです。
最後に
さいきんインフラ系のブログが多いですねw