2013年7月28日日曜日

【apache】X-Forwarded-Forの設定方法と使い方(LocationごとにIP制限)

■概要
そもそもX-Forwarded-Forを使う場合ですが基本はロードバランサを使っているときです
Webサーバに到達した際にアクセス元のIPがロードバランサになってしまうので
本当のアクセス元IPを取得するためにX-Forwarded-Forの設定を実施します

今回はログの出し方とX-Forwarded-Forを使ったIP制限の方法を紹介します
またapacheのインストールはchefを元に実施しているものとします

■前提条件
X-Forwarded-Forはhttpで受ける際に取得することができる値です
http(LB)→http(server)

httpsでX-Forwarded-Forを使いたいときには
SSLアクセラレータ付きのLBを使用しておりかつサーバ証明書を取得しておりかつサーバ側は80番ポートで受ける必要があります
https(LB + SSLアクセラレータ + 証明書)→http(server)

■ログの出し方
vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combined

vim /etc/httpd/sites-enabled/000-default
000-defaultは環境によって異なります
VirtualHostを設定している設定ファイルを編集してください
CustomLog /var/log/httpd/access_default.log combined
combined になっていることを確認する

■X-Forwarded-Forを使ったIP制限方法
あるIPの場合はdenyするようにしてみます
vim /etc/httpd/sites-enabled/000-default
<VirtualHost *:80>
    SetEnvIf X-Forwarded-For "192.168.10.101" deny_ip
    SetEnvIf X-Forwarded-For "192.168.10.102" deny_ip

        <Location />
            Order allow,deny
            Allow from all
            Deny from env=deny_ip
            ProxyPass ajp://192.168.20.100:8009/sample-app/
        </Location>

        <Location /*/test/>
            Order deny,allow
            Deny from all
            Allow from env=deny_ip
            ProxyPass ajp://192.168.20.100:8009/sample-app/
        </Location>
</VirtualHost>

SetEnvIfでX-Forwarded-ForでフィルタリングするIPを指定します(正規表現での指定も可能なのでCIDR指定出来ます、今回はしてません)
当たり前ですが、80番のVirtualHostで受けています

「/」のLocationに対しては指定のIPを拒否する設定をしています
ポイントとしては allow,deny の順番で指定することで全許可してから指定のIPだけ許可しています

「/*/test/」のLocationに対しては指定のIPを許可する設定をしています
ポイントとしては deny,allow の順番で指定することで全拒否してから指定のIPだけ許可しています

LocationMatchディレクティブを使うと更に高度な正規表現を使用することができます

1 件のコメント:

  1. リバースプロキシ配下でIP制限が出来ずに困っていました。
    ■X-Forwarded-Forを使ったIP制限方法 で実現できました。
    ありがとうございます。

    返信削除