AWS WAF にて悪質なアクセスからサービスを守る

AWS WAF を使えばスクレイピングやボット、DDoSなどの悪質なアクセスを事前に防ぐことができる。
が、100%防ぐことは多分できない。

けど、簡単設定で効果が大分良い感じに出たので、
導入マストかもしれない。

使用する主な AWS アプリケーション

  • AWS ALB(ELB)
  • AWS WAF

EC2 に対して直接 WAF を割り当てることはできないらしく、
AWS ALB を導入する必要がある。

Cloudfront にも割り当てれるらしいけど、今回は関係ないのでスルー。

WAF とは

WAF(Web Application Firewall)は、WebサイトやAPIへの通信を監視・解析し、脆弱性を突くサイバー攻撃を検知・ブロックするセキュリティ対策です。
個人情報やクレジットカード情報を扱うWebアプリケーションを、SQLインジェクションやクロスサイトスクリプティング(XSS)などから保護します。

とのこと。

コストやルール等を確認していると出てくる WCU とは

ざっと読んだ感じ、一つの保護パックにおける最大 WCU は 5000WCU。
基本料金内で抑えるには WCU を1500WCU以内にする必要がある。
で、この1500WCUを超えると追加料金が発生する。

という感じ。
WCU はルール毎に値が決められていて、
カスタムルールは条件を追加する度に WCU が加算されていく。

なので、全てのルールを詰め込むとか、雑に条件を追加していくと、
コストが増えるので注意。

まずは AWS が提供してるデフォルト設定を用意する

  • 「AWS WAF」→「保護パック (ウェブ ACL)」→「保護パック (ウェブ ACL) を作成」クリック
    • アプリについて教えてください
      • アプリカテゴリ: 適当(一旦「コンテンツおよび公開システム」選択)
      • アプリケーションフォーカス: 適当(一旦「API とウェブの両方」選択)
    • 保護するリソースを選択
      • 「リソースを追加」→「リージョンリソースを追加」クリック
        • 割り当てたい ALB を選択
    • 初期の保護を選択
      • 「重要」を選択
    • 名前を付けて、説明を入力
      • 名前: 適当
    • 保護パック (ウェブ ACL) をカスタマイズ
      • デフォルトのルールアクション: Count アクションと Block アクションに推奨のデフォルトを使用する
    • 「保護パック (ウェブ ACL) を作成」クリック

カスタマイズしていく

このままだとけっこう強力で、
普通のユーザーもアクセス拒否されたりするので、
ルールをゆるくする。

  • 「AWS WAF」→「保護パック (ウェブ ACL)」→ 作成した保護パックを選択 →「ルールを管理」クリック

初期の保護を「重要」にした場合、良い感じのルールが入ってるので、
それを見直していく。

自分の環境では下記ルールがセットされていた。

  • xxxxx_IPV4_Allow
  • xxxxx_IPV6_Allow
  • AWS-AWSManagedRulesAntiDDoSRuleSet
  • AWS-AWSManagedRulesCommonRuleSet
  • AWS-AWSManagedRulesSQLiRuleSet
  • AWS-AWSManagedRulesAdminProtectionRuleSet
  • BodySizeRestrictionRule
  • GeoRule
  • GlobalRateBasedRule

AWS-AWSManagedRulesCommonRuleSet

サービスによっては Block から Count に変更してもいいかも。

  • SizeRestrictions_BODY

AWS-AWSManagedRulesAdminProtectionRuleSet

ここもサービスによっては Block から Count に変更してもいいかも。

  • AdminProtection_URIPATH

ルールを追加、変更する

ルールの優先度を変える

基本的に Allow 系のルールは優先度高めにして、
後は母数の大きそうなものから優先度高くする感じになると思う。

  • 「AWS WAF」→「保護パック (ウェブ ACL)」→ 作成した保護パックを選択 →「ルールを管理」クリック
    • 「ルール順序を編集」クリック
    • リストの上部が優先度高いらしいので、追加したルールを上の方へドラッグする
    • 「ルール順序を保存」クリック

検知されると

Block 対象者は403エラーが返ってくる。
Count はログに残るだけでユーザーには何も影響がない。
Allow これは無条件で通すので注意。