AWS WAFの検知内容をAmazon SNSで通知するBy kaneko tomo / 2019年12月25日 はじめに AWS WAFで、Amazonのマネージドルールが利用できるようになりました。 AWSManagedRulesCommonRuleSetとかかなりいいよ! WAFを導入しただけでは、攻撃をきちんと検知しているかわからず、場合によっては正常なアクセスを誤検知によりブロックしてしまっている可能性があります。 そこで、WAFコンソール(直近3時間)もしくはCloudWatchでモニタリングする方法は用意されているのですが、いちいち情報を見に行くのがめんどくさいので、内容を通知するように設定してみました。 AWSのサービスのみで、AWS WAF, Kinesis, S3, Lambdaを利用しています。 こんな感じになります AWS WAFの設定 ロギング設定を有効化します。 S3の設定 バケットを作ります。バケット名をaws-waf-logs-で始める必要があります。 今回は、aws-waf-logs-corporate-s3 としました(-s3は冗長だった) Kinesisの設定 Kinesisを設定して、WAFのログがS3に格納されるようにします。Kinesisの種類を選択する必要がありますが、「Kinesis Firehose 配信ストリーム」を選択します。 宛先をS3の先ほど作成したバケットとし、容量削減のためにgzip圧縮ありを選択。直近のブロックログはAWS WAF側の設定画面で確認できるため、バッファ時間は最大の900秒としました。 ログきました Lambdaの設定 さて、ここまででWAFのログがS3に格納されるようになったので、s3 selectもしくはAthenaを利用してログの内容は確認できるようになりました。 さらに、Lambdaでブロックログをメール送信するように設定してみます。 コードはgistに置きました S3に格納されたAWS WAFログをSNSで通知する(Lambda, Node.js) また、トリガーにS3のObjectCreatedByPutを指定しました。 このままではS3の読み取りとSNSへの通知ができないため、権限を設定します。 Lambdaの設定→アクセス権限→実行ロールにロールが設定されるので、クリックしてIAM画面を表示します。 以下2つのポリシーを付与します ・AmazonS3ReadOnlyAccess ・AmazonSNSFullAccess 結果 以上で、ブロックログが通知されるようになりました。 課題 ・Kinesisのバッファが最大900秒なので、15分に1回通知がくる。もっと長くしたい。 ・通知が多すぎて見なくなる問題。ポートスキャナーとかAWS Security Scannerとか既知のUAは通知しないようにしたほうがいいかも。 ・Node.jsにバグがあったらそもそも通知がこないという不安との戦い