🎻

AWS WAFログ分析&レポート生成ツール を公開しました

2023/03/29に公開
4

概要

AWS WAFv2のログ分析を行い、分析レポートを自動生成するツールを公開しました。
このツールを使うと、CLIコマンドを2回実行 するだけで以下のことが可能です。

  • BLOCK/COUNTアクションのログを、CSV形式でローカルに取得
  • ルールグループやIPアドレスなど、各項目の上位Top5を分析
  • グラフや表を描画し、PDF形式のレポートを生成

CloudWatch Logsのログを都度取得するため、ほぼリアルタイムな解析が可能です。
大規模なログは想定していませんが、WAF運用に工数を割けない場合には有用と思われます。
またレポート作成のための追加のAWSリソースが不要なため、運用コストがかかりません。
(個人的にはこの点がとても気に入っています。)

レポート

実際ににどのようなレポートができるのか、先にご紹介します。
まずは時系列のヒストグラムです。ここでサードパーティのWAFを利用していた場合には、下段のヒストグラムでAWSマネージドルールとは別に表示されます。

次に上位Top5の円グラフです。現在の項目は以下ですが、今後増やす予定です。

  1. BLOCK/COUNTしたルールグループ
  2. URI
  3. IPアドレス
  4. カントリーコード

準備

注意事項

  • 現在は、CloudWatchにログ出力しているAWS WAFv2のログにのみ対応しています。
  • Web ACLの仕組みを利用しているサードパーティのWAFであっても、また併用していても分析できます。
  • ログ出力のアクションEXCLUDED_AS_COUNTには対応していません。
  • 生成されたレポートとCloudWatch Logsの結果を見比べて、問題がないか必ずご確認下さい。

インストール

pipでインストールして下さい。必要なライブラリも同時にインストールされるはずです。

pip install accompanist

https://pypi.org/project/accompanist/#description

事前設定

内部的にはAWS CLIでCloudWatch Logs Insightsのクエリを発行し、結果をgetしているため、それらが可能な権限をもつIAMユーザーを使うか、IAMロールにスイッチしておく必要があります。
必要なポリシーは補足としてこのブログの最後に記述しています。参考にして下さい。

そして、Accompanistの設定ファイルを用意しておく必要があります。設定ファイルとは、以下の必要な項目を記載したJSONファイルです。

config.json
{
  "log_group": "aws-waf-logs-xxx-webacl",
  "target_uri": [
    "/path1",
    "/path2"
  ],
  "comment": [
    "- test",
    "-",
    "-",
    "-",
    "-"
  ]
}

これをカレントディレクトリにconfig.jsonというファイル名で保存して下さい。

  • "log_group" : ロググループは文字通り取得する対象のロググループ名を設定します。
  • "target_uri" : ターゲットURIには「ログ中に何回含まれているかをカウントしたいパス」があれば記述します。
  • "comment" : コメントは、レポートの最終ページに任意に文章を付け足すことができるコメントページを予め用意しています。結果を見て気になったことなどを書いてもらえればと思います。(その場合、後述のplayを再実行します)

How to use

1. ログ取得

まず、ログを取得します。

accompanist listen --action BLOCK --days 1
  • --action : アクションには、 COUNT または BLOCK のいずれかを設定します。
  • --days : 現在時刻から遡ってログを取得する期間をしてします。ログの量によりますが最初は1,2日で実行してみるのがおすすめです。
  • --start_time / --end_time : 〇〇日前までと言った期間指定ではなく、開始/終了の日時を直接設定することが可能で、--daysの代わりに --start_time--end_time の両方を指定します。

上記の--start_time--end_time を指定する場合には、以下のようにdateコマンドでunixtimeに変換して指定して下さい。(ここではMacを想定してBSDのdateコマンドの例です)

date -j -f "%Y-%m-%d %H:%M:%S" "2023-01-01 00:00:00" "+%s"

2. レポート生成

クエリが完了したら、最後に取得したログからレポートを自動生成します。

accompanist play

問題なく生成できた場合には、PDFファイルが画面に表示されるはずです。

ここで、オプション--color を指定することで、レポートのメインカラーおよびヘッダー&フッターの色を変更することが出来ます。

accompanist play --color "#1eceeb"

レポートを任意の色にすることで区別しやすくなると思いますので、複数のWAFを運用している場合などにご活用下さい。

仕組み

前半のログ取得はboto3で、後半のレポート生成は主にmatplotlibを使っています。
また、CLIツール化に際してはclickを採用しました。
PyPI登録に際しては、Qiitaの記事を参考にさせていただきました。
(ありがとうございました)

おわりに

今後の開発予定としては、グラフ表示項目を増やす、設定ファイルの自動生成、レポートのカスタマイズ機能などを考えています。もし使っていただいて、何かフィードバックを貰えたら大変嬉しいです。

ところで最後に余談です。このAccompanistというツールの名前ですが、日本語で 「伴奏者」 と言う意味があり、WAF運用において「一緒に伴奏してくれるツール」という意味合いを込めてこの名にしました。
しかし実はもう一つ、『四月は君の嘘』という漫画から着想を得て名付けており、サブコマンドも何となくそれっぽい動詞になっています。(?)
もう10年以上も前に後輩Mから薦めてもらった漫画で、当時は「少女漫画か...?」と読まなかったのですが、最近になって読んだところとても素敵なストーリーでした。(お薦めです)

補足

必要なIAMポリシーについて補足します。
私は専用のIAMロールにインラインポリシーを作って使っています。
(本来はリソースも絞るべきですが、ここでは省略します)
2023/05/18 修正: 以下のように対象のロググループを限定して下さい。

iam-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:StartQuery",
            "Resource": [
                "arn:aws:logs:<region>:<aws-acount>:log-group:<log-group-name>:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "logs:GetQueryResults",
            "Resource": "*"
        }
    ]
}

Discussion

tttttt

コメント失礼します。
今回このサービスを利用したいと考えております。
サイト通りに作業を進め「accompanist listen --action BLOCK --days 1」でログを取得したのち、
「accompanist play」でレポート取得を行おうとしたところ、
「No columns to parse from file」というエラーが表示されました。
ネットで調べながら改善を試みましたが改善されていない状態です。
このエラーに対する改善策を教えていただけないでしょうか。

PrayDPrayD

accompanist playではaccompanist listenでカレントディレクトリに生成したwaf-log.csvを読み込んで処理しており、waf-log.csvの内容が不正、または正しく出力されていない場合にエラーが出ることが考えられます。エディタ等で確認し、それでも正しく出力されているように見える場合には、先頭の2,3行のみ抜粋してwaf-log.csvを作成し直しaccompanist playを試してみて下さい。
また、accompanistのバージョンとpandasのバージョンが最新の状態で実行してみると良いと思います。

tttttt

回答いただきありがとうございます。
AWS CLIからCloudWatch Logs Insightsのクエリを手動で実行したところ、ログを取得することができましたが、accompanistから「accompanist listen --action BLOCK --days 1」でログを取得した際に、
「waf-log.csv」にログが出力されていない状態です。
その際に、見直すべき箇所などがありましたら教えていただけないでしょうか。

PrayDPrayD

詳細わからないため何とも言えないですが、もしIAMロールの権限が問題ないのであれば、ロググループ名の指定が間違っているぐらいですね。あとは考えにくいですが、実はBLOCKアクションでログ出力されていない、直近1日以内でログが出力されていない等でしょうか...