schedule2020-04-14

LB経由のサーバでクライアントIPをログに残すApacheの設定 X-Forwarded-For

アクセス元のIPをログに残したい場合、通常のApacheの設定ではLogFormatに%hで出力します。 ただし、ロードバランサーなどプロキシサーバを経由した場合に%hに出力されるIPはプロキシサーバのIP(ローカルIP)になってしまいます。

HTTPヘッダーにアクセス元のIと経由したプロキシのIPを保持する規格X-Forwarded-Forがあります。 X-Forwarded-Forを出力することでアクセス元のIPのログを残す設定を紹介します。

ELBのApplication Load Balancerで話を進めます。

X-Forwarded-Forを出力するconfの設定

LogFormat%{X-Forwarded-For}iを入れます。 %{Foobar}iでHTTPヘッダーのFoobarの値を出力します。

-- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
++ LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combined

書式はX-Forwarded-For: <client>, <proxy1>, <proxy2>です。

ELBとApacheの例 | aws.amazon.com

RemoteIPHeader X-Forwarded-Forの場合

RemoteIPHeader はApache内部で送信元IPを置き換えるのに使うヘッダーを指定します。

アクセス制御などのためRemoteIPHeader X-Forwarded-Forを設定すると、%{X-Forwarded-For}iの中身がになりました。 この場合の書式は、%{X-Forwarded-For}iではなくリモートIPアドレス%aとする。

例: アクセス制限している場合

RemoteIPHeader X-Forwarded-For

LogFormat &quot;%a %h %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined
CustomLog &quot;|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540&quot; combined

&lt;Location /admin&gt;
    AllowOverride   All
    Deny from all
    Allow from xxx.xx.xxx.x
    Allow from yyy.yyy.yy.yy/28
&lt;/Location&gt;

Allow fromで指定するIPがX-Forwarded-ForにあるIPになるようにRemoteIPHeader X-Forwarded-Forを設定しています。 LogFormatに%aを加えています。

Apache CustomLogの書式 | httpd.apache.org

IPについて

ちょうど「香川県ネット・ゲーム依存症対策条例」に関しての賛同パブコメのIPがローカルIPだったことが話題になってます。

「192.168.7.21」はどのような場合に表示されるのか、香川県議会事務局に聞いたところ、次のような回答がありました。

「香川県議会ホームページにご意見・お問い合わせというフォームがあり、そこから送られたものを印刷するとどれもこのような表示になります」(議会事務局)

事務局によると、賛成・反対を問わず、県議会ホームページの「ご意見・お問い合わせ」フォームから送信した場合は一律でこの表示になるとのこと。確かに、県のホームページ内から転送されたものであれば、プライベートIPアドレスが記載されていることにも一応の説明はつきます。

ゲーム条例パブコメ、同一IPアドレスからの送信が多数? 原本公開で“工作疑惑”広がる → 香川県議会に見解を聞いた | ねとらぼ

個人的に、ゲーム依存症の対策のために条例で時間制限することはやりすぎだと感じます。 この件に関してパブコメの賛同意見に水増しがあったか疑惑が残るが断定できません。 開示されたら続報が出るはず。

ここでの問題は、IPアドレス情報を残しているのに意味がない。 仮にクライアントIPを取れていたら、個人情報には当たらないけど公開するは控えたほうがいいかな。

インフラ屋としてはこういった問題が起きた場合に話題になっても恥ずかしくないインフラ設計・設定を心掛けたい。