はじめに
リクエストヘッダーのX-Forwarded-Forは、Webサーバーやアプリ側でアクセス元IPアドレスを取得する手段としてよく使われています。
本記事では、AWS Application Load Balancer(ALB) のX-Forwarded-Forの仕様とX-Forwarded-For使用時のアクセス元IPアドレスの偽装対策について書いています。
ALBのX-Forwarded-Forの仕様
-
HTTP ヘッダーと Application Load Balancer
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/x-forwarded-headers.html -
- 付加 / append ... アクセス元IPを追加する (default)
- 保持 / preserve ... X-Forwarded-Forをそのまま中継する(多段ALB向け)
- 削除 / remove ... X-Forwarded-Forヘッダーを付けないで削除する
-
デフォルトは
付加(append)。リクエストヘッダーX-Forwarded-Forの存在有無で挙動が異なるので注意-
X-Forwarded-Forが設定されていない場合は、アクセス元IPアドレスが設定される X-Forwarded-Forが存在する場合は、カンマ区切りで最後(右端)にアクセス元IPを追加
-
アクセス元IPアドレスの偽装対策
ALBの属性でX-Forwarded-Forの設定を 付加 (append) に設定している場合、既にリクエストヘッダーに X-Forwarded-For が指定されていると、カンマ区切りで最後にアクセス元IPアドレスが追加される。
X-Forwarded-Forに任意のIPアドレスを指定することで、偽装リクエストの送信は可能-
ALBに限らず、Webサーバーやリバースプロキシなどでも同様に、X-Forwarded-Forヘッダーを適切に使用していない場合、セキュリティリスクがある。
参考)X-Forwarded-For - HTTP | MDN (developer.mozilla.org)
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Forwarded-For
-
例)リクエストヘッダー
X-Forwarded-For: 127.0.0.1のリクエストをALBに送信した場合に、ALBが付加した結果 (ALBにアクセスしたクライアントのIP: 192.168.123.123)X-Forwarded-For: 127.0.0.1, 192.168.123.123- ALBは既存の値のX-Forwarded-Forの値の最後(右端)に、
アクセス元IPアドレスを追加 - X-Forwarded-Forの値には、任意のIPアドレス、aaaなどの任意の文字列など偽装可能
- ALBは既存の値のX-Forwarded-Forの値の最後(右端)に、
-
アプリ側では複数の値があった場合、最後(右端)の値だけを使う などの考慮が必要
- 特に、アクセス元IPアドレスの制限で
X-Forwarded-Forの値を利用している場合、考慮されていないと、アクセス制御が回避される可能性がある
- 特に、アクセス元IPアドレスの制限で
- X-Forwarded-For の値は偽装可能であるため、単純に信頼してはいけない。
- ALBではカンマ区切りで最後(右端)にアクセス元IPアドレスを追加する仕様。
- X-Forwarded-Forの値でカンマ区切りで複数の値が含まれている場合、最後(右端)の値以外は信頼できない。
参考)多段ALB構成の場合の対策
多段ALB構成でX-Forwarded-Forを使ってアクセス元IPアドレスを伝搬したい場合の設定方法と考慮ポイントについて、簡単ですが書いておきます。
構成例:
クライアント → 前段のALB(A) → リバースプロキシ(B) → 後段のALB(C) → Web(D)
①後段のALBでX-Forwarded-Forヘッダーを 保持(preserve) に設定する。
-
前段のALB(A)では付加 (append)に設定する。 (デフォルトのまま) -
後段のALB(C)では保持 (preserve)に設定することで、前段のALB(A)にアクセスしたIPアドレスが中継される。
②リバースプロキシやWebサーバーのX-Forwarded-For の設定
-
X-Forwarded-Forヘッダーをそのまま中継するよう設定する。(ALBの保持と同様の設定)-
X-Forwarded-Forの値がリモートIPアドレスになるように設定している場合、ALBのIPアドレスが値に設定されるため、クライアントIPアドレスが伝搬できなくなる。 - ※具体的な設定については、Webサーバーソフトウェアによって異なるため省略
-
まとめ
- ALB利用時の
X-Forwarded-Forの偽装対策として、カンマ区切りで複数の値があった場合、Webサーバー/リバースプロキシ/Webアプリで最後(右端)のIPアドレスのみ取得/中継するなどの対策をしよう。 - 対策するためには、ALBだけでなく、途中のWebサーバー/リバースプロキシ/Webアプリで
X-Forwarded-Forの扱いがどうなっているか理解しておくことが重要。
