リバースプロキシとクライアント IP の背後にある mod_security

リバースプロキシとクライアント IP の背後にある mod_security
client -> haproxy -> mod_security boxes -> backends

問題: mod_security ボックスは、'RPAFproxy_ips' の haproxy の IP で mod_rpaf を使用します。Apache ログにはクライアントの実際の IP が表示されますが、mod_security は以下のように haproxy の IP を報告し続けます。

mod_sec ボックスの Apache ログでクライアント IP が見つかりました

x.93.129.90 - - [14/Oct/2015:08:35:56 +0200] "GET /MYTEST HTTP/1.1" 301 524 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"

Mod_security はプロキシ IP (クライアント x.21.107.165) を報告します

 ==> /var/log/apache2/site.se_error.log <==
[Wed Oct 14 08:36:12.584500 2015] [:error] [pid 10264:tid 139895758558976]  [client x.21.107.165] ModSecurity: Access denied with code 403 (phase 2). 
Pattern match "\\\\balert\\\\b[^a-zA-Z0-9_]{0,}?\\\\(" at ARGS_NAMES:
<script>alert(1)</script>. [file "/usr/share/cwaf/rules/07_XSS_XSS.conf"] <etc>..

ウェブ上では mod_sec を使って rpaf を実行している人がいるようですが、何か間違っているのでしょうか?

他に良い方法をご存知の方はいらっしゃいますか? 基本的に、存在する場合はヘッダーの値を使用し、そうでない場合は remote_addr にフォールバックする mod_sec ルールをいくつか見たことがありますが、うまく動作しませんでした。

答え1

mod_rpaf は apache < 2.4 でのみ動作し、mod_remoteip は 2.4 で動作し、mod_security はロード バランサ/プロキシではなくクライアントの IP を報告するようになりました。

Ubuntu 14.04の場合

a2enmod remoteip
echo "RemoteIPHeader X-Client-Ip" > /etc/apache2/mods-enabled/remoteip.conf
service apache2 restart

関連情報