はじめに
既存の構成にAWS WAFを追加してIP制限を実施しました。WAFはCloudFrontやALBと組み合わせて使われることも多いと思いますが、今回はAPI Gatewayの前段に配置する構成を試してみました。
以下の赤枠の部分です。

その他の構築については、以下の記事などで記載しているのでもし興味があればどうぞ。↓
以下の順序でWAFを作成していきます。
- IP Setの作成
- WEB ACLの作成
IP Setsの作成
今回はIPリストを作成しホワイトリスト方式でIPアクセス制限を実施する検証をしました。手順2のWEB ACLの作成画面にて対象のIPリストを選択するステップがあるため、先にIP Setを作成しておく必要があります。
WAFのコンソール画面からIP Setsを選択し、以下のように簡単にIPリストを作成できます。

(※上図では文字xを使っているため赤文字エラーが出ています。実際のIPを入力すればエラーは消えます)
Web ACLの作成
AWS WAF >> Web ACLsからWeb ACSを作成していきます。Associated AWS resourcesから対象のAPIを指定します。

次の設定ページではAdd my own rules and rule groupsを選択し、Rule typeをIP Setとします。先ほど作成したIP Setを選択し、今回はホワイトリスト形式のIP制限を実施したいのでActionにAllowを選択します。

ルールの追加が完了したらデフォルトのACLアクションとしてBlockを選択します。これでホワイトリストに登録されていないIPからのリクエストはブロックされます。

今回適用しているルールは今作成した1つのみなので、優先順位はそのままNextをクリックします。

CloudWatchメトリクスの名前を設定します。リクエストのサンプリングもそのままONとします。

これで設定項目は以上です。最後にReviewしてCreateすれば約1分ほどでWAF(Web ACS)が適用されます。早い!!
動作確認
まずはIP Setに登録したホワイトリストに含まれるIPからリクエストを実施します。

無事にリクエストがAPI Gatewayまで届いています。
次にホワイトリストに含まれないIPからリクエストを実施します。

ステータス403のForbiddenが返ってきました。先ほど作成したWAFによってリクエストがブロックされていることが確認できました。ちなみのこのステータスコードやメッセージの中身はカスタマイズすることも可能です。
終わりに
WAFの構築がものすごく早く完了したことにまず驚きました。またバックエンドの仕組みをAWSサービスで構築している場合はネイティブに統合できるのもやはり便利です。
今回は簡単なIP制限を実施したのみでしたが、特定のHeaderにセットされる文字列を検知するようなルールを作成したり、もしくはAWSが用意しているマネージドルールでBot攻撃やマルアクセスを検知するようなルールを追加することも可能です。
サービス利用が拡大するとそれだけアクセス回数や攻撃対象となるリスクも増える可能性が高くなると思うでの、このように簡単にセットアップできるWAFをうまく活用して少しでもセキュアなWebサービスを構築していきたいです。
参考記事