AWS WAFのログをFirehoseでS3に出力, 保存する

WAFのログはサンプルとしてしか取れませんでしたが、完全なログを取得できるようになったので、ログをS3に出力し保存する方法をまとめます。

AWS WAFの導入や設定などはこちら

EC2 のWebサーバーへ CloudFront 経由で AWS WAF を導入
AWS WAFのルールを設定してみる
AWS WAFにWordPress用のルールを設定してみる

やることはこちら

  • Kinesis Firehose設定
  • WAFの設定
  • S3ログの確認
  • Monitoringの確認

事前に必要なもの

  • ELBやCloudFrontなどのWAFを適用できるもの
  • AWS WAF(Web ACLs)
  • 上記2つが紐付いている環境(ELBやCloudFrontにアクセスしてWebサイトにアクセスできる)


Kinesis Firehose設定

※注意

  • CloudFrontにAWS WAFを設定し、FirehoseでS3にログを出力する場合は、FirehoseとAWS WAFのリージョンを同じにする必要があります。
  • AWS WAFをGlobalで使っている場合は、FirehoseにGlobalは存在しませんが、バージニアを選択すると設定することができます。

AWS WAFのログ出力先は Amazon Kinesis Data Firehose、保存場所はS3になります。

作成する Amazon Kinesis リソースは配信ストリームです。

※Kinesis Firehoseのストリーム名は「aws-waf-logs-」で開始する必要があります。

以下のように設定し、次へ

データ加工はそのままで、次へ

次にログを保存するS3バケットを選択、もしくは作成します。

適時作成し、次へ

バッファサイズやバッファ間隔は適時変更し、料金を下げるためにGZIPにする。

バッファーはデータサイズと時間、どちらかの値に達した時点でS3に保存されます。

今回はどちらも小さくしました。

IAMは新規で作成をクリックすると必要な権限が付与されたIAMが作成されます。

設定事項を確認し、[Create delivery Stream]をクリックして作成


WAFの設定

[Web ACLs] > [Logging] > [Enable Logging] と進む

先程作成したFirehoseを設定し作成します。

作成したFirehoseが出てこない場合は、「リージョンが違う」か「aws-waf-logsと先頭に付いていない」のどちらかだと思います。

このようにLoggingに追加されていれば完了です。


S3ログの確認

Firehoseで設定したバケットに日付毎に保存されてます。

また、設定したデータサイズと時間、どちらかの値に達した時点でS3に保存されているので、調整することでファイルの数を減らしたり、細かく保存したりとできます。

{
    "timestamp": 1538109445535,
    "formatVersion": 1,
    "webaclId": "a3cc1665-05df-4b72-8dd0-e572025307ae",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
...
        "uri": "/test.txt",
        "args": "id=1",
        "httpVersion": "HTTP/1.1",
        "httpMethod": "GET",
        "requestId": "VT30yZ2MYW-bVQyEVmKuvuaLZGRSHe4ml8q-LsNJK1uUriEmKQvb1A=="
    }
}


Monitoringの確認

[Kinesis Firehose] > [Data Firehose] > [Monitoring] でFirehoseのログ出力のモニタリングができます。

リージョン毎で異なりますが、Firehoseの配信ストリームは、1000レコード/s、1000トランザクション/s、1MiB/sの上限が設定されているので、上限に達してしまう場合はAWSサポートへの上限緩和申請をしたほうがいいです。