はじめに
リクエストヘッダーの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
の扱いがどうなっているか理解しておくことが重要。