AWS WAFのLogを保存するKinesis FirehoseをCloudFormationでさくっと作ってみた

2019.11.19

AWS事業本部の梶原@新福岡オフィスです。

指定のURLに対して、IP制限を実施するCloudFront用のWAF設定をCloudFormationでさくっと作ってみた

で特定のIPアドレス制限をいれたらちゃんと制御されているかログ取りたくなってきたので WAFのログはS3のバケットを指定だと思ってたら、Kinesis Firehoseのデリバリーストリームを指定でした。 Kinesisi Firehoseを普段から触ってればなんともないと思うのですが、やっぱりS3にさくっと保存したかったので、 Kinesisi FirehoseからS3に保存するCloudFormationテンプレートを作ったので共有します。

では、サクサクいきます。

作成するリソース

  • S3 バケット
  • Kinesis Firehose データストリーム
  • aws-waf-logs-スタック名で作成されます
  • CloudWatch Logs ストリーム(Kinesis Firehoseのログ用)
  • CloudWatch Logs ロググループ(Kinesis Firehoseのログ用)
  • IAM Role(Kinesis Firehose用)

上記のリソースを作成します。いくつかのパラメータは入力パラメータで指定できるようにしています。

CloudFormationの実行

CloudFormationスタックの作成

いつものようにテンプレートはS3においてますので、AWSにログイン後、下記ボタンをポチっとするとCloudFomationのスタック画面に遷移しますので、内容を確認後、スタックの作成をしてください

CludFront用のWAFに、設定する場合はKinesis firehoseは米国東部 (バージニア北部)に作成する必要がありますので、事前にリージョンを切替てCloudFormationのスタックを作成してください

ALB用のWAFの場合は対象のリージョンで実施してください、S3も同リージョンに作成されます。

CloudFront用(バージニア北部リージョン)クイック作成リンク

https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/quickcreate?templateUrl=https://pub-devio-blog-vtuisp2o.s3.amazonaws.com/template/cfn-kinesisfirehose-waflog.yml&stackName=kinesisfirehose-for-waflog

ALB用(東京リージョン)クイック作成リンク

https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?templateUrl=https://pub-devio-blog-vtuisp2o.s3.amazonaws.com/template/cfn-kinesisfirehose-waflog.yml&stackName=kinesisfirehose-for-waflog

入力パラメータ

Kinesis Firehose

CloudFormationで Kinesis Firehoseの作成時のパラメータを設定します。

  • SizeInMBs
  • Kinesis Data Firehose が受信データを送信先に送信する前に受信データに対して使用するバッファサイズ (MB)を指定します。
  • IntervalInSeconds
  • Kinesis Data Firehose が送信先にデータを送信する前に受信データをバッファする時間 (秒)を指定します。
  • CompressionFormat:
  • Amazon S3 バケットに配信されるデータを圧縮するために Kinesis Data Firehose で使用する圧縮タイプを指定します。
  • GZIP, Snappy, UNCOMPRESSED, ZIP から選択してください

詳細情報 AWS ドキュメント » AWS CloudFormation » ユーザーガイド » テンプレートリファレンス » AWS リソースおよびプロパティタイプのリファレンス » Amazon Kinesis Data Firehose リソースタイプのリファレンス » AWS::KinesisFirehose::DeliveryStream » AWS::KinesisFirehose::DeliveryStream S3DestinationConfiguration

S3

  • BucketName
  • ログが保存されるバケット名を指定します。
  • ExpirationInDays
  • ライフライクルルールで削除する日数を指定します。

作成されたリソースの確認

スタックを作成したリージョンにて、Kinesis Firehose delivery streamsが作成されているか確認します。

AWS コンソール https://console.aws.amazon.com/firehose/home?region=us-east-1#/dashboard/list

作成されたKinesis Firehose delivery streamsにWAFのログを出力する

WAF のAWS コンソールから出力したいWAFに対して、Kinesisis Firehoseのデリバリーストリームを指定します。

今回作成したテンプレートではaws-waf-logs-スタック名で作成されます

WAFのログ出力設定

Kinesisis Firehoseのデリバリーストリームを指定

確認

S3へのログ出力の確認

WAFのログ出力設定を実施したら、実際にログが出力されているか確認します。 詳細なログフォーマットは以下をご参照ください

ウェブ ACL トラフィック情報のログ記録

まとめ

WAFのログを取ろうと思ったときにあれ?S3のバケット指定じゃないの?と思ったんですが、これで次回からはサクッとバケット指定できるかと思います。 保存のパラメータなども入力パラメータ化などしてますので、ご自由にお使いください。

テンプレート

参考情報

AWS ドキュメント » AWS WAF » 開発者ガイド » AWS WAF » ウェブ ACL トラフィック情報のログ記録 ウェブ ACL トラフィック情報のログ記録 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging.html

AWS ドキュメント » AWS CloudFormation » ユーザーガイド » テンプレートリファレンス » AWS リソースおよびプロパティタイプのリファレンス » Amazon Kinesis Data Firehose リソースタイプのリファレンス » AWS::KinesisFirehose::DeliveryStream » AWS::KinesisFirehose::DeliveryStream S3DestinationConfiguration https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html