速報

ギフティでeギフト不正発行|約5億5千万円の損失見込みと利用者への影響

CATEGORY

NGINXでX-Forwarded-Forの偽装を防ぐ信頼プロキシ設定

※本ページのリンクにはプロモーションが含まれています。

信頼するプロキシが接続元情報を選別し、不正な情報を除外してサーバーとログへ渡す概念イラスト

目次

やの後ろにあるNGINXで、利用者のを復元したい。しかしX-Forwarded-Forをそのまま信用すると、外部から指定されたアドレスでや記録を行う構成になり得ます。対策の中心はヘッダー名の指定ではなく、その値を渡してよい直前のを限定することです。

本記事は2026年10月27日に確認したNGINX公式ドキュメントに基づく恒久対策の実践解説です。特定の新規脆弱性の速報ではありません。対象はの転送ヘッダーで接続元を復元する構成で、PROXY protocolを使う構成は別途設計が必要です。以下は仮想の設定例であり、実環境での動作検証を済ませたという意味ではありません。

スポンサーリンク

誰がIPアドレスの値を決められるか

X-Forwarded-Forは通信を転送した経路の情報を運ぶHTTPヘッダーです。文字列が存在するだけでは、そこに書かれたIPアドレスが実際の利用者であるとは証明できません。利用者が自分でヘッダーを付けて送れることを出発点に、どの装置が上書きまたは追記するかを確認します。

例えば管理画面を特定IPだけへ公開している場合、判定対象が利用者の指定できるヘッダーなら、許可IPを名乗られる危険があります。でもキーが偽装可能なら制限の回避につながり、監査ログでは別の利用者のアドレスを記録させられるおそれがあります。影響はその値を何の判断に使うかで変わります。

まず、利用者からCDN、負荷分散装置、NGINX、アプリまでの接続順を書き出します。各区間について、実際の接続元と転送ヘッダーの生成担当を記録してください。管理画面の表示名や構成図の製品名だけでは、ネットワーク上の送信元範囲やヘッダー処理の方式までは分かりません。

realipモジュールの三つの指定を分ける

NGINX公式のrealipモジュール資料は、指定したヘッダーの値でクライアントアドレスと任意のポートを変更する機能を説明しています。標準でされるモジュールではないため、導入前に実行中のNGINXで利用できることを確認します。

set_real_ip_fromは、正しい置換用アドレスを送ると信頼する接続元を指定します。real_ip_headerは復元に利用するヘッダーを指定し、既定値はX-Real-IPです。real_ip_recursiveは再帰的な探索の有無で、既定値はoffです。ヘッダー名をX-Forwarded-Forへ変えるだけでは、この三つの役割を設計したことにはなりません。

公式仕様では、元の接続元が信頼対象と一致するとき、再帰探索が無効ならヘッダー内の最後のアドレスへ置換します。有効なら最後の信頼されていないアドレスへ置換します。したがってonを万能な安全設定として扱わず、どの中継アドレスを信頼するかと一緒に評価する必要があります。

スポンサーリンク

信頼範囲を必要なプロキシだけに限定する

次の例は、NGINXの直前に管理下のプロキシ192.0.2.10だけがある仮想構成です。このアドレスは説明用であり、そのまま本番へ貼り付ける値ではありません。実際には提供元が公開する送信元範囲、専用サブネット、構成上の接続経路などから値を決定します。

set_real_ip_from 192.0.2.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

これらの指定はhttp、server、locationの各コンテキストで利用できます。どこへ置くかで適用範囲が変わるため、対象の仮想ホストだけでなく設定の継承や既存の共通設定も調べます。設定ファイル一つの差分だけを見ず、実際に読み込まれる設定全体をレビューしてください。

全インターネットを信頼する0.0.0.0/0や::/0を、動作確認のために入れたままにしてはいけません。同様に、社内やのプライベート範囲全体を無条件に信頼すると、その範囲内の別サービスからヘッダーを送れる条件が残ります。必要な送信元へ絞れる理由を構成表に残します。

NGINXに到達できる経路自体も制限します。CDN経由だけを想定しているのにオリジンへ直接接続できるなら、CDN側で実施した制御を通らない要求が届き得ます。信頼設定とネットワーク制限は別の対策です。ヘッダーを信用しない直アクセスでも、到達できることが業務要件に合うかを判断してください。

多段プロキシでは右側からの判定を確認する

CDNと負荷分散装置を経由する場合、直前の接続元だけを登録すると、復元結果が利用者ではなく途中の装置になることがあります。反対に、広すぎる信頼範囲は本来止めるべき位置を通過させます。再帰探索を有効にした結果を、想定するヘッダー列と実際の接続元の組み合わせで確認します。

ヘッダーの左端を常に利用者とみなす独自処理は避けます。入口で外部由来の列を捨てて新しく作るのか、既存列へ接続元を追記するのかで意味が変わるためです。管理するプロキシで列を正規化する場合も、CDN提供元が保証する方式と矛盾しないようにします。

アプリ側にも信頼プロキシ設定があるなら、NGINXとアプリのどちらで最終的な利用者IPを確定するかを決めます。NGINXが復元した値と、アプリが独自に解析した値が異なれば、ログとアクセス制御の判断が食い違います。二重に解析する必要がある場合は、双方の入力と信頼範囲を別々に検証してください。

スポンサーリンク

元の接続元と復元結果を両方記録する

realipモジュールの$realip_remote_addrは元のクライアントアドレスを保持します。復元後の$remote_addrと併記すれば、どの装置から届いた要求をどの利用者として扱ったかを追跡できます。X-Forwarded-Forの生の値も調査材料になりますが、これは信頼済みの結論とは区別して保存します。

NGINX公式のログモジュール資料には、log_formatで向けのを指定する方法があります。ヘッダーをログに含める際は改行や引用符などの処理を含め、集約先が壊れずに読める形式を選びます。ログの文字列をそのまま運用コマンドへ渡す処理も避けてください。

生のヘッダー列には複数のアドレスが含まれるため、保管期間と閲覧権限を決めます。障害調査のために一時的に記録を増やす場合は、終了日と削除方法も設定します。アプリの利用者IDや要求の識別子と対応づけられれば、IPアドレス一つだけで利用者を断定する調査を減らせます。

偽装しても判断が変わらないことを試す

本サイトの提案する試験は、所有または管理する検証環境で、正常な経路とヘッダー偽装時の結果を比較する方法です。試験用のヘッダーには実在する第三者のIPではなく説明用アドレスを使い、通常の利用者と接続を混同しない記録を残します。攻撃通信を外部サービスへ送る必要はありません。

第一に、通常のCDN経由アクセスで元の接続元が想定するプロキシ、復元結果が試験端末のアドレスになることを確認します。第二に、利用者側でX-Forwarded-Forに任意の値を付けても、最終的な復元結果や許可判断を自由に変更できないことを確認します。応答コードに加えてNGINXとアプリ双方のログを照合します。

第三に、オリジンへの直アクセスを試験できる管理下の端末から確認します。設計上禁止ならネットワーク層で届かないことが合格条件です。直アクセスを許可する構成なら、偽のヘッダーで許可IPを名乗れず、その接続自体の送信元として扱われることを確認します。監視やの例外経路も含めます。

第四に、複数段の信頼プロキシ、IPv6、ヘッダーがない要求についても結果を確認します。IPv4だけで成功した試験はIPv6経路の保証にはなりません。ログに期待どおりのIPが出た一例だけで完了せず、信頼していない接続元が値を変えられないという拒否側の結果を残してください。

変更を反映する前後の確認と切り戻し

変更前に有効な設定とビルド情報を保存し、nginx -tで構文を検査します。モジュールが利用できない場合や指定場所が不適切な場合は、その段階で解決します。構文検査が成功してもネットワーク経路や信頼範囲の正しさまで証明されるわけではないため、検証環境で前述の比較を続けます。

本番反映後は、アクセス拒否の増加だけでなく、全利用者が同じIPへ集約されていないかも確認します。後者はレート制限が通常利用者まで巻き込む原因になります。管理画面、、監視、ヘルスチェックなど経路別に確認し、異常時には保存した設定へ戻せるようにします。

CDNの送信元範囲変更やロードバランサー追加は、信頼境界の変更です。担当者の手作業で古い範囲が残ることを防ぐため、変更通知を受け取る窓口と反映手順を決めます。自動取得する場合も、取得失敗で全範囲許可へ切り替えるような処理にはせず、差分をレビューして反映します。

この対策はIPアドレスの復元を安全に扱うためのもので、認証や利用者単位のの代わりにはなりません。共有回線やNATでは複数の利用者が同じIPになるため、管理操作にはアカウントのと権限確認を組み合わせます。IP制限は補助的な境界として、その前提と限界を運用手順へ明記してください。

試験記録には、接続元、送ったヘッダー列、期待した復元結果、実際の復元結果、アプリの判定を一組で残します。例えば信頼プロキシの直前に別の中継を追加したときも、この組を再実行すれば以前の前提を引き継げるか判断できます。ヘッダー内のアドレスを見ただけで合否を決めず、受信した接続元が信頼対象だったかまで確認することが重要です。

許可した管理端末で成功することと、許可していない端末が許可IPを名乗っても拒否されることを対で試します。後者が成功してしまう場合は公開範囲を戻し、信頼対象の広さと入口でのヘッダー処理を先に調べます。復元結果だけを修正する応急処置を重ねず、どの境界で値を確定する設計だったかへ戻って原因を切り分けます。

参考資料

NGINX ngx_http_realip_module

NGINX ngx_http_log_module

スポンサーリンク

関連記事

要求の区切り方に関する装置間の問題は、リバースプロキシの解釈差を防ぐHTTPリクエストスマグリング対策で解説しています。IP復元とは別の境界として確認してください。

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク

認証

アクセスしてきた相手が本人であることを確かめる仕組み。パスワードや生体情報、電子証明書などを使う。

詳しく見る

認可

認証で確認した利用者に、どの情報や機能へのアクセスを許すかを決める仕組み。

詳しく見る

API

ソフトウェアやサービスの機能を、ほかのプログラムから決まった方法で呼び出して使えるようにした窓口。

詳しく見る

ヘルスチェック

サーバーやサービスが正常に動いているかを、定期的に自動で確認すること。異常なサーバーへの振り分けを止めるのに使う。

詳しく見る

エスケープ

特別な意味を持つ記号を、ただの文字として扱われる形に変換すること。XSSやSQLインジェクションを防ぐ基本の対策。

詳しく見る

JSON

データを「名前と値」の組で表す、軽くて読みやすいテキストの形式。APIのデータのやりとりなどで広く使われる。

詳しく見る

クラウド

サーバーやソフトウェアを自分で持たずに、インターネット経由で必要な分だけ利用する形態。AWSやGoogle Cloudなど。

詳しく見る

ビルド

ソースコードなどから、実際に動かしたり配布したりできる形の成果物を作る作業。

詳しく見る

レート制限

一定の時間に受け付けるリクエストの回数を制限する仕組み。サービスの過負荷や、総当たりなどの悪用を防ぐ。

詳しく見る

HTTP

ブラウザとWebサーバーがやりとりするための決まりごと(プロトコル)。暗号化したものはHTTPSと呼ぶ。

詳しく見る

プロキシ

通信の間に立ち、利用者の代わりにリクエストを送ったり受け取ったりする中継の仕組みやサーバー。

詳しく見る

アクセス制御

誰が、どの情報や機能に、どこまでアクセスできるかを決めて制限する仕組み。

詳しく見る

IPアドレス

インターネットなどのネットワークで、機器を識別するための番号。通信の宛先や送信元を表す。

詳しく見る

ロードバランサー

複数のサーバーにアクセスを振り分け、負荷を分散させる装置や仕組み。障害時に別のサーバーへ切り替える役割も持つ。

詳しく見る

CDN

世界各地のサーバーにWebサイトのファイルを複製して置き、利用者に近いサーバーから配信する仕組み。表示の高速化や負荷の分散に使う。

詳しく見る