【ALB】アクセス元IPアドレスをApache/Nginxアクセスログに出力する
Skrumエンジニアの福島です。
開発したアプリケーションをリリース後に運用・保守していくためには、Webサーバーへの送信元IPアドレスをアクセスログとして取得し保存しておくことは重要事項かと思います。今回は AWS のELB(ALB)使用下での EC2 インスタンス上の Webサーバーアクセスログ設定を紹介したいと思います。
まず、ALB を経由せずにクライアントから直接 EC2 インスタンス上のWebサーバーへアクセスする構成としている場合です。この場合では、デフォルトのWebサーバー設定のままでもアクセスログにクライアント IP アドレスが記録される状態になっているので問題ありません。しかし、ALB を経由してアクセスする構成の場合では、デフォルトの設定のままだと ALB の IP アドレスのみがアクセスログに記録されることになります。これは ALB がリバースプロキシであるためです。
この状態では、アプリケーションへのアクセス元 IP を調査しようとしても IP アドレスを追跡することができません。ALB にアクセスしてきているクライアントの IP アドレスをログに記録するためには以下の設定をWebサーバーの設定ファイルに追記する必要があります。
Apache の場合は、LogFormat セクションで、次のように %{X-Forwarded-For}i を追加します。
...
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
...
Nginx の場合は、LogFormat セクションで、次のように $http_x_forwarded_for を追加します。
http {
...
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
...
}
追記が完了したら設定を保存し、Webサーバーを再起動すれば作業としては完了になります。
今回の設定で重要なのは、X-Forwarded-For でしょう。
X-Forwarded-For は説明としては以下のようにされています。
X-Forwarded-For (XFF) ヘッダーは、 HTTP プロキシーサーバーを通過してウェブサーバーへ接続したクライアントの、送信元 IP アドレスを特定するために事実上の標準となっているヘッダーです。
X-Forwarded-For – HTTP | MDN (2023/02/11現在)
仮に今回のようにクライアントからALBを1つ経由してWebサーバーにアクセスする場合は、X-Forwarded-For に ALB へアクセスした接続元の IP アドレスが格納されていることになりますね。
また、参考までですが、複数のプロキシサーバーやALBを経由する場合は、X-Forwarded-For に経由してきた順でアクセス元 IP アドレスがカンマ区切りで格納されていくようです。
X-Forwarded-For – HTTP | MDN (2023/02/11現在)X-Forwarded-For: <client>, <proxy1>, <proxy2>
上記の引用例では、クライアントの端末から順に proxy1 サーバー、proxy2 サーバーと順にアクセスしてきており、X-Forwarded-For にクライアントの IP アドレス、proxy1 サーバーの IP、proxy2 サーバーの IP アドレスが格納されている状態になります。
今回は ALB 単体経由でのWebサーバーアクセスログ設定ですが、複数のプロキシサーバーを経由した構成でのアクセス制限やログ記録を設定する場合に十分な理解が求められてくる項目かと思います。
本記事はここまでにしますが、ぜひ参考にしてもらえればと思います。