はじめに
App ServiceでX-Forwarded-Forをアクセスログに残す方法を解説していきます。
App Serviceの前にAppllication Gatewayを立てる場合のログの保存にハマったので書いています。
構成図
要件
アクセス元(X-Forwarded-For)のIPをログに残したい。
ある種、インフラ屋の性ですね。
問題点
診断ログ(AppServiceHTTPLogs)を保存する場合、保存されるログのc-ipがAppllication GatewayのIPになってしまいます。
診断ログ(AppServiceHTTPLogs)はIISでいうカスタムログに対応しておらず拡張ができません。
解決方法
App Serviceにすでに組み込まれているARR Helperを利用します。
これはApplication Request Routingではできないアクセス元のログを保存することのできるIISモジュールです。
アクセス元IPは、Appllication GatewayでX-Forwarded-Forに記録されます。
ARR HelperはこのX-Forwarded-Forをログに保存します。
ARR Helperの設定変更を行うことで、c-ipがX-Forwarded-Forと入れ替わりログに書き込まれます。
設定変更
applicationHost.xdtでARR Helperの設定を上書き(追記)します。
applicationHost.xdtは新規に作成し「C:\home\site」 に保存します。
保存することで設定ファイルの本体であるapplicationHost.configが変更されます。
<?xml version="1.0" encoding="utf-8"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <system.webServer> <arrHelper> <trustedProxies trustUnlisted="true" xdt:Transform="SetAttributes(trustUnlisted)" /> </arrHelper> </system.webServer> </configuration>
Site ExtensionsのIIS Managerを利用すると楽です。
https://github.com/shibayan/IISManager
保存後は、「停止」「起動」を行います。(「再起動」でも大丈夫だと思うけど上手くいかなかった。)
修正箇所はIISの<proxyHelper>でなくは<arrHelper>になります。
適当なことを設定に書き込むとApp Service自体が正常に起動しない場合があります。
その場合は、FTPで接続してapplicationHost.xdtを削除してから再起動します。
確認
保存されているログを確認し、アクセス元IPが記録されていることを確認します。
IPはひとつだけ書き込まれます。
例えば、X-Forwarded-For : 1.2.3.4:3015,106.72.xxx.xxx:43103, 20.89.xxx.xx:4096 のように複数ある場合は1.2.3.4が書き込まれます。
まとめ
アクセス元IPを記録したい場合には上記の設定を行うとよいと思います。
通常はApp Service側で保存しなくても、Appllication Gatewayのログにアクセス元IPが保存されるので問題ないかと思います。
アクセス元IPを使用したアプリや、何かアラートを上げるなどの時には利用できると思います。
注意事項としてはX-Forwarded-Forは簡単に偽装できる点ですね。
そこが許容できるのであれば問題ないかと思います。
ログが拡張できれば楽なんですけどね。
以上