[アップデート] AWS WAF で IP アドレス以外を条件にレートベースルールを設定出来るようになりました

2023.05.17

いわさです。

AWS WAF では一定期間における特定 IP アドレスからのリクエストレートを追跡し、レート制限を超えるとブロックするなどのルールアクションを実行出来る「レートベースルール」という機能があります。
これによって、過剰なリクエストを送信している IP アドレスからのリクエストを一時的にブロックすることが出来ます。

しかし、攻撃元の IP アドレスを分散させるなどでこのルールを回避する攻撃手法がありました。
今回のアップデートでは IP アドレス以外の任意の条件を元にレートベースルールを設定出来るようになりました。

どういうルールを同一の攻撃者であるとみなすか慎重に判断は必要ですが、IP アドレスのみの従来のルールよりも柔軟に構成出来るようになります。

設定方法

設定方法ですが、従来のレートベースルールと同じ箇所で設定することが出来ます。
WebACL のルールビルダーで種別にレートベースルールを選択します。

その後レートベースルールの構成を行います。
従来は Source IP address と IP address in header の 2 つを選択することが出来ました。
IP address in header はリバースプロキシを経由した場合など大元のアクセス元 IP アドレスがX-Forwarded-Forヘッダーなどに含まれている場合に使う機能で、以前から設定が可能でした。

今回それらに加えて、「Custom keys」と「Count all」が追加されています。

Custom keys

1 つ以上のカスタム集計キーを使用して集計します。
ヘッダー、クエリ文字列、クッキー、ラベル、HTTP メソッドなどを指定出来ます。

また、複数のキーあるいは IP アドレスなどと組み合わせて複合的な集約キーを設定することが出来ます。
2 つ目以降の集約キーには IP アドレスを組み合わせることも出来ます。

集約キーの追加条件は最大 5 つまで組み合わせることが可能です。

また、それぞれのキーでは最大 10 までテキスト変換処理を行うことが出来ます。

さらに、従来と同様にスコープダウンステートメントを任意で設定することが出来ます。

Count all

Count all の場合は集約キーを特に設定せず全てのリクエストが対象となります。
ただし、このオプションにはスコープダウンステートメントが必要となるので、そこで対象リクエストがフィルタリングされます。

ユースケースとしては、特定のラベルを持つすべてのリクエストや特定の国からのすべてのリクエストなどにアクションを行うために使用するようです。

試してみる

次のような API Gateway (REST) に WebACL をアタッチし、連続したリクエストを送信して確認してみます。

% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.

IP アドレス

まずは従来の挙動を確認します。
IP アドレスのみを使ったレートベースルールです。

レートベースルールの最小レートは 100 で、AWS WAF は 30 秒ごとにリクエストのレートをチェックして、毎回直近 5 分間のリクエストをカウントするという仕様になっています。
今回は最小レートに 100 を設定しています。

100 回くらいリクエストを送信し続けると、その後ブロックされるようになりました。

% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.
% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.
% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}

ここで IP アドレスを変更してみると次のように再びアクセスができるようになりました。

% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.

レート制限でブロックされた IP アドレスに戻すと再びブロックされます。

% curl https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}

ヘッダーキー

次のように hoge ヘッダーキーのみを集約キーとして設定します。

先程と同じようにレート制限によってブロックされた後、hoge ヘッダーの値を別のものに変更するとアクセス出来るようになりましたが、ブロックされた元のヘッダー値に戻すと再びブロックされるようになりました。

% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}
% curl -H "hoge: fuga111" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.

そして、同一ヘッダー値の場合は従来とは異なり IP アドレスを変更したとしてもブロックされ続けていることがわかります。

% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}
# ここで IP アドレスを変更 → ブロックされ続ける
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}

IP アドレスと異なり、広範囲に意図せずブロックしてしまう可能性も高くなるので集約キーの選定は慎重に行う必要がありそうです。

ヘッダーキー + IPアドレスで集約

次は先程と同じヘッダーキーに加えて、セカンダリで IP アドレスも集約キーに加えています。

この場合は ヘッダーキーと IP アドレスの AND 条件でのキーとなるので、次のように同一ヘッダー値かつ同一 IP アドレスの場合のみ連続したアクセスと判断されます。
ヘッダー値を変更しても IP アドレスを変更しても、どちらの場合でもアクセス出来るようになりました。

% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}

# ヘッダー値を変更したところアクセス出来るように
% curl -H "hoge: fuga1111" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.

# ヘッダー値戻すと再びアクセスできなくなった
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage    
{"message":"Forbidden"}

# IP アドレス変えるとアクセス出来るように
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
hoge api result.

# IP アドレスを戻すと再びアクセスできなくなった
% curl -H "hoge: fuga" https://87gfnxdt8j.execute-api.ap-northeast-1.amazonaws.com/hogestage
{"message":"Forbidden"}

さいごに

本日は AWS WAF で IP アドレス以外を条件にレートベースルールを設定出来るようになったので設定方法を確認し、API Gateway に適用して実際にブロックされる様子を観察してみました。

同一 IP アドレス以外でもレートベースルールが設定出来るようになったので柔軟性が高くなりました。
ただし、より広い条件で集約してレート制限を設定出来るようになったので条件の選定は慎重に行う必要がありますね。条件設定が難しそう。