(2004-4-7)
Apache のカスタムログ設定
長期間運用していると、Apache のログファイルは膨大*1になる。
その中には、画像ファイルへのリクエストや自分のデバッグ時のアクセスも記録される。
これらのアクセス記録が不要と判断し、ログ採取を行わない様に設定する。
(もちろん、サイトによっては重要な情報である。)
採取するログを限定する事でログの内容を解析しやすくなるのは事実である。
工夫次第では、無用のログを記録する必要がなくなりパフォーマンスも向上するかもしれない。
画像ファイルへのアクセスを記録しない
Apache のログは画像ファイルへのリクエストも記録する。
サイトによっては重要な情報だが、不要と判断できる場合も多い。
デフォルトのログ設定のままだと、「 index.html 」に「 001.gif 」と
「002.gif 」2つの画像がある場合、ログは以下の3行になる。
999.99.99.99 – – [27/Jul/2003:04:03:48
+0900] “GET /index.html HTTP/1.1” 200 6826 “-” “Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.0)”
999.99.99.99 – – [27/Jul/2003:04:03:49 +0900] “GET
/001.gif HTTP/1.1” 200 38430 “-” “Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.0)”
999.99.99.99 – – [27/Jul/2003:04:03:49 +0900] “GET
/002.gif HTTP/1.1” 200 44816 “-” “Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.0)”
ログファイルの肥大化を防ぐため、画像ファイルへのリクエストに対してログに
記録しない設定にする。
ここでは、「 mod_setenvif 」というモジュールを使用する。
念のため httpd.conf に以下の記述がある事を確認する。
LoadModule setenvif_module modules/mod_setenvif.so
AddModule mod_setenvif.c
Windowsでは、AddModule の記述は不要。
httpd.conf の中に画像ファイルのログ採取に関する以下の記述を追加する。
環境変数「 no_log 」の行にはログ採取しないファイルの拡張子を記述する。
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
追加する場所は Addmodule 以下ならどこでも構わないが、LogFormat や
CustomLog の記述がある辺りへの記述を薦める。
次に CustomLog に関する記述を編集する。
デフォルトの記述
CustomLog logs/access.log combined
↓
CustomLog logs/access.log combined env=!no_log
設定ができたら、Apache を再起動し、変更を反映させます。
この様に記述を変更する事で、環境変数「 no_log 」で指定したものを以外の
ログ採取するようになる。
特定のホストからのアクセスを記録しない
Apache のログには全てのアクセスに対し、ログ採取を行う。
自分から(または同一 LAN 内)からのアクセスは余り必要ではないので、
ログを記録しない様に設定する。
httpd.conf 中の LogFormat や CustomLog の記述がある辺りに以下の記述を追加する。
SetEnvIf Remote_Addr 192.168.0. no_log
CustomLog logs/access_log combined env=!no_log
こうする事により 192.168.0.* からのアクセスは一切ログを記録しない。
前項の「 画像ファイルへのアクセスを記録しない 」の中の
環境変数である「 no_log 」と同一です。
以下の様に記述すると、2つの SetEnvIF の内容が反映されます。
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
SetEnvIf Remote_Addr 192.168.0. no_log
CustomLog logs/access.log combined env=!no_log
Worm のアクセスを別ファイルに記録する
上記の方法を利用して、Worm のログを別のログファイルに採取する事も可能である。
ここでは、先述の画像に関する事と、特定のホストに関するログとも併せて記述
してみた。
# 画像ファイルへのログ採取をしない
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
# 特定のホストからのアクセスはログ採取しない
SetEnvIf Remote_Addr 192.168.0. no_log
# Worm に関するログは別ファイルに記録します
SetEnvIf Request_URI "\.(ida|IDA|exe|printer|asp|dll)" no_log
SetEnvIf Request_URI "^/_mem_bin/" worm no_log
SetEnvIf Request_URI "^/_vti_bin/" worm no_log
SetEnvIf Request_URI "^/c/" worm no_log
SetEnvIf Request_URI "^/d/" worm no_log
SetEnvIf Request_URI "^/msadc/" worm no_log
SetEnvIf Request_URI "^/MSADC/" worm no_log
SetEnvIf Request_URI "^/scripts/" worm no_log
SetEnvIf Request_URI "^/default.ida" worm no_log
SetEnvIf Request_URI "root\.exe" worm no_log
SetEnvIf Request_URI "cmd\.exe" worm no_log
SetEnvIf Request_URI "NULL\.IDA" worm no_log
# no_log に該当しないものを access_log に記録
CustomLog logs/access.log combined env=!no_log
# worm に該当するものを worm_log に記録
CustomLog logs/worm.log combined env=worm
#----- エラーを記録するレベル
LogLevel warn
#----- ログ形式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#----- 環境変数の設定
SetEnvIf Request_URI "\.(ida|IDA|exe|printer|asp|dll)" no_log
SetEnvIf Request_URI "\.(gif|jpg|png|css|ico)$" no
SetEnvIf Remote_Addr "^192\.168\.[0-9]+\.[0-9]+$" no_log
#----- ログファイルの位置
CustomLog logs/axs.log combined env=!no_log
CustomLog logs/no.log combined env=no_log
ErrorLog logs/error.log
W32.HLLW.Gaobot.gen
http://www.symantec.com/region/jp/sarcj/data/w/w32.hllw.gaobot.gen.html
一回のアクセスで 32KB! という恐ろしく長大なログを残す不具合
218.XXX.XXX.79 - - [01/Apr/2004:09:56:17 +0900] "SEARCH /\x90 ...
\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02 ...(中略)...
\x90\x90\x90\x90" 414 271 "-" "-"
こういうログです。2004年4月以降、頻繁に見かけるようになった。
この出現によって、アクセスログは約2倍のペースで増加するようになった。W32.HLLW.Gaobot.gen という名のワーム?は、IIS サーバの
WebDAV脆弱性を狙ったアクセスとの話ですが、詳細は不明*2である。
サーバのステータスコードも”リクエスト長すぎ!”という意味の 414 で
このログは前述した SetEnvIf でログを分ける方法が通用しない。
対応策としては、
- W32.HLLW.Gaobot.genのアクセスログを取り除くシェルスクリプトを用意
- ダミーのバーチャルサーバを用意し、対応する
Windows環境ではシェルスクリプトは難しいし、cron も使えないので、
2番目のダミーのバーチャルサーバを用意して回避する。
httpd.conf で
NameVirtualHost XXX.XXX.XXX.XXX:80
#===== ダミーバーチャルホスト
<VirtualHost XXX.XXX.XXX.XXX:80>
ServerName worm
DocumentRoot /home/httpd/worm
</VirtualHost>
#===== 以下に通常のバーチャルホスト(ログは別途、設定のこと)
<VirtualHost XXX.XXX.XXX.XXX:80>
ServerName www.sample.com
:
:
</VirtualHost>
という風に、通常の公開用とダミーの2つのバーチャルホストを用意する。
/home/httpd/worm は空のディレクトリを割り当てる。 特に記述しない事項は
継承されるため、バーチャルホスト固有の設定のみを書けば良い。
ホスト名ではなく、IPアドレスでアクセスしてくるものは、ダミーの
バーチャルホストに振り分ける。これにより無用なアクセスを分離できる。
注意点として、数は少ないが一部ロボットや通常(正規)のアクセスでも、
ホスト名ではなくIPでアクセスしてくる場合があり、一括して除外しては
いけない場合もあるので注意が必要
(ちなみにGoogleはちゃんとホスト名でアクセスしている)である。