アクセスログをカスタマイズする
ウェブサーバーへのアクセスはすべて記録されている。「/var/loog/httpd」ディレクトリの中にある「access_log」や「error_log」などのファイルがアクセスログだ。このファイルを見れば、誰がいつどのファイルにアクセスしたのかが分かる。
ログは次のような形式になっている。これはあるウェブサイトのトップページで3つの画像を使ったときのログの例だ。1つのページにアクセスしたものだが、3つの画像がリンクされているので、ログの上では4行になる。
192.168.0.23 - - [06/Feb/2005:08:20:23 +0900] "GET /index.html HTTP/1.1" 200 5278 "http://www.hoge.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 192.168.0.23 - - [06/Feb/2005:08:20:23 +0900] "GET /image/logo.jpg HTTP/1.1" 200 47920 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 192.168.0.23 - - [06/Feb/2005:08:20:23 +0900] "GET /image/back.jpg HTTP/1.1" 200 41381 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 192.168.0.23 - - [06/Feb/2005:08:20:23 +0900] "GET /image/photo.jpg HTTP/1.1" 200 45235 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
1番上の行の場合、次のような情報が読み取れる。生のログはわかりにくいけれども、ログ解析ソフトを使うと、自分のサイトへのアクセスの傾向をつかむことができる。特にリンクをたどってきたときのリンク元の情報からは、どういうサイトから自分のサイトへ誘導されてきたかが分かる。その傾向をつかめば、自分のサイトのアクセスをのばすのに役立てられるはずだ。
| アクセス元のIPアドレス | 192.168.0.23 |
| アクセスした時間 | 2005年2月6日 8時20分23秒 |
| アクセスしたファイル | index.html |
| アクセスした結果 | 200(正常) |
| アクセスしたファイルのサイズ | 5278バイト |
| リンクをたどってきたときのリンク元 | http://www.hoge.com/ |
| 使用しているブラウザの種類 | IE6.0、WindowsXP |
ちなみにアクセスした結果(ステータスコード)は次のような意味を持っている。ユーザーがよく目にするのはエラーをあらわす400番台と500番台のメッセージだろう。
| 200 | OK | 正常 |
| 301 | Moved Permanently | 指定したURLのデータが別の場所に移動した |
| 304 | Not Modified | 指定したURLのデータは更新されていない |
| 400 | Bad Request | クライアントから不正なコマンドを受け取った |
| 401 | Unauthorized | アクセス制限されているページで認証されなかった |
| 403 | Forbidden | アクセスが禁止されているURLを要求した |
| 404 | Not Found | 指定したURLが見つからない |
| 405 | Method Not Allowed | クライアントからのリクエストを使用できない |
| 408 | Request Timeout | サーバーが時間内にリクエストに応答できなかった |
| 500 | Internal Server Error | サーバーエラーでリクエストを実行できなかった |
自分がアクセスしたログを残さない
アクセスログにはゴミがまじることがある。まずは自分がアクセスしたログだ。うまくページが表示されているかテストをするけれども、アクセスログにはその記録まで残されてしまう。自分のアクセスを記録しても分析には役立たないので、LANの中からアクセスしたときは記録をとらないように設定してみよう。
viでhttpdの設定ファイル「/etc/httpd/conf/httpd.conf」を開く。610行目あたりに「CustomLog
/var/log/httpd/access_log combined」という記述があるはずだ。その近くに次の一行を追加しよう。また、「Customlog」で始まる行にも記述を追加する。これで自分のサイトからのアクセスは記録されなくなる。
# # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a <VirtualHost> # container, they will be logged here. Contrariwise, if you *do* # define per-<VirtualHost> access logfiles, transactions will be # logged therein and *not* in this file. # # CustomLog /var/log/httpd/access_log common CustomLog /var/log/httpd/access_log combined env=!no_log ←太文字を追加 SetEnvIf Remote_addr 192.168.0. no_log ←この一行を追加
上の例の場合、LANの中のプライベートIPアドレスが「192.168.0.×」であるときの設定だ。「192.168.0.」から始まるアドレスはログから除外するように設定している。別のプライベートIPアドレスで運用しているときはそのアドレスに書き換えよう。
ワームのログを記録しない
ワームの中には無差別にIPアドレスを指定して攻撃をかけてくるものがある。ウェブサーバーを運用していると、一日に何件もワームからのアクセスを受け、意味のない記録がログの中に残される。中には一度に32KBという巨大なサイズの要求を送ってくるワームがあって、そのままログに記録しているとサイズが途方もない大きさになってしまう。
ワームのログを記録しない方法には2つある。ひとつは特定の文字列を含む要求は無視するように設定するものだ。LANの中からの設定をログからはじくように設定したのと同じ要領でワームのログも残さないようにできる。ワームが送りつけてくる要求はワームごとに決まっているので、その文字列を指定しておけばいい。次が設定の例だ。太文字の部分を追加する。
# # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a <VirtualHost> # container, they will be logged here. Contrariwise, if you *do* # define per-<VirtualHost> access logfiles, transactions will be # logged therein and *not* in this file. # # CustomLog /var/log/httpd/access_log common SetEnvIf Remote_addr 192.168.0. no_log SetEnvIf Request_URI "^/_mem_bin/" nolog SetEnvIf Request_URI "^/_vti_bin/" nolog SetEnvIf Request_URI "^/c/" nolog SetEnvIf Request_URI "^/d/" nolog SetEnvIf Request_URI "^/msadc/" nolog SetEnvIf Request_URI "^/MSADC/" nolog SetEnvIf Request_URI "^/scripts/" nolog SetEnvIf Request_URI "^/default.ida" nolog CustomLog /var/log/httpd/access_log combined env=!no_log
だが、この方法では新種のワームが出てきたら、httpd.confを編集し直さなければならない。そこで第二の方法である。ワームはIPアドレスを指定して要求を送りつけてくることを利用して、ドメイン名ではなく、IPアドレスでアクセスしてきたログを残さないように設定する。これには別のページで紹介しているバーチャルホストの機能を使う。
バーチャルホストの設定は1050行目くらいにある。太字の部分を追加しよう。
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
#
#<VirtualHost ip.address.of.host.some_domain.com>
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#</VirtualHost>
#<VirtualHost _default_:*>
#</VirtualHost>
<VirtualHost *>
ServerName worm
DocumentRoot /home/httpd/worm ←架空のディレクトリ
CustomLog logs/worm_access_log common ←ワーム用のログ
Errorlog logs/worm_error_log ←ワーム用のログ
</VirtualHost>
<VirtualHost *>
ServerName www.mydomain.com ←自分の本来のアドレスを指定
DocumentRoot /home/httpd/html ←データのディレクトリ
</VirtualHost>
ワームに関する記述はいちばん最初に記述する。IPアドレスでアクセスしてきたものは、すべてのこの記述に引っかかり別のファイルにログをまとめておく。そして、次のバーチャルホストで本来のアドレスを指定する。
画像ファイルへのアクセスを記録しない
ウェブページではロゴや背景などの画像もたくさん使う。このアクセスもログに記録されるが、あまり解析に役立つ情報ではないのにサイズだけは大きくなる。画像中心のサイトを作っているのでなければ、画像ファイルへのアクセスを記録しないように設定できる。特定の拡張子を持つファイルへのアクセスは無視するように設定するのだ。上のLAN内からのアクセスを記録しない設定と同じ場所に、次のように記述を追加する。
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
# CustomLog /var/log/httpd/access_log common
SetEnvIf Request_URI "\.(gif)|(jpeg)|(jpg)|(png)$" no_log ←この一行を追加
SetEnvIf Remote_addr 192.168.0. no_log
CustomLog /var/log/httpd/access_log combined env=!no_log
追加した設定は拡張子として「gif」「jpeg」「jpg」「png」を持つファイルへのアクセスは記録しないというもの。他にも無視したいファイルがあれば、同じ要領で追加していくといい。
簡単な形式でログを記録する
標準の設定では上のように「IPアドレス」「時間」「ファイル名」「結果」「サイズ」「リンク元」「ブラウザの種別」の情報が記録されたが、そこまで詳細な情報は必要ないというときは「リンク元」「ブラウザの種別」を省いた簡単な形式でログをとれる。ブラウザの種別の情報がけっこう分量が大きいので、この設定変更でログのサイズは半分近くまで減るはずだ。特にアクセスが多いサーバーや非力なサーバーでは有効だろう。
設定の変更は1カ所。「CustomLog」の行を次のように変更する。
Custom /var/log/httpd/access_log combined ↓ Custom /var/log/httpd/access_log common
IPアドレスのかわりにホスト名を記録する
IPアドレスを見るだけではどこからアクセスしてきたのかわかりにくい。IPアドレスのかわりにホスト名をログに残すように設定しよう。この設定変更を行うとアクセスがあったたびに、DNSサーバーに対してIPアドレスの逆引きを行ってホスト名を取得する。アクセスが殺到する人気ウェブサイトでは負荷がかなりかかるはずなので、設定変更は慎重に行うべきだと思う。
また、ログ解析ソフトによっては解析のときに逆引きをおこえるものがあり、その場合はIPアドレスのままログをとっておいてもかまわない。生のログを直に見て分析したいという人は別だが。
設定を変更するのはCustomLogから20行くらい上にある「HostnameLookups」という行だ。この設定をOffからOnに変更する。
HostnameLookups off
↓
HostnameLookups on