Azure Application Gateway利用した時のApacheアクセスログについて

 

Application Gatewayからバックエンド側への通信はローカルIPで実施されます。

バックエンドプールにあるWebサーバログのアクセス元IPが、Application GatewayのローカルIPになります。この点はAzure Load Balancer を使った場合等との違いになります。

実際にApacheのアクセスログを確認した時に、すべてApplication GatewayのIPが表示されていました。

接続元の実IPはX-Forwarded-Forに含まれているとの事で、実IPを確認する為にはX-Forwarded-Forから戻す必要があります。

今回はApacheのaccess.logにX-Forwarded-For(実IP)が表示されるようにしてみました。access.logのsyslog化も併せて実施してみました。

Application Gatewayの作成については下記記事を参考にして頂ければと。

Azure Application Gatewayを構築してみた

1.Application Gatewayを利用した場合のApacheアクセスログを確認する

Application Gateway利用した場合のバックエンド側にあるApacheのアクセスログを確認してみました。

Azure Load Balancer利用時は実IPが表示されますが、今回はアクセス元IPがApplication GatewayのIPになっている事が分かります。

192.168.X.4 – – [16/May/2019:09:54:00 +0900] “GET / HTTP/1.1” 200 17540 “-” “-“
192.168.X.5 – – [16/May/2019:09:54:02 +0900] “GET / HTTP/1.1” 200 17540 “-” “-“
192.168.X.4 – – [16/May/2019:09:54:13 +0900] “GET /favicon.ico HTTP/1.1” 200 – “http://www.XXX.com/” “Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36”
192.168.X.4 – – [16/May/2019:09:54:30 +0900] “GET / HTTP/1.1” 200 17540 “-” “-“
192.168.X.5 – – [16/May/2019:09:54:32 +0900] “GET / HTTP/1.1” 200 17540 “-” “-“

実IP確認の為には、X-Forwarded-Forの値をアクセスログに表示させる必要がある事が分かります。

2.X-Forwarded-Forを表示するようにApacheを設定変更する

Apacheの設定変更は、httpd.confで行います。今回は以下の2点を実施しています。

    • httpd.confのLog Formatの変更(X-Forwarded-Forを表示させる)
    • CustomLog、ErrorLogのsyslog化(サンプルはLocal6を指定(環境に合わせて設定))

[root@test-vm ~]#cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.`date “+%Y%m%d”`
[root@test-vm ~]#vi  /etc/httpd/conf/httpd.conf

#変更前

ErrorLog “logs/error_log”
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
CustomLog “logs/access_log”

#変更後

  LogFormat “%{X-Forwarded-For}i \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
CustomLog “|/usr/bin/logger -p local6.info -t httpd_access” combined

ErrorLog “|/usr/bin/logger -p local6.info -t httpd_error”

※access log、error log両方local6に出力する設定です。
※Logに出力される日時は、syslog側で付与するので、LogFormatから削除しています。

3.rsyslogファイル作成

rsyslog側の設定を行います。

ApacheのLog出力先にlocal6を指定したので、rsyslog側でLocal6のファイル出力先を指定します。そのままだとmessagesにも出てしまうので除外指定も行います。

#新規にファイルを作成し、下記を追加する。

[root@test-vm ~]#vi /etc/rsyslog.d/httpd.conf

local6.* /var/log/httpd/access.log

#このままだと、messagesにも表示されてしまうので、rsyslog.confも編集する。

[root@test-vm ~]#cp -p /etc/rsyslog.conf /etc/rsyslog.conf.`date “+%Y%m%d”`

[root@test-vm ~]#vi /etc/rsyslog.conf

#変更前
*.info;mail.none;authpriv.none;cron.none; /var/log/messages

#変更後
*.info;mail.none;authpriv.none;cron.none;local6.none var/log/messages

4.Application Gatewayの正常性プローブアクセスをログから除外する

Application Gatewayはバックエンドの正常性を確認する為、バックエンド側のWEBサーバへ正常性プローブのアクセスを行います。

そのままだとこのアクセスがApacheのアクセスログに表示されてしまいLogが見にくくなります。

今回は正常性プローブのアクセスを、rsyslogでignoreを使って除外設定を行います。

#新規にファイルを作成し、下記を追加する。

[root@test-vm ~]#vi /etc/rsyslog.d/httpd-logstop.conf

msg, contains, “GET / HTTP/1.1” stop

#※除外の文字列は今回のLogFormatに合わせてます。

5.logrotate.dの設定を行う

今回はrsyslog化の設定と併せて、Apacheのaccess.logのログローテの設定を行ってみました。設定後、rsyslogおよびhttpdの再起動を行います。なお設定は環境に合わせて適時変更して下さい。

[root@test-vm ~]#cp -p /etc/logrotate.d/httpd /etc/logrotate.d/httpd.`date”+%Y%m%d”`
[root@test-vm ~]#vi  /etc/httpd/conf/httpd.conf

#設定ファイルの中身を下記記載に置き換えます。

/var/log/httpd/access.log {
 daily
 rotate 32
 nocompress
 ifempty
 missingok
 create
 sharedscripts
 postrotate
  /sbin/service httpd graceful > /dev/null 2>/dev/null || true
 endscript
}

#今回は32日保管で、ローテ後圧縮にしています。

[root@test-vm ~]#systemctl restart httpd

[root@test-vm ~]#systemctl restart rsyslog

6.出力されたApacheのアクセスログを確認する

設定が完了後のログを確認してみました。

/var/log/httpd/access.logに、アクセス元のIPが表示されている事が確認できました。

May 27 15:49:39 webサーバ名 httpd_access: XXX.XXX.XXX.XXX:XXX “GET /favicon.ico HTTP/1.1” 200 – “http://www.XXX.com/” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36”

今回はCentOS7で実施しています。Apacheのバージョン等により設定が異なると思いますので、適時環境に合わせて修正して頂ければと。