AWS WAFを使って簡単にDoS攻撃を防いでみよう【セキュリティ対策】

AWS, WAF, セキュリティ

AWS WAFで簡単にDoS攻撃を防いでみよう

DoS攻撃流行ってますね。もぐら叩きになりがちなDoS攻撃対応ですが、IPアドレスでのブロックだけなら、AWS WAFに実装された [rate-based limit] を使って割とお手軽に対応が出来そうです。

という事で、ちょっと試してみました。

今回の環境

こんな感じで簡単に構築。

AWS WAF環境例

EC2はそれぞれBaseAMIから作成。
攻撃は単純にApacheBenchで代用してみます。
ですので、攻撃元・攻撃先それぞれにapacheを入れておきます。

攻撃先には上流にALBを設定しておきます。
ALBでないとAWS WAFを活用出来ないので、ここは必須です。
CloudFrontを被せる手もありますが、今回はお手軽にこっち。

AWS WAF を設定する

  • まずruleを作ります
     AWS WAF & Shield のダッシュボードから、[Rules] > [Create rule]
     
    AWS WAF ルール作成

できました。

AWS WAF ルール作成完了

閾値(Rate limit)は、一旦最低値の2,000にしておきます。
この値は、5min間にこの値のリクエストが来た場合、自動でブロックしてくれます。
※逆に言うとこの閾値以下は全部許可

  • 次にweb ACLを作ります
     AWS WAF & Shield のダッシュボードから、[Web ACLs] > [Create web ACL]

AWS WAF ACL設定

画面に従ってリソース指定していきます。

AWS WAF ACL設定完了

できました。

  • 作成したweb ACLに、作成したruleを紐づけます
     作成した web ACL を指定して Edit

AWS WAF ルール紐づけ

ルールにマッチしたときに、リクエストをブロックします。
※何もマッチしない時は全リクエスト許可です

AWS WAF 紐づけ完了

できました。

  • 通知用CloudWatchアラームを作ります
    AWS WAFの設定が済むと、メトリクスが見つかるはずです。
    ただこのままでは攻撃を受けている時にしか通知が来ないので、攻撃予兆を見られるように準備しておきます。

    さっきまでの手順と同じように、rate-basedのruleを作っておきます。

AWS WAF Cloudwatchルール

同じく web ACL に紐づけますが、今度は Action を Count として、Blockより上位のOrderに設定します。

AWS WAF Cloudwatchルール設定

AWS WAF Cloudwatch設定完了

できました。

これをベースに、CloudWatchアラームを設定します。
今回は一回でも引っかかったらアラートメールが飛ぶようにしておきます。

AWS WAF アラーム設定

できました。

ちなみに、欠落データの処理方法は、初期値の[見つかりません(missing)]のままだと、攻撃を検知していない間ずっと「データ不足」になってしまって気持ち悪いので、[適正(good)]にしておきます。

攻撃してみる

準備が整ったので、実際にどんな感じになるか試してみます。
シナリオとしては、攻撃元からApacheBenchで3,000リクエストを投げて、EC2からはアクセスが出来なくなり、
オフィスからのアクセスは何もない、という事を確認します。

  • 攻撃前の、攻撃元EC2ホストのログ

Let’s Attack!!

攻撃された方は……と

するとものの数分で……。
攻撃元からは

403返されてますね。

一方そのころ攻撃された側のアクセスログは……。

オフィスからはアクセス出来ましたが、攻撃元からは403に見えているタイミングではアクセスが来ていません。

AWS WAF側で見ても、ブロック対象になっているのが確認出来ます。

AWS WAF block状況

仕込んでいたCloudWatchアラームも飛んでくれました。

AWS WAF cloudwatch状況

まとめ

DDoS攻撃と違って、攻撃元IPアドレスがコロコロ変わるDoS攻撃の場合、都度都度対応が必要になってしまうため、対応工数がどうしても跳ね上ってしまいます。
今回検証したAWS WAFの rate-based limit を使うと、このタイプの攻撃に関しては自動で防いでくれます。

閾値の設定はちょっと悩むところではありますが、快適なホスト運用ライフのために検討頂ければ。

注意

今回リクエスト数が多いテストを行いましたが、AWS環境へ負荷をかける場合はちゃんと一報入れてからやりましょう。

この記事を書いた人

野村昌男
野村昌男

ネットワークとセキュリティメインでやっています。
L4/L3以下が好きです。