share facebook facebook facebook twitter twitter menu hatena pocket slack

2020.09.14 MON

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

新川 貴章

WRITTEN BY 新川 貴章

概要

  • 前回は、AWS WAF + WafCharm をトライアルで導入する方法を手順にまとめました。今回はWafCharm のレポート機能を追加構築して、月次レポートを閲覧できるようにしたいと思います。
  • AWS WAF + WafCharmの構築については、下記記事を参照ください。
概要はじめに 今回は、AWS WAF + WafCharm をトライアルで導入する方法を手順にまとめました。なお、WafCharm の契約プランには、30日間まで無償で試せる"トライアル"、有償の"エントリー"、"ビジネス"、"エンタープライズ"...

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 に格納されたログのライフサイクルは、下記記事を参照ください。
S3にライフサイクルによる移行・有効期限アクションを設定する方法 今回は、S3のライフサイクル管理について、失効と完全削除の理解が不明瞭であったため確認した結果をまとめてみました。 概要ライフサイクル管理の概要Amazon S3はライフサイクル管理を活用すること...
  • CloudWatch Logs に作成されたログの定期削除は、下記記事を参照ください。
CloudWatch LogsのイベントをS3にエクスポートしたい CloudWatch Logsは従量課金制CloudWatch Logsは初期費用や最低利用料金はかかりませんが、支払いは従量課金制です。東京リージョンの場合、以下の費用が掛かります(2019/7/10現在)。収集 (データの取り込...

月次レポートの確認

  • WafCharm管理画面より「Report」をクリックし、月次レポートを確認します。残念ながらレポート機能を設定した当月内は、レポートが閲覧できません。来月、再度確認する様にします。

通知機能の構築について

  • 今回ご紹介した構築に続き、WafCharm の通知機能を構築する場合は、下記記事でご紹介する構築とテスト方法を参照ください。
概要 前回までは、AWS WAF + WafCharm をトライアルで導入する方法と、WafCharm レポート機能の構築方法を手順にまとめました。今回はWafCharm の通知機能を追加設定して、テスト用に投げたリクエストがブロックされること、正しくメール通知がされることまでを確認...

元記事はこちら

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

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。