AWS WAFのレートベース制限で管理者ページへの接続を制限する

AWS WAFのレートベースルールでは、しきい値を超えたスピードでリクエストを送るIPアドレスをブラックリストに追加できます。今回はURIにadminが含まれるページにだけレートベースルールを適用しました。

構成

WAFを適用したALB,EC2の構成を検証に利用します。Web ACLでは、レートベースルールをBlock、デフォルトのアクションをAllowにします。

設定方法

コンディション「String and regex match conditions」を作成します。URIを小文字に変換してから、adminが含まれているか確認するフィルターを設定します。

レートベースのルールを作成します。

作成したコンディションを指定し、レートリミットを指定します。今回は100としました。これでadminが含まれるURIに対して、5分間に100以上のリクエストがあった場合に、そのIPアドレスはブラックリストに登録されます。

Apache Benchでしきい値を超えた接続を行うと、ブラックリストに登録される

200回の接続を行ったところ、全ての通信が許可されました。

ab -n 200 -c 1 http://alb-123456678.ap-northeast-1.elb.amazonaws.com/admin/
(略)
Complete requests:      200
Failed requests:        0
Total transferred:      55051 bytes
(略)

時間をおかずに再度200回接続したところ、196の接続が遮断されました。

Complete requests:      200
Failed requests:        196
   (Connect: 0, Receive: 0, Length: 196, Exceptions: 0)
Non-2xx responses:      196

3回目の接続では、全てが遮断されました。

Complete requests:      200
Failed requests:        0
Non-2xx responses:      200

ブラウザから、http://alb-123456678.ap-northeast-1.elb.amazonaws.com/admin/に接続すると、403 Forbiddenと表示されました。

レートベースルールをみると、ブラックリストに登録されたIPアドレスを確認できます。

ブラックリストに登録されていても、adminページ以外へは接続できます。

CloudWatchメトリクスで状況をざっくり把握する

BlockedRequestsメトリクスで、ブロックした通信数を確認できます。ざっくりとした状況判断には使いやすいです。

AWS WAFログにはレートベースでブロックした旨が残る

WAFのログをAthenaで見てみましょう。手順はこちらを参照ください。以下のようにレートベースルールでブロックしていることがわかります。

  • terminatingruletype:RATE_BASED
  • ratebasedrulelist:[{ratebasedruleid=48edXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, limitkey=IP, maxrateallowed=100}]

ratebasedruleidは、AWS WAFコンソールからも確認できます。ログに記録されたIDと作成したレートベースルールのIDが一致しています。

ブラックリストからは自動で解除される

レートベースで登録されたブラックリストからは、時間が経つと自動的に解除されます。

おわりに

AWS WAFのレートベースルールについて、ご紹介しました。しきい値を超えるペースで接続したIPアドレスについて、ブラックリストに登録され、接続が拒否されました。拒否されたクライアントには403 Forbiddenが表示されます。レートベースの効果を確認するには、CloudWatchメトリクスやAthenaでAWS WAFのログを確認します。ログイン画面、管理画面、ユーザー情報の登録画面など、特定のURIにだけレートベース制限をかけられますので、本ブログを参考に設定いただけますと幸いです。