IISで詳細ログ機能を用いてX-Forwarded-Forヘッダーの値をログに書き込む

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

IISでのX-Forwarded-Forヘッダー

IISでサーバーへのアクセス元IPを取得したい場合があります。

IIS 詳細ログ機能を用いると、X-Forwarded-Forヘッダーを取得することができるようになり、アクセス元IPがアクセスログに記録されるようになります。

※従来はサードパーティ製のプラグイン等を用いる必要がありましたが、現在はIIS7、8系向けにMicrosoftによってIIS拡張機能「IIS 詳細ログ」が提供されています。

※本記事の内容はAWS上のWindows Server 2008 R2、IIS 7.5で動作を確認しています。

IIS 詳細ログ(IIS Advanced Logging)のインストール

下記よりIIS 詳細ログのインストーラをダウンロードします。

・Download: IIS 詳細ログ (64 ビット) - Microsoft Download Center - Download Details
http://www.microsoft.com/ja-jp/download/details.aspx?id=7211

インストーラをダウンロードしたら、実行してIIS 詳細ログ機能をIISにインストールします。

iis_advanced_logging_02

 

X-Forwarded-ForヘッダーをIISで有効にする

IIS 詳細ログ(Advanced Logging)をインストールしたら、IIS Managerでサーバーのホームを表示します。詳細ログ機能が追加されていますので、クリックします。

 iis_advanced_logging_03

画面右にある操作パネルから「ログ記録フィールドの編集」をクリックします。

iis_advanced_logging_04

「ログ記録フィールドの編集」ダイアログが表示されるので、「フィールドの追加」ボタンをクリックします。

iis_advanced_logging_05

「ログ記録フィールドの追加」ダイアログが表示されるので、下記を入力して「OK」ボタンをクリックします。

  • フィールドID:X-Forwarded-For
  • カテゴリ:Default
  • ソースの種類:要求ヘッダー
  • ソース名:X-Forwarded-For

iis_advanced_logging_06

詳細ログのログ定義一覧に戻ったら、ログ定義が有効になっていることを確認します。

iis_advanced_logging_07

次に、現在有効になっているログ定義を編集します。画面右にある操作パネルから「ログ定義の編集」をクリックします。

iis_advanced_logging_08

ログ定義画面が表示されるので、「フィールドの選択」ボタンをクリックします。

iis_advanced_logging_09

ログ記録フィールドの選択画面が表示されます。利用可能なフィールドにX-Forwarded-Forが追加されているので、これを選択します。その後、OKボタンをクリックします。

iis_advanced_logging_10

ログ定義画面に戻るので、操作パネルの「適用」をクリックします。

iis_advanced_logging_11

操作パネルの「詳細ログに戻る」をクリックし、詳細ログ画面に戻ります。ログの設定が完了したので、操作パネルの「詳細ログを有効にする」をクリックします。

iis_advanced_logging_12

この後、IISを再起動します。

※この操作パネルにある「クライアント ログ記録を有効にする」は詳細ログ機能でサポートされているクライアントからのHTTP POSTリクエストをログする機能です。

・Advanced Logging for IIS - Client Logging
http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-client-logging

PCからAWS上のWindows ServerにELB経由でアクセスしてみる

実際にPCからIISにロードバランサー経由でアクセスして、ロードバランサのIPではなく、PCのIPを取得することができるかを確認してみます。

AWS上でELBを立てて、その配下にWindows Server 2008 R2を配置します。

ELBのヘルスチェック用にIISのデフォルトのindexファイル(c:\inetpub\wwwroot\iisstart.htm)をコピーし、index.htmlにリネームしておきます。

また、自分のPCがWebにアクセスする際のIPを予め調べておきます。

準備ができたら、Windows Serverにアクセスしてみましょう。EC2インスタンスに割り当てられているEIP、Public DNSをブラウザに入力します。

IIS 詳細ログをインストールすると標準ログに加えて、詳細ログが別途出力されます。

・標準ログ:C:\inetpub\logs\LogFiles\W3SVC1\ログファイル名.log

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2013-03-18 04:12:28
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2013-03-18 04:12:28 10.132.128.130 GET /index.html - 80 - 10.xx.xx.xx ELB-HealthChecker/1.0 200 0 0 156
2013-03-18 04:12:57 10.132.128.130 GET /index.html - 80 - 10.xx.xx.xx ELB-HealthChecker/1.0 200 0 0 0
2013-03-18 04:13:22 10.132.128.130 GET / - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 200 0 0 0
2013-03-18 04:13:22 10.132.128.130 GET /welcome.png - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 200 0 0 31
2013-03-18 04:13:22 10.132.128.130 GET /favicon.ico - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 404 0 2 0

・詳細ログ:C:\inetpub\logs\AdvancedLogs\ログファイル名.log

#Software: IIS Advanced Logging Module
#Version: 1.0
#Start-Date: 2013-03-18 04:12:28.639
#Fields:  date time cs-uri-stem cs-uri-query s-contentpath sc-status s-computername cs(Referer) sc-win32-status sc-bytes cs-bytes X-Forwarded-For
2013-03-18 04:12:28.140 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 122 -
2013-03-18 04:12:57.985 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 122 -
2013-03-18 04:13:22.697 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 496 "59.xx.xx.xx"
2013-03-18 04:13:22.697 / - "C:\inetpub\wwwroot" 200 "AMAZONA-ABCDEFG" - 0 913 496 "59.xx.xx.xx"
2013-03-18 04:13:22.775 /welcome.png - "C:\inetpub\wwwroot\welcome.png" 200 "AMAZONA-ABCDEFG" "http://cm-1234567890.ap-northeast-1.elb.amazonaws.com/" 0 185173 512 "59.xx.xx.xx"
2013-03-18 04:13:22.853 /favicon.ico - "C:\inetpub\wwwroot\favicon.ico" 404 "AMAZONA-ABCDEFG" - -2147024894 1382 447 "59.xx.xx.xx"

それぞれのログにはELBからのHealth Checkが2回行われ、PCブラウザからのELB経由でのindex.htmlへのリクエストが1回ログされています。

標準ログを見ると、それぞれの場合のアクセス元IPに同じIPアドレスが記録されています。

逆に、詳細ログを見るとログのレコードの最後に(存在する場合は)X-Forwarded-Forの値が記録されています(上記の59.xx.xx.xxの部分)

詳細ログのドキュメント

・Advanced Logging Module
http://www.iis.net/learn/extensions/advanced-logging-module