AWS WAFで送信元IPアドレスまたはXFFヘッダーが日本の場合に通信を許可する
送信元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アドレスからの地域の推測は誤る可能性もあること、国での制限は突破が容易であることを考慮いただければと思います。