要約
- X-Forwarded-For ヘッダーから「Real Client IP」を取得する際は、最も右側の IP を使うこと
- XFF ヘッダーの最も左側の IP は通常「クライアントに最も近い」「ほぼ本物」と見なされるが、偽装可能(spoofable)。セキュリティに関わる用途には使わないこと
- 最も右側の XFF IP を選ぶときは、そのヘッダーの最後のインスタンスを使う必要がある
- リバースプロキシが設定する「True Client IP」の値(X-Real-IP、True-Client-IP など)も有用ではあるが
- リバースプロキシがその値をどのように設定しているかによる
- リバースプロキシ自体がすでに欺かれている(spoofed)可能性もある
- リバースプロキシの設定がどうなっているかによって変わる
- リバースプロキシが特別に設定していないヘッダーは信頼できない
- たとえば、Nginx の背後にない、あるいは常に(ヘッダーを)設定するようになっていないなら、X-Real-IP ヘッダーを読んではならない。偽装された値を読んでしまう可能性があるため
- 多くの Rate Limiter 実装が偽装可能な IP を使っており、レートリミット回避やメモリ枯渇攻撃に脆弱である
- コードやインフラで「real client ip」に関するものを使っているなら、以下の技術的な内容を参照すること
詳細(長いため見出しのみ訳します)
- 紹介 : 最近の「real client ip」特定はひどく厄介
- 落とし穴
- ヘッダーは信頼できない
- 複数のヘッダー
- プライベート IP
- IP Splitting
- 暗号化されていないデータは常に信頼できない
- X-Client-IP、True-Client-IP のようなものは偽装可能
- X-Forwarded-For を理解する
- 落とし穴を避ける
- 本当の IP を取得するためのアルゴリズム
- すべての IP 値を取得する
- セキュリティ要件に応じて何を使うか選ぶ
- 最も左、最も右
- 実例
- Cloudflare, Nginx, Apache
- Akamai
- Fastly
- Azure
- go-chi/chi
- didip/tollbooth
- ulule/limiter
- sethvargo/go-limiter
- Let's Encrypt
- Express
- Traefik
- phpList
- IIS
- Tor
- 上級 : 理論上の落とし穴と攻撃手法
- RFC 7239: Forwarded HTTP Extension, June 2014
3件のコメント
この部分は少し誤訳のようです。原文はこちらです。
たとえば、Nginx の背後にいない、または常に(ヘッダーが)設定されるようになっていないのであれば、X-Real-IP ヘッダーを読んではならない。スプーフィングされた値を読んでしまうことになるためです.
ああ、修正しておきます。ありがとうございます!
一般的な方法では、
TRUSTED_PROXY環境変数を使って、右端から「信頼できる」プロキシを1つずつ除外していき、最初に現れたIPを使用します。通常は内部IP(192.168.0.0/16)などを信頼できるプロキシとして扱うこともあります。