Azure

Azure App ServiceでX-Forwarded-Forをアクセスログに残す方法

はじめに

App ServiceでX-Forwarded-Forをアクセスログに残す方法を解説していきます。
App Serviceの前にAppllication Gatewayを立てる場合のログの保存にハマったので書いています。

構成図


Windows限定です。

要件

アクセス元(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は簡単に偽装できる点ですね。
そこが許容できるのであれば問題ないかと思います。

ログが拡張できれば楽なんですけどね。

以上

-Azure
-, ,