すべてのプロダクト
Search
ドキュメントセンター

Web Application Firewall:クライアントの送信元IPアドレスを取得する

最終更新日:May 23, 2024

WebサイトがWebアプリケーションファイアウォール (WAF) に追加されると、WAFはWebサイトへのアクセスリクエストをフィルタリングし、通常のリクエストを配信元サーバーに転送します。 オリジンサーバーは、クライアントの発信IPアドレスを取得するために、back-to-originリクエストでX-Forwarded-Forヘッダーを使用できます。 このトピックでは、クライアントの送信元IPアドレスを取得するようにwebアプリケーションサーバーとKubernetesコンテナーを設定する方法について説明します。 Webアプリケーションサーバーには、NGINX、IIS 6、IIS 7、Apache、およびTomcatサーバーがあります。

背景

X-Forwarded-Forヘッダーは、クライアントの発信IPアドレスを記録するために使用されます。 WAFは、X-Forwarded-For:Client IP address形式でアクセスリクエストをネクストホップサーバーに転送する前に、HTTPリクエストヘッダーにX-Forwarded-Forヘッダーを追加します。 アクセスリクエストがWAF、Anti-DDoS Pro、Anti-DDoS Premium、Alibaba Cloud CDNなどの複数の中間プロキシサーバーを通過する場合、X-Forwarded-Forヘッダーにはクライアントの送信元IPアドレスと中間プロキシサーバーのIPアドレスが記録されます。 ヘッダーには、コンマ (,) で区切られた複数のIPアドレスが記録されます。 例: X-Forwarded-For: クライアントIPアドレス、Proxy Server 1のIPアドレス、Proxy Server 2のIPアドレス、Proxy Server 3のIPアドレス、…

したがって、一般的なWebアプリケーションサーバーとKubernetesコンテナーは、X-Forwarded-Forヘッダーを使用して、クライアントの送信元IPアドレスを取得できます。

次のセクションでは、NGINX、IIS 6、IIS 7、Apache、およびTomcatサーバー、およびKubernetesコンテナーでX-Forwarded-Forヘッダーを構成する方法について説明します。

重要

開始する前に、Elastic Compute Service (ECS) インスタンスのスナップショットやwebアプリケーションサーバーの設定ファイルなど、既存の環境をバックアップしていることを確認してください。

NGINXサーバーの設定

NGINXサーバーはhttp_realip_moduleモジュールを使用して、クライアントの発信IPアドレスを取得します。 次の方法を使用して、http_realip_moduleモジュールをインストールし、NGINXの設定ファイルを変更します。

  1. http_realip_moduleモジュールをインストールします。

    nginxサーバーで# NGINX-V | grep http_realip_moduleコマンドを実行し、モジュールがインストールされているかどうかを確認します。

    • モジュールがインストールされている場合は、この手順をスキップします。

    • モジュールがインストールされていない場合は、NGINXを再コンパイルしてモジュールをインストールします。

      説明

      クイックインストールパッケージを使用してNGINXをインストールする場合、このモジュールはインストールされません。

      wget http://nginx.org/download/nginx-1.12.2.tar.gz
      tar zxvf nginx-1.12.2.tar.gz
      cd nginx-1.12.2
      . /configure -- user=www -- group=www -- prefix=/alidata/server/nginx -- with-http_stub_status_module-httpキャッシュなし-with-http_ssl_module-with-http_realip_module
      作る
      インストールする
      kill -USR2 'cat /alidata/server/nginx/logs/nginx.pid'
      kill -QUIT 'cat /alidata/server/nginx/logs/ nginx.pid.oldbin' 
  2. NGINXの設定ファイルを変更します。

    1. default.conf設定ファイルを開きます。

    2. 次のコンテンツをlocation / {} に追加します。

      set_real_ip_from <ip_range1>;
      set_real_ip_from <ip_range2>;
      ...
      set_real_ip_from <ip_rangex>;
      real_ip_header X-Forwarded-For; 

      コンテンツ内の <ip_range1><ip_range2> 、および <ip_rangex> は、WAFのback-to-origin CIDRブロックです。 WAFのback-to-origin CIDRブロックの詳細については、「WAFのback-to-origin CIDRブロックからのリクエストの許可」をご参照ください。

      各行にback-to-origin CIDRブロックを1つ入力します。 WAFのback-to-origin CIDRブロックに10.0.0.1、10.0.0.2、および10.0.0.3が含まれると仮定します。 location /{}に次のコンテンツを追加します。

      set_real_ip_from 10.0.0.1;
      set_real_ip_from 10.0.0.2;
      set_real_ip_from 10.0.0.3;
      real_ip_header X-Forwarded-For; 
  3. ログ形式を変更します。

    1. nginx.conf設定ファイルを開き、HTTP設定でlog_formatを見つけます。

    2. log_formatで、remote-addressフィールドをx-forwarded-forフィールドに置き換えます。

      次の内容は、変更されたログ形式を示しています。

      log_formatメイン '$http_x_forwarded_for - $remote_user [$time_local] "$request"'$status $body_bytes_sent "$http_referer" '"$http_user_agent"';
  4. nginx -s reloadコマンドを実行し、NGINXを再起動します。

IIS 6サーバーの構成

IIS 6サーバーは、F5XForwardedForモジュールを使用して、クライアントの送信元IPアドレスを取得します。 F5XForwardedForモジュールをインストールするには、次の操作を実行します。

  1. F5XForwardedFor.dllファイルをx86\Releaseまたはx64\Releaseディレクトリから、C:\ISAPIFilters\x86C:\ISAPIFilters\x64などのカスタムディレクトリにコピーします。

    説明
    • インターネットインフォメーションサービス (IIS) プロセスに、カスタムディレクトリに対する読み取りおよび書き込み権限があることを確認します。

    • x86\Releaseまたはx64\ReleaseディレクトリにF5XForwardedFor.dllファイルが存在しない場合は、F5XForwardedFor.dllをクリックしてダウンロードし、カスタムディレクトリにコピーします。

  2. IISマネージャーを開き、Webサイトを見つけて、Webサイトを右クリックし、[プロパティ] を選択します。

  3. [ISAPIフィルター] タブで、[追加] をクリックします。 次のパラメーターを設定し、[OK] をクリックします。

    サーバーが32ビットオペレーティングシステムを実行しているとします。

    • フィルター名: x_forwarded_for_x86と入力します。

    • 実行可能: F5XForwardedFor.dllのフルパスを入力します。 例: C:\ISAPIFilters\x86\F5XForwardedFor.dll

  4. IIS 6サーバーを再起動して、設定を有効にします。

IIS 7サーバーの構成

IIS 7サーバーは、F5XForwardedForモジュールを使用して、クライアントの送信元IPアドレスを取得します。 F5XForwardedForモジュールをインストールするには、次の操作を実行します。

  1. F5XFFHttpModule.dllおよびF5XFFHttpModule.iniファイルをx86\Releaseまたはx64\Releaseディレクトリから、C:\x_forwarded_for\x86C:\x_forwarded_for\x64などのカスタムディレクトリにコピーします。

    説明
    • IISプロセスにカスタムディレクトリに対する読み取りおよび書き込み権限があることを確認します。

    • x86\Releaseまたはx64\Releaseディレクトリにファイルが存在しない場合は、[F5XForwardedFor] をクリックしてファイルをダウンロードします。

  2. [IISサーバー] セクションで、[モジュール] をダブルクリックします。

  3. [モジュール] ページで、右側の [操作] セクションの [ローカルモジュールの設定] をクリックします。

  4. [ローカルモジュールの設定] ダイアログボックスで、[登録] をクリックします。 次のパラメーターを指定し、[OK] をクリックします。

    サーバーが32ビットオペレーティングシステムを実行しているとします。

    • 名前: x_forwarded_for_x86と入力します。

    • パス: F5XFFHttpModule.dllモジュールのフルパスを入力します。 例: C:\x_forwarded_for\x86\F5XFFHttpModule.dll

  5. [ローカルモジュールの設定] ダイアログボックスで、新しく登録したモジュールを選択し、[OK] をクリックします。

  6. [ISAPIとCGIの制限] セクションで、登録済みのDLLファイルを追加し、[制限][許可] に設定します。

  7. IIS 7サーバーを再起動して、設定を有効にします。

Apacheサーバーの設定

WindowsでのApacheサーバーの構成

Apache 2.4以降のバージョンのインストールパッケージは、mod_remoteip.soという名前のremoteip_moduleモジュールファイルを提供します。 このモジュールを使用して、クライアントの送信元IPアドレスを取得できます。

  1. Apacheの追加設定フォルダー (conf/extra/) にhttpd-remoteip.confという名前の設定ファイルを作成します。

    説明

    remoteip.conf設定ファイルをインポートして、関連する設定を読み込むことができます。 これにより、httpd.confファイルを変更する回数が減り、誤操作によるサービス例外が回避されます。

  2. 次のコンテンツをhttpd-remoteip.conf設定ファイルに追加します。

    # mod_remoteip.soモジュールを読み込みます。
    LoadModule remoteip_moduleモジュール /mod_remoteip.so
    # RemoteIPHeaderヘッダーを設定します。
    RemoteIPHeader X-Forwarded-For
    # back-to-origin CIDRブロックを指定します。
    RemoteIPInternalProxy <ip_range1> <ip_range2> ... <ip_rangex> 

    コンテンツ内の <ip_range1><ip_range2> 、および <ip_rangex> は、WAFのback-to-origin CIDRブロックです。 WAFのback-to-origin CIDRブロックの詳細については、「WAFのback-to-origin CIDRブロックからのリクエストの許可」をご参照ください。

    複数のback-to-origin CIDRブロックをスペースで区切ります。 プロキシサーバーのback-to-origin CIDRブロックに10.0.0.1、10.0.0.2、10.0.0.3が含まれているとします。 次のような形式を使用します。

    RemoteIPInternalProxy 10.0.0.1 10.0.0.2 10.0.0.3
  3. 次の内容をconf/httpd.conf設定ファイルに追加します。

    conf/extra/httpd-remoteip.conf
    を含める

    上記の内容は、httpd-remoteip.conf設定ファイルをconf/httpd.confに挿入します。

  4. httpd.conf設定ファイルのログ形式を変更します。

    LogFormat "% a % l % u % t \" % r\"%>s % b \" % {リファラー} i\" \" % {ユーザーエージェント} i\"" 結合
    LogFormat "% a % l % u % t \" % r\"%>s % b" common 
  5. 設定を有効にするには、Apacheを再起動します。

LinuxでのApacheサーバーの構成

上記の手順を実行してremoteip_moduleモジュール (mod_remoteip.so) を追加し、クライアントの送信元IPアドレスを取得するようにログ形式を設定します。 remoteip_moduleは、Apache 2.4以降のバージョンの組み込みモジュールです。

Apacheのバージョンが2.4より前の場合は、サードパーティモジュールmod_rpafをインストールして、クライアントの送信元IPアドレスを取得します。

  1. mod_rpafモジュールをインストールします。

    wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.tar.gz
    tar zxvf mod_rpaf-0.6.tar.gz
    cd mod_rpaf-0.6
    /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c 
  2. 次のコンテンツをApacheの /alidata/server/httpd/conf/httpd.conf設定ファイルに追加します。

    LoadModule rpaf_moduleモジュール /mod_rpaf-2.0.so
    RPAFenableオン
    RPAFsethostnameオン
    RPAFproxy_ips <rpaf IPアドレス>
    RPAFheader X-Forwarded-For 

    コンテンツ内の <rpaf IP address> は、mod_rpafモジュールのIPアドレスです。 Apacheログで特定のIPアドレスを照会できます。 プロキシサーバーのIPアドレスは使用しないでください。 ほとんどの場合、次の例に示すように、2つのIPアドレスが含まれます。

    LoadModule rpaf_moduleモジュール /mod_rpaf-2.0.so
    RPAFenableオン
    RPAFsethostnameオン
    RPAFproxy_ips 10.XX. XX.65 10.XX. XX.131
    RPAFheader X-Forwarded-For 
  3. 設定を有効にするには、Apacheを再起動します。

    /alidata/server/httpd/bin/apachectl再起動

Apacheモジュールの詳細については、「Apacheヘルプドキュメント」をご参照ください。

Tomcatサーバーの設定

Tomcatサーバーは、X-Forwarded-Forヘッダーを使用して、クライアントの発信IPアドレスを取得します。

  1. tomcat/conf/server.xml設定ファイルを開きます。

  2. 次のコンテンツに基づいて、AccessLogValveログ機能を変更します。

    <Valve className="org.apache.ca talina.valves.AccessLogValve" ディレクトリ="logs"
    prefix="localhost_access_log." suffix=".txt"
    pattern="%{X-FORWARDED-FOR}i % l % u % t % r % s % b % D % q %{User-Agent}i % T" resolveHosts="false"/> 

Kubernetesコンテナーの設定

ECSインスタンスがKubernetesにデプロイされている場合、Kubernetesはクライアントの送信元IPアドレスをX-Original-Forwarded-Forフィールドに記録し、WAFのback-to-origin CIDRブロックをX-Forwarded-Forフィールドに記録します。 クライアントの送信元IPアドレスを取得するには、コンテナ構成ファイルを変更して、IngressコントローラーがそれらをX-Forwarded-Forフィールドに追加できるようにする必要があります。

次の操作を実行して、コンテナー構成ファイルを変更できます。

  1. 次のコマンドを実行して、kube-system/nginx-configuration設定ファイルを変更します。

    kubectl -n kube-system edit cm nginx-configuration
  2. 次の内容を設定ファイルに追加します。

    compute-full-forwarded-for: "true"
    forwarded-for-header: "X-Forwarded-For"
    use-forwarded-headers: "true" 
  3. 設定ファイルを保存します。

    設定は、設定ファイルを保存した直後に有効になります。 次に、Ingressコントローラは、クライアントの発信IPアドレスをX-Forwarded-Forフィールドに追加します。

  4. クライアントの送信元IPアドレスを取得するために使用するフィールドをX-Original-Forwarded-Forフィールドに変更します。