AWS Lambdaを使ってWAFでブロックしたIPアドレスを自動送信させよう

この記事を書いたチーム:chocochip
AWS Lambdaを使ってWAFでブロックしたIPアドレスを自動送信させよう Smallit 技術ブログ

別記事AWS WAFの検知メトリクスをメールやSNSに通知する方法はWAFの検知メトリクスをCloudWatchアラームに通して、メールやSNSに通知する方法について紹介しました。ただし、CloudWatchアラームのメールにはIPアドレスやユーザーエージェントなどのメトリクスの詳細が乗らないため、WAFのコンソール画面から取得しないといけません。そのため、今回はWAF検知の詳細をそのままメールから取得できる方法を紹介します。構成図は以下の通りです。 

Cloudwatch Logsロググループの作成 

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

 まず、WAF検知メトリクスの保管するCloudWatch Logsロググループを作成します。ロググループを作成したら、WAFの「Logging and metrics」からログの保存を有効化します。 

WAFのログを保管するにはロググループ名が「aws-waf-logs-」で始まる必要があります。 

 SES IDの作成 

 次にメールアドレスをAWS SESに登録します。登録後、メールアドレスに送られてくる認証メールから承認すれば、利用可能になります。 

*こちらに登録されたメールアドレスは送信先ではなく、送信元になります。実際の検知メールはここに登録されているメールアドレスから送信されます。 

 S3バケットの作成 

続いて、S3バケットを作成します。設定はすべてデフォルトのままで大丈夫です。バケットを作成し終えたら、ローカルにて「blocked_ip.txt」という空のテキストファイルを作成し、バケットの直下にアップロードします。 

こちらの空ファイルはLambdaの重複送信を防ぐために使われます。このファイルがないと、大量なメールが一気に送信される可能性があります。 

 Lambdaの作成 

上記の作業が全部終わったら、メール送信用のLambdaを作成します。ランタイムはPython3系の最新版を選択します。実行ロールは「基本的なLambdaアクセス権限で新しいを作成」のままでLambdaを作成します。 

 Lambdaが作成されたら、実行ロールに新たなポリシーを付与します。付与するポリシーは「AmazonSESFullAccess」と下記の2つのインラインポリシーです。 

ロールを編集したら、Lambdaの「lambda_function.py」のコードを下記のコードに置き換えます。送信元と送信先のメールアドレスおよびS3バケット名を編集する必要があります。 

 上記の作業が全部終わったら、「設定」からCloudWatch LogsをLambdaのトリガーに追加します。 

今回はすべてのWAFルールにおいて、IPアドレスがブロックされたら、メールが来るようにFilter patternを設定しています。もし特定のルールだけを通知させたいであれば、下記のFilter pattern設定例を参照してください。 

 動作確認 

以上の設定が全部終わったら、動作確認を行ってみましょう。試しにWAFにブロックされてみたら、スクショのようにブロックされたIPアドレスやユーザーエージェントなどの情報が記載されているメールが届きました。これで再びWAFのコンソール画面に入って情報を取得する必要がなくなりました。皆さんもこの方法を使って、面倒な作業を無くしてみませんか。 

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス