Apacheのログにポート番号を追加する

 最近ではVPNやバーチャルホスト、IPV6からIPV4変換サービス(NAT64)等、IPアドレスだけでは使用者(攻撃者)を特定できないケースが増えていることから、アクセスログに接続元のポート番号を追加する流れがあります。
 ローカル環境でログにポート番号を追加し、どのようなデータが取得できるのか確認しました。

環境

Ubuntu Apache 2.4.62
Windows Apache(httpd) 2.4.62

変更方法

confファイルを次のように修正し、サーバを再起動させることで変更が反映されます。
※修正する前にconfファイルのバックアップを取ってから作業しましょう。

# ubuntu -> /etc/apache2/apache2.conf
# windows -> インストール先フォルダ(Apache24)\conf\httpd.conf

# 現在のログフォーマット
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

↓

# ポート番号を表示するように修正したログフォーマット
LogFormat "%v:%p %h %{remote}p %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %{remote}p %p %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %{remote}p %p %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

ログの項目(プレースホルダ)説明

 順番や、区切り文字をある程度自由に変更できます。(\tでタブ区切りにすることもできる)

%v バーチャルホストのServerName
%h 接続元IPアドレス、またはホスト名
%{remote}p 接続元ポート番号 (mod_remoteip.soが必要)
%p 接続先(サーバ)ポート番号(接続先は通常80か443で固定になるので、必要性は低い)
%l リモートログ名(通常は”-“)
%u ユーザ名(通常は”-“、BASIC認証で使用)
%t リクエスト日時
%r メソッド、パス、HTTPバージョン
%s ステータスコード(成功が”200″)
%o 送信バイト数
%{Referer}i リファラー (どこから来たか)
%{User-Agent}i ユーザーエージェント

エラーが出た場合

%{remote}p をログに出力して、次のエラーが出た場合は、モジュールが不足している可能性があります。
windows用apache(httpd)では、次のエラーが出ました。

# apache起動時に次のエラーが出る場合の対応
# エラーメッセージ
c:\ > httpd restart
AH00526: Syntax error on line 302 of ****/2pache2/conf/httpd.conf:
Unrecognized LogFormat directive %O

私の環境では、confファイルを修正したところ正常に動作しました

#LoadModule logio_module modules/mod_logio.so
↓
LoadModule logio_module modules/mod_logio.so

取得したログデータ

ローカルサーバにアクセスしたログは次の通りです。

# gobuster のログ
192.168.0.244 50354 80 - - [29/Apr/2025:16:49:59 +0900] "GET /~user HTTP/1.1" 404 356 "-" "gobuster/3.6"

# web閲覧のログ
192.168.0.244 37788 80 - - [29/Apr/2025:20:43:16 +0900] "GET / HTTP/1.1" 200 328 "-" "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/28.0 Chrome/130.0.0.0 Mobile Safari/537.36"

 クライアントのポート番号と、サーバのポート番号が取得できているのがわかります。
 特にローカル開発を行う際には、サービスが占有しているポート番号と突合することでデバックも行いやすくなると思います。
 WirerSharkと並行して使うことで、今までより的を絞った解析ができるようになるのではないでしょうか。

まとめ

 ポート番号を追加してもログの総量は大きく変わりませんし、万が一の際には攻撃者を追跡する重要な資料となるかもしれません。
 私は可能な限りポート番号も記録しておくべきだと考えています。
 地方公共団体における情報セキュリティポリシーに関するガイドラインや、中小企業の情報セキュリティ対策ガイドラインを読んだのですが、結局ポート番号を載せるのか載せないのか明記されていないように感じています。(書いてあったら私の理解力不足なのですいません。)
 ガイドラインなのですから、ケースバイケースという言葉で責任を押し付けるのではなく、
    「こういう場合はこうしてください」
という、わかりやすくて明確なラインを示してほしいと思っています。