WafCharm レポート機能の構築方法

10月 7, 2020AWS,AWS WAF,WafCharm,セキュリティ関連

概要

  • 前回は、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を記載しております。

レポート機能/通知機能 利用マニュアル WAFv2用

 

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 の通知機能を構築する場合は、下記記事でご紹介する構築とテスト方法を参照ください。