アプリ開発チームから、WAF を使ったアクセス制限について相談を受けました。
質問内容
AWS WAF で以下のようなアクセス制限は可能でしょうか?
-
特定の「存在しない URL」へのアクセスを、アクセスレートに応じてブロックしたい (例:
.envなど非公開ファイルへの執拗なアクセス) -
特定の「存在する URL」へのアクセスを、アクセスレートに応じてブロックしたい (例:管理者ログインページへのブルートフォース的なアクセス)
調べてみた結果
結論から言うと、(1)(2)ともに AWS WAF で制御可能でした。
ポイントは以下の 2 つの機能を組み合わせることです。
- Rate-based rule(レートベースルール)
- URI パスのパターンマッチ(正規表現など)
(1) 存在しない URL へのアクセスをレートに応じてブロック
例えば以下のような、本来アクセスされることがない URL:
/.env/wp-admin
これらに対しては、
-
正規表現マッチ条件で対象パスを検出 例:
^/\.env$ ^/wp-admin -
Rate-based rule を適用し、一定時間内のアクセス回数が閾値を超えた場合にブロック
といった構成にすることで、たとえサーバー側で 404 や 302 を返していたとしても、 一定以上のリクエストを送ってくるクライアントを WAF レベルで遮断できます。
(2) 存在する URL へのアクセスをレートに応じてブロック
例えば以下のような URL:
/admin/login/wp-login.php
こちらもやり方は同様で、
- URI パスに対して正規表現マッチ条件を設定
- Rate-based rule を適用
することで、一定時間内のアクセス回数が閾値を超えた場合にブロック可能です。
補足メモ
AWS WAF のルール判定は、
- URI パス
- ヘッダ
- クエリ文字列
といった「リクエスト内容」を元に行われます。
つまり、
「存在する URL」か「存在しない URL」か
という違いは WAF にとっては区別がありません。
WAF はレスポンス(200 / 404 / 302 など)を見ないため、 どちらの場合も「対象 URL パターンを指定した Rate-based rule」で 同じ方法で制御することになります。
運用上の違い(閾値設定)
設定方法は同じですが、運用上の考え方は変わります。
| 対象URL | 運用方針 |
|---|---|
/.env など |
本来アクセスされない → 閾値を低めに設定しても誤検知のリスクは低い |
/admin/login など |
正常利用がある → 閾値を高めに設定、IP許可リスト併用が望ましい |
管理者ログインページのような URL に対しては、
- 自社オフィス
- VPN
- 固定IP
などを IP許可リスト(Allow rule) として先に定義しておくのが安全です。
注意点
AWS WAF 単体では、
レスポンスコード(404 や 302)を条件に制御することはできません。
そのため、 「404 が一定回数続いたらブロック」といった制御を行いたい場合には、
- ALB アクセスログ
- CloudFront ログ
- Lambda@Edge 等のカスタム処理
との組み合わせが必要になります。
AWS WAF の料金メモ(2026年2月時点)
東京リージョンの場合:
- Web ACL:$5.00 / 月
- カスタムルール:$1.00 / ルール / 月
- リクエスト処理料金:$0.60 / 100万リクエスト
今回のように、
URI Path にマッチする Rate-based rule を追加する
というケースは、 単純に「カスタムルールが 1 つ増える」扱いになります。
つまり、
- ルール追加分:+$1.00 / 月
のみが固定的に増加します。
リクエスト単価自体は変わらないため、 URI 条件を追加したことによって課金単価が上がることはありません (※総リクエスト数が増えればその分の課金は発生)。
まとめ(社内回答用)
- (1)(2)ともに AWS WAF で対応可能
- Rate-based rule + URI パターンマッチで実現
- レスポンスコードではなくリクエスト内容で制御
- ルール追加コストは $1 / 月 程度
調査結果としては以上です。