はじめに
アクセス数が不定期に増加しているサーバーがあり、アクセスログを調査することとなった。
だけど、アクセスログにはクライアントIPが表示されていなかったので、その原因調査と解決までを備忘録として残す。
現状確認
クライアントIPが表示されていない。。。
- - - [28/Mar/2022:18:41:12 +0900] "GET /wpgs/wp-content/themes/xxxxx/assets/image/xxxxxx HTTP/1.1" 200 92291 "https://xxxx.xxxx.xxx.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/--.-.----.-- Safari/---.--"
そもそもクライアントIPを表示させる設定になっているのか??
原因調査〜その1〜
まずはログフォーマットを確認してみる。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-elb
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
CustomLogの設定だと、一番上のフォーマット(combined)が使われていることがわかる。
アクセス元IPを表示させる%hは設定されている。
でも今回はELB経由でのアクセスだから、クライアントIPを表示させるには、%hじゃなくて%{X-Forwarded-For}iを設定しないといけない。
Infomation
ELB経由のアクセスログにクライアントIPを表示させるには
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-capture-client-ip-addresses/
原因調査〜その2〜
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-elb
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" combined
では、2つ目のフォーマット(combined-elb)に%{X-Forwarded-For}iが設定されているから、CustomLogの設定を修正すればいいのか。
あと、アクセスログの出力先は、logs/hogehoge.com-access_log
だから、CustomLogに設定されているlogs/access_log
も修正しないといけないな。
・・・ん?
この推測だと現状のログ表示は、%hが設定されているんだから、ELBのIPが表示されるはず。
なんでログにハイフン(-)が表示されるんだ???
調査を進める。
原因調査〜その3〜
今回はVirtualHostを設定しているので、設定ファイルを見てみる。
Infomation
VirtualHostとは?
https://httpd.apache.org/docs/2.4/ja/vhosts/
<VirtualHost *:80>
ServerName hogehoge.com
ServerAlias hogehoge.com hugahuga.com
DocumentRoot /var/www/hogehoge.com/
CustomLog logs/hogehoge.com-access_log combined-elb
ErrorLog logs/hogehoge.com-error_log
</VirtualHost>
こちらのCustomLogではcombined-elbを指定しているので、%{X-Forwarded-For}iが設定されているフォーマットが適用されていることがわかった。
ここまでの調査でCustomLog周りの設定で問題はなさそうだな。。。
じゃあなぜアクセスログにクライアントIPが表示されないのか。。
## 原因調査〜その4〜
何か別の設定が影響しているのではないか。。
X-Forwarded-For周辺の設定を確認してみる。
>> cat /etc/httpd/conf/httpd.conf |grep X-Forwarded-For
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-elb
RemoteIPHeader X-Forwarded-For
RemoteIPHeader!!!!
こいつだww!!
この設定で、X-Forwarded-ForHTTPヘッダーがクライアントIPを判定してるが、
そもそもApacheのログフォーマットの定義で、RemoteIPの場合は%aを使用する必要がある。
Infomation
LogFormatの書式
https://httpd.apache.org/docs/2.4/ja/mod/mod_log_config.html
ってことで、以下に修正すればOK。
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-elb
⇩
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-elb
解決編
実際に変更してみた。
> sed -i".bak" "s/{X-Forwarded-For}i/a/g" /etc/httpd/conf/httpd.conf # 念のためバックアップ取ってファイル修正
> diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak # 差分確認
> apachectl configtest # Apacheの構文チェック「Syntax OK」を確認
> systemctl restart httpd.service # Apache再起動
作業後、アクセスクライアントIPが表示されることが確認できた。
> tail -f hogehoge.com-access_log
xxx.xxx.xxx.xxx - - [28/Mar/2022:19:41:12 +0900] "GET /wpgs/wp-content/themes/xxxxxx/assets/image HTTP/1.1" 200 4604 "https://xxxx.xxxx.xxx.com" "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/------ Safari/---.-"
お疲れ様でした。