AWS WAFで送信元IPアドレスまたはXFFヘッダーが日本の場合に通信を許可する

2022.09.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

送信元IPアドレスとX-Forwarded-For(XFF)ヘッダーがどちらもJP以外の場合に通信を拒否するAWS WAFのルールを作成します。

ステートメント1

AWS WAFでは、地理的一致ルールを使うことで特定の国を許可/ブロック/カウントできます。Add RuleからRule builderを開きます。ステートメント1ではIPアドレスがJPの場合に一致するように記載します。

ステートメント2

ステートメント2では、X-Forwarded-ForがJPのときに一致するように記載します。

フォールバックをMatchにすると、ヘッダーに有効なIPアドレスがない場合に通信にマッチしたと判断され、日本からの接続と判定されます。通常のプロキシサーバーなどを利用している場合はIPアドレスは正しく設定されているはずですので、No matchとします。

ステートメント1と2をORで判断します。

アクションはCountとし、ラベルを付与します。今回はawswaflabel:jpというラベルを付与することにしました。

ラベルが存在しない通信をブロックする

JPかを判定しラベルを付与するルールの下に、ラベルがない場合にブロックするルールを作成します。AWS WAFは Priorityが小さいルールから評価されます。ラベルを付与するルールが評価されてから、ブロックするルールが評価されます。

ブロックするルールはこちらです。NOT StatementでHas a labelを指定し、ラベルawswaflabel:jpがない場合にブロックするように設定しています。

筆者の自宅のIPアドレスからは接続できること。日本以外からのリージョンからは接続できないこと。海外リージョンでも後述のXFFヘッダーに日本のIPを指定し接続できることを確認しました。

XFFヘッダーが存在しない通信について

X-Forwarded-Forが存在しない場合、AWS WAFはリクエストを評価せず、フォールバックも適用されません。当初、以下のようにラベルを使わずブロックするルールを試しましたが、期待どおりの動きをしませんでした。

IPアドレス X-Forwarded-For アクション
JP JP Count
JP JP以外 Count
JP以外 JP Count
JP以外 JP以外 Block

XFFヘッダーはユーザー側で指定ができる

X-Forwarded-Forヘッダーはユーザー側で指定ができるため、日本以外からの接続を完全に遮断することはできません。curlの場合は以下のように指定できます。

curl -H "X-Forwarded-For:203.0.113.1" http://example.com

本番環境で利用される場合は、IPアドレスからの地域の推測は誤る可能性もあること、国での制限は突破が容易であることを考慮いただければと思います。

参考