WafCharm レポート機能の構築方法
Contents
概要
- 前回は、AWS WAF + WafCharm をトライアルで導入する方法を手順にまとめました。今回はWafCharm のレポート機能を追加構築して、月次レポートを閲覧できるようにしたいと思います。
- AWS WAF + WafCharmの構築については、下記記事を参照ください。
AWS WAF / WafCharmの構成図
- AWS WAF および WafCharm、WafCharmレポート機能/通知機能の構成図を書いてみました。なお、通知機能の構築とテストについては、次の記事でご紹介したいと思います。
- 下記に簡単な処理の流れを記載します。①~③は前回の記事で手順を説明しています。今回の記事でご紹介する範囲は、④~⑧となります。
- ①AWS WAFと連携するCloudFront (あるいはALB) のアクセスログがS3 バケットに格納されます。
- ②WafCharmはCloudFront (あるいはALB) のアクセスログを取得します。(WafCharm設定時にS3 バケットを参照するためのアクセスキーを登録する)
- ③WafCharmはCloudFront (あるいはALB) のアクセスログを元に判定したルールをWeb ACLに配信します。(WafCharm設定時にWeb ACLを更新するためのアクセスキーを登録する)
- ④Kinesis Data Firehoseを作成し、AWS WAFと連携、WAFのLoggingを有効にします。
- ⑤Kinesis Data Firehoseから出力されたWAFログがS3 バケットに格納されます。
- ⑥S3 バケットのオブジェクト作成をトリガにWafCharm連携Lambdaが起動します。
- ⑦WafCharm連携LambdaがWAFログをWafCharm側に転送します。(Lambdaには必要なロールを付与します)
- ⑧管理者から月次レポートが閲覧可能となります。
- ⑨検知があった場合に、WafCharmからメール通知されます。
WafCharm レポート機能の構築方法
構築マニュアルについて
- 今回の構築は、WafCharmの公式マニュアルである「レポート機能/通知機能 利用マニュアル new AWS WAF Ver 1.0」を参考にして、構築を進めます。必要に応じて、最新の公式マニュアルを参照ください。
- 私がハマった部分として、マニュアルには新旧があるということ。新旧の相違は、マニュアルに記載のコードがWAF v1(classic)用からWAF v2(new)用に変わっていることです。なお、本記事には、WAF v2(new)用のコードのURLを記載しております。
Kinesis Data Firehoseの作成
- Kinesis Data Firehoseを作成し、AWS WAFと連携、WAFログをS3 バケットに送ります。
- 先ず、Kinesisのコンソールを開き、Data Firehoseの [配信ストリームを作成] を押します。ここでポイントは、Web ACLに設定したリソースと同じリージョンを選択してData Firehoseのリソースを作成することです。今回はCloudFrontのため、バージニア北部にリソースを作成します。
- Delivery stream nameに配信ストリームの名前を入力します。配信ストリームの名前は、aws-waf-logs-<任意の名前>とします。(左記の規則は公式マニュアルより)
- Sourceに「Direct PUT or other sources」を選択します。
- Data transformation、Record format conversionは、「Disabled」を選択します。
- Destinationに「Amazon S3」を選択し、S3のバケット名とprefix(例:waflog/)を指定します。
- Configure settings に、下記設定を行います。
- Buffer size: 5 MiB
- Buffer interval: 60 seconds
- S3 compression: GZIP
- S3 encryption: Disabled
- IAMロールを設定します。
- 設定内容をレビューし、問題なければ [Create delivery stream] を押します。
- 1分程待つと、リソースの作成が完了します。
- 次はAWS WAF のコンソールに移り、Web ACL の設定を開きます。
※なお、CloudFront のリソースに関連付けたWeb ACLを確認する際、Regionに"US East (N. Virginia)"ではなく、"Global (CloudFront)" を選択し直します。 - Logging and metricsタブを開き、[Enable logging] を押します。
- 下記画面が表示されます。Data Firehoseの配信ストリームを選択し、[Enable logging] を押します。
- もし、配信ストリームの名前が aws-waf-logs-<任意の名前> と異なる場合は、下記の選択肢にリソースが表示されず、「No delivery streams」となります。
- 下記画面の通り、AWS WAFとData Firehoseが連携し、WAFのLoggingが有効に変わりました。
- Data FirehoseのDestinationに設定したS3 バケットにログが出力されました。
Lambda用のIAMロール作成
- WafCharm連携Lambdaに割り当てるIAMロールを作成します。ロール名(例:wafcharm-waflog)を指定し、ロールの説明は任意で入力します。
- ロールには、下記ポリシーをアタッチします。
- AWSLambdaExecute(AWS管理ポリシー)
- policy-wafcharm-waflog-s3-read(管理ポリシー)
- policy-wafcharm-waflog-s3-put(管理ポリシー)
- policy-wafcharm-waflog-s3-read に指定するJSONは下記となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/waflog/*"
}
]
}
- policy-wafcharm-waflog-s3-put に指定するJSONは下記となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::wafcharm.com/*"
}
]
}
WafCharm連携Lambdaの作成
- 次はWafCharm連携Lambdaを作成します。Lambdaのリージョンは、Data FirehoseのDestinationに設定したS3 のバケットと同じリージョンとします。
- 関数名(例:niikawa-wafcharm-waflog)を指定し、ランタイムにNode.js 10.x 以上(画像はNode.js 12.x ですが、最新を選択) を選択します。
- 既存のロールに前述の手順にて作成したロール(例:wafcharm-waflog)を指定します。
- タイムアウトは 1分 に設定します。
- 関数コードを追加します。コードは、WafCharmの公式マニュアルに記載されている下記URL より入手します。
http://docs.wafcharm.com/manual/new_aws_waf/index.js
- トリガーを追加します。トリガーにS3、バケットおよびプレフィックスにData FirehoseのDestinationに設定したS3 のバケット名、プレフィックスを指定します。
- トリガーの有効化をチェックし、[追加]ボタンを押します。
- Lambdaにトリガーが設定されました。[保存]ボタンを押し、Lambdaの設定を完了します。
- しばらく待ち、CloudWatch LogsにてLambda関数のログを確認します。無事に動作している様です。
ログのライフサイクル
- WafCharm の公式マニュアルにも記載されていますが、必要に応じて、S3, CloudWatch Logs のライフサイクルを設定し、不必要なログの定期削除を行いましょう。
- S3 に格納されたログのライフサイクルは、下記記事を参照ください。
- CloudWatch Logs に作成されたログの定期削除は、下記記事を参照ください。
月次レポートの確認
- WafCharm管理画面より「Report」をクリックし、月次レポートを確認します。残念ながらレポート機能を設定した当月内は、レポートが閲覧できません。来月、再度確認する様にします。
- 翌月になると、下記の月次レ
ポートデータが公開されました。
通知機能の構築について
- 今回ご紹介した構築に続き、WafCharm の通知機能を構築する場合は、下記記事でご紹介する構築とテスト方法を参照ください。