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にだけレートベース制限をかけられますので、本ブログを参考に設定いただけますと幸いです。