11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FUJITSUAdvent Calendar 2023

Day 5

【AWS】ALB利用時のアクセス元IPの偽装対策 (X-Forwarded-For)

Last updated at Posted at 2023-12-04

はじめに

リクエストヘッダーの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

  • ALB - X-Forwarded-Forのヘッダーの仕様

    • 付加 / append ... アクセス元IPを追加する (default)
    • 保持 / preserve ... X-Forwarded-Forをそのまま中継する(多段ALB向け)
    • 削除 / remove ... X-Forwarded-Forヘッダーを付けないで削除する

    ALB > 属性 > X-Forwarded-Forヘッダーの設定画面
    aws-alb-attribute-xff-.png

  • デフォルトは付加(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アドレスを指定することで、偽装リクエストの送信は可能
  • :warning: ALBに限らず、Webサーバーやリバースプロキシなどでも同様に、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などの任意の文字列など偽装可能
  • アプリ側では複数の値があった場合、最後(右端)の値だけを使う などの考慮が必要

    • 特に、アクセス元IPアドレスの制限で X-Forwarded-Forの値を利用している場合、考慮されていないと、アクセス制御が回避される可能性がある
  • 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 の扱いがどうなっているか理解しておくことが重要。
11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?