AWS WAFにレート制限(Rate-based Rule)を設定する方法
生徒
「先生、AWS WAFでアクセスが多すぎるときに制限をかける方法があるって聞いたんですが、それはどうやるんですか?」
先生
「いい質問ですね。それはレート制限、英語ではRate-based Rule(レート ベースド ルール)と呼ばれる仕組みです。短時間に大量のリクエストを送ってくるユーザーを制御するために使います。」
生徒
「それを使えばDDoS攻撃や不正アクセスを防ぐことができるんですか?」
先生
「そうです。完全に防ぐことは難しいですが、一定の制限をかけることで被害を減らすことができます。では、具体的な仕組みと設定方法を見ていきましょう。」
1. レート制限(Rate-based Rule)とは?
レート制限(Rate-based Rule)とは、「特定の接続元から、短時間にどれだけのリクエストが来たか」をAWS WAFが常にカウントし、あらかじめ決めた上限値(しきい値)を超えた場合に、そのアクセスを自動的に遮断または制限する機能のことです。
例えば、「5分間に同じIPアドレスから1,000回以上のアクセスがあったら、そのIPを一時的にブロックする」といった運用が可能です。これにより、人間では不可能なスピードでページを読み込もうとする攻撃用プログラム(ボット)や、サーバーに過剰な負荷をかける迷惑なアクセスを効率よく排除できます。
コンサートのチケット売り場で、「1人1枚まで」というルールがあるのに、1人で100回も列に並び直して買い占めようとする人がいたら困りますよね?レート制限は、そうした「不自然に多すぎる動作」を検知して、その人だけを「お断り」するガードマンのような役割を果たします。
AWS WAF(エーダブリューエス ワフ)の設定は、プログラミングコードをバリバリ書く必要はありません。以下のようなJSON(ジェイソン)と呼ばれる形式でルールが定義されますが、マネジメントコンソールの画面から数字を入力するだけで自動生成されるので安心してください。
【設定イメージ:5分間に1000リクエストを制限する設定ファイルの一部】
{
"Name": "MyRateLimitRule",
"Priority": 0,
"Action": {
"Block": {}
},
"Statement": {
"RateBasedStatement": {
"Limit": 1000,
"AggregateKeyType": "IP"
}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "MyRateLimitRule"
}
}
この設定では、"Limit": 1000(1000回まで)という制限を、"AggregateKeyType": "IP"(接続元のIPアドレスごと)に適用しています。このように、AWS WAFは初心者でも直感的に強力なセキュリティを導入できるのが大きなメリットです。
2. レート制限が必要な理由
Webアプリケーションは通常、多数のユーザーからアクセスされます。しかし攻撃者は短時間に大量のリクエストを送り、システムを負荷でダウンさせることがあります。このような行為を防ぐのがレート制限です。
具体的な攻撃例として、DDoS(ディードス)攻撃や総当たりログイン攻撃があります。こうした攻撃に対して、レート制限ルールを使うと安全性を大幅に高められます。
3. レート制限ルールの仕組み
レート制限ルールは「カウント」と「アクション」の組み合わせで動作します。
- カウント(読み方はカウント)…指定時間内のリクエスト数を監視
- アクション(読み方はアクション)…許可、ブロック、カウントを設定
例えば「5分間で2000リクエストを超えたらブロック」というように条件を指定できます。
4. AWSマネジメントコンソールでの設定手順
AWSマネジメントコンソールを使うと、初心者でも簡単にレート制限ルールを設定できます。手順は次の通りです。
- AWSマネジメントコンソールにログイン
- AWS WAFのダッシュボードを開く
- 「Web ACL(ウェブ アクセス コントロール リスト)」を選択
- 「ルールを追加」をクリック
- 「レートベースルール」を選択し、しきい値を入力(例:2000リクエスト/5分)
- アクションを「ブロック」または「許可」に設定
- 保存して有効化
この流れを押さえておけば、シンプルに制御を追加できます。
5. 実際に使える活用例
レート制限ルールはさまざまな場面で役立ちます。例えば以下のようなケースです。
- ログインページに対する総当たり攻撃を防止
- API(エーピーアイ)の呼び出し回数を制限
- 特定のボットによるアクセスを制御
これにより、正規のユーザーを守りながら攻撃を最小限に抑えることができます。
6. レート制限と他ルールの組み合わせ
レート制限は単独で使うよりも、他のルールと組み合わせると効果的です。例えばIP制限ルールと併用して「特定の国からのアクセスは500回を超えたらブロック」といった制御が可能です。
また、カスタムルールやルールグループと組み合わせて使うと、よりきめ細かい防御が実現できます。
7. 運用時の注意点
レート制限は便利ですが、設定値を間違えると正規のユーザーまでブロックしてしまう恐れがあります。特にアクセスが集中するECサイトやイベントサイトでは注意が必要です。
まずは「カウント」モードでテストし、しきい値が妥当かどうかを確認してから「ブロック」に変更するのが安全です。
8. 初心者が押さえるべきポイント
初心者はまず、少し緩めの制限を設定して様子を見るのが良いでしょう。ログを活用して「どのくらいのアクセスが通常なのか」を把握することが大切です。その上で必要に応じて制限値を調整しましょう。
レート制限はAWS WAFを使ったセキュリティ対策の基本であり、他のセキュリティルールと組み合わせることで強力な防御が可能になります。
まとめ
ここまで、AWS WAF(エーダブリューエス ワフ)におけるレート制限(Rate-based Rule)の基本概念から具体的な設定方法、運用上の注意点までを詳しく解説してきました。現代のWebアプリケーション運営において、サイバー攻撃の脅威は避けて通れない課題です。特に、短期間に膨大なリクエストを送りつけてサーバーをダウンさせるDDoS攻撃や、パスワードを力技で割り出すブルートフォース攻撃などは、サービスの継続性を脅かす深刻な問題となります。
こうした脅威に対して、AWS WAFのレート制限は非常にシンプルかつ強力な対抗手段となります。「特定の期間内に一定数以上のリクエストがあった場合に制限をかける」というロジックは、直感的で分かりやすく、インフラエンジニアだけでなくアプリケーション開発者にとっても扱いやすい機能です。
主要なポイントの振り返り
レート制限を導入する際に最も重要なのは、**「しきい値(Threshold)」**の決定です。AWS WAFでは、デフォルトで5分間というスライディングウィンドウ(監視期間)が採用されています。この5分間に、各IPアドレスが何回リクエストを送ったかを常にカウントしています。
- 柔軟なアクション設定: 単純にアクセスを遮断する「Block(ブロック)」だけでなく、怪しいリクエストを一旦カウントだけしてログに残す「Count(カウント)」、さらにはCAPTCHA(キャプチャ)を提示して人間かどうかを判定させる「CAPTCHA」アクションなども選択可能です。
- スコープの限定: Web ACL全体に一律の制限をかけるだけでなく、URIパスを指定して「ログイン画面(/login)だけは厳しめに制限する」といった、きめ細やかな設定が推奨されます。
- コスト効率: 高価な専用セキュリティ機器を導入しなくても、AWSのマネージドサービスとして安価に、かつ即座に導入できる点は大きなメリットです。
CloudFormationによる自動化の例
手動での設定も簡単ですが、本番環境や開発環境などで一貫したセキュリティレベルを保つためには、Infrastructure as Code(IaC)による管理が理想的です。以下に、AWS CloudFormation(クラウドフォーメーション)を使用してレート制限ルールを定義する際のテンプレート例を紹介します。
<!-- CloudFormationのYAML形式を模した構造の例 -->
Type: AWS::WAFv2::WebACL
Properties:
DefaultAction:
Allow: {}
Scope: REGIONAL
Rules:
- Name: RateLimitRule
Priority: 1
Action:
Block: {}
Statement:
RateBasedStatement:
Limit: 1000
AggregateKeyType: IP
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: RateLimitRuleMetric
このようにコードとして管理することで、ルールの変更履歴をGitなどで追跡でき、オペレーションミスを防ぐことができます。
CLIでの動作確認
設定したルールが正しく動作しているか、または現在の設定を確認したい場合には、AWS CLI(コマンドラインインターフェース)を活用するとスムーズです。例えば、作成したWeb ACLの詳細情報を取得するコマンドは以下のようになります。
aws wafv2 get-web-acl --name MyWebACL --scope REGIONAL --id a1b2c3d4-5678-90ab-cdef-EXAMPLE11111
{
"WebACL": {
"Name": "MyWebACL",
"Id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
"Rules": [
{
"Name": "RateLimitRule",
"Priority": 1,
"Statement": {
"RateBasedStatement": {
"Limit": 1000,
"AggregateKeyType": "IP"
}
}
}
]
}
}
このように、コマンドラインから設定値を素早く確認できるため、トラブルシューティングの際にも非常に役立ちます。
運用のコツ:ログ分析の重要性
レート制限を導入した後は、必ず「Amazon CloudWatch(クラウドウォッチ)」や「Amazon S3」にログを出力し、分析を行う癖をつけましょう。設定したしきい値が厳しすぎて一般のユーザーをブロックしていないか、あるいは緩すぎて攻撃を素通りさせていないかを定期的にチェックすることが、セキュアなシステム運用への近道です。
最後に、セキュリティに「絶対」はありません。AWS WAFのレート制限は、多層防御(Defense in Depth)の強力な1ピースとして捉え、他のマネージドルールやアプリケーション側の対策と組み合わせて、より堅牢な環境を構築していきましょう。
先生
「さて、ここまでAWS WAFのレート制限について詳しく見てきましたが、理解は深まりましたか?」
生徒
「はい!最初はただ『アクセスを止めるだけ』だと思っていましたが、しきい値の調整や、ログインページだけ厳しくするといった工夫が大事なんだと分かりました。」
先生
「その通りです。特に『5分間で何リクエストか』という感覚を掴むのは難しいので、最初はブロックせずに『カウント』モードで試すのが実務では鉄則ですよ。」
生徒
「カウントモードなら、もし設定を間違えてもユーザーに迷惑をかけずに、ログだけで『あ、この設定だとこの人はブロックされてたな』って確認できますもんね。すごく合理的です!」
先生
「素晴らしい洞察ですね。ちなみに、もし自分が管理しているAPIが特定の会社からだけたくさん呼ばれるような場合は、IPアドレスごとにしきい値を変えるような高度な設定も可能なんですよ。」
生徒
「へぇー!それは便利そうです。でも、まずは基本のIPベースの制限からマスターして、徐々に複雑なルールにも挑戦してみたいと思います。先生、今日はありがとうございました!」
先生
「どういたしまして。セキュリティ対策は終わりのない旅ですが、一歩ずつ進んでいきましょう。次はWAFのログをAthena(アテナ)で分析する方法についても勉強してみると、もっと面白いですよ。」