Apache httpd(v2.4)で特定の範囲のIPv6アドレスからのHTTPS接続によるアクセスを別のログファイルに記録する方法

By | 2017年5月29日 , Last update: 2018年9月17日

まず、前置き。

個人的にブログサイトのようなものが稼働しているサーバを管理していると、外出先からでもサイトの状況を確認したいことがかなり頻繁にあります。そんなときにPCが使えない状況や取り出すのが難しい状況だったりでスマホしか使えない状況だったりすると、できればあまり余計な情報は表示せず必要な情報だけ取得したいものです。

「そんなときにどうやってスマホからWebサーバのシェルにアクセスするの?」というつっこみはあると思いますが、自分はスマホのSSHクライアントとしてVX ConnectBotを使用しています。使用方法については別の記事で気が向いたら書きます。

「Webサーバのログファイルで必要な情報を見たいけど、自分がアクセスした情報も同じログファイルに一緒に記録されているので、本来見たい情報になかなかたどり着けなかったり、見逃したりして何度も見直しているうちに、スマホの通信状態が悪くなったりして、Webサーバへの接続からやり直し、…(以下ループ)」というような事態が発生すると、スマホの電池の消耗の原因になるだけなので、上記のような事態に陥るのはできるだけなしにしたいわけです。さらにサーバにIPv6アドレスが割り当てられていたり、自宅のLAN上のPCにもIPv6アドレスが割り当てられていると、ログファイルに記録されているIPv6アドレスのうちの一部についても自分がアクセスした情報とみなして設定を行う必要が出てきます。

スポンサーリンク

ここからが、本題です。

ということで、前置きが長くなりましたが、本記事ではApache httpd(v2.4)で特定の範囲のIPv6アドレスからのHTTPS接続によるアクセスを別のログファイルに保存するよう設定する方法について書きます。

設定の方法

以下の手順でssl.confを編集していきます。

  1. 以下の設定をssl.confのVirtualHostの直後に追加します。するとabcd:efgh:jikl:mnop::/64というアドレスからのアクセスがあった場合に環境変数log_from_localがセットされます。
    SetEnvIf Remote_Addr “^abcd:efgh:jikl:mnop:” log_from_local
  2. HTTPS接続によるアクセスを記録するログファイル(httpdのデフォルトの設定ではssl_access_logですが、異なる場合には適宜読み替えてください。)を設定する行を探し、以下のように変更する。なお、ssl.confのデフォルトの設定ではTransferLogが使用されているが、そのままだと環境変数の設定を反映することができないので、CustomLogを使用するように変更しています。
    LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-agent}i\”” pandanote_combined
    CustomLog /var/log/httpd/ssl_access_log pandanote_combined env=!log_from_local
    CustomLog /var/log/httpd/ssl_access_log_local pandanote_combined env=log_from_local

     
    手順1の設定と合わせると、以下のように設定されていればOKです。

    SetEnvIf Remote_Addr “^abcd:efgh:jikl:mnop:” log_from_local

    # 中略

    LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-agent}i\”” pandanote_combined
    CustomLog /var/log/httpd/ssl_access_log pandanote_combined env=!log_from_local
    CustomLog /var/log/httpd/ssl_access_local_log pandanote_combined env=log_from_local

  3. httpdを再起動する。
  4. /var/log/httpd/ssl_access_local_logが作成されているかどうか確認する。

別のログファイルに記録したいIPアドレスの範囲が複数ある場合

上記のSetEnvIfのIPアドレスの設定は正規表現による設定なので、別のログファイルに記録したいIPアドレスの範囲が2個ある場合には、上記の手順1の

SetEnvIf Remote_Addr “^abcd:efgh:jikl:mnop:” log_from_local

 

SetEnvIf Remote_Addr “^(abcd:efgh:jikl:mnop:|zyxw:pqrs:vuts:rqpo:)” log_from_local

 
に変更すると、abcd:efgh:jikl:mnop::/64に加えて、zyxw:pqrs:vuts:rqpo::/64というアドレスからのアクセスがあった場合にも環境変数log_from_localがセットされます。同様にIPアドレスの範囲が\(n\)個存在する場合には、その範囲を上記のRemote_Addrの括弧内に’|’でつなげて書けばOKです。

ハマりどころ

手順2でも書きましたが、TransferLogは環境変数を設定できないため、単純に以下のように設定するとhttpdが起動できなくなって、かなり焦ります。

# 誤った設定。Don’t use!!
TransferLog /var/log/httpd/ssl_access_log env=!log_from_local

この記事は以上です。