スパムアクセスがログに見つかり次第、適宜iptablesにてアクセス拒否を行うようにしていますが、これを行っている中で、少し気になったことが。
スパムアクセスもこのところそんなに頻繁にありませんし、それがあったところでサーバのレスポンスが・・・みたいなことを気にしなければならないサイト(Blog)でもないので、暇なときに手作業でぼちぼちアクセス制限を課していますが、その際にapacheのログ(とcounterize IIのアクセス記録)を眺めながら一つずつ探っています。
で、このapacheのログですが、不必要なログは取らないようにしていたモノの、このところ結構な頻度で(それだけBlogをまめに更新しているということか!?)ロボット検索エンジン(いわゆるクローラやボットと呼ばれるヤツですね)のアクセスのログが残されているんです。
この量が結構膨大で、すこーし邪魔っ気なんですよねー。
というわけで、色々と情報をあさって、httpsd.confに設定を施してみました。
ちなみに今回の変更前では単にログ設定はこうなっています。
#
# Original Log Management
#
SetEnvIf Remote_Addr “192.168.1.” no_log
SetEnvIf Request_URI “\.(gif)|(GIF)|(jpg)|(JPG)|(png)|(PNG)|(cgi)$” no_log
SetEnvIf user-agent “internal dummy connection” no_log
CustomLog /var/log/httpsd/access_log combined env=!no_log
デフォルトのLog Managementはコメントアウトし、新たに書き起こす形で付け加えていますが、この設定はLAN内からのアクセスはno_logに記録する、また画像ファイルへのアクセスもno_logに記録する、そして最後にinternal dummy connectionもno_logに記録する、という設定です。
そしてaccess_logには、このno_logに合致しないモノだけをログとして書き出すようにしています(no_logに合致するモノを書き出す設定は記述していないため、logディレクトリにno_logというログファイルは作成されない)。
ところで、新たに調べてみたところ、このSetEnvIfという環境変数の書式は次のようになるそうです。
SetEnvIf [リクエストの種類] [判定用パラメータ] [環境変数1] [環境変数2]・・・
上記の例であれば、リクエストの種類=リモートアドレス、判定用パラメータ=192.168.1.、そして環境変数1=no_logというわけですね。
ところが、環境変数はもっとたくさん割り当てられるようで。
これ、詳細はリンク先のページにあるのでそちらを見て頂ければよろしいのですが、その理由はたとえば私の上記の記載だと、192.168.1.からのアクセスをaccess_logには記録しないが別の(たとえばlan_logに)記録したい、というような時にその記述ができない、ということが理由です。
つまりaccess_logにはenv=!no_logで記録がとれますが、現状ではlan_logに記録するための条件指定が行えないんです。
ところがもし環境変数が二つセットされていれば(たとえばno_logとlan_log)、access_logにはenv=!no_logで、そしてlan_logにはenv=lan_logでそれぞれ別個にログを取ることが可能になるわけですね。
というわけで、とりあえず次のように書き換えてみました。
#
# Original Log Management
#
SetEnvIf Remote_Addr “192.168.1.” own_log no_log
SetEnvIf Request_URI “\.(gif)|(GIF)|(jpg)|(JPG)|(png)|(PNG)|(cgi)$” own_log no_log
SetEnvIf user-agent “internal dummy connection” own_log no_log
SetEnvIf User-Agent “Googlebot” bot_log no_log
# SetEnvIf User-Agent “Googlebot-Mobile” bot_log no_log
CustomLog /var/log/httpsd/access_log combined env=!no_log
CustomLog /var/log/httpsd/bot_log combined env=bot_log
変数own_logは特に書き出す設定をしていないので無くてもかまわないのでしょうけれども、書式が統一されていないのは何となくいやなので・・・。
で、この設定ではuser-agentにGooglebotが含まれるものという条件でbot_logとno_logにそれぞれ環境変数をセットしています。これはボットのログをaccess_logに残さないようにしつつ、ボットのアクセスはそれ自体を別のログファイルに残しておこうということです。
このUser-Agentをどのように設定すればいいのかがはっきり分かっていないのですが、そのため実験的にGooglebotのみを指定しました。実はGooglebotとは別に、Googlebot-MobileというUAからのアクセスもあるのですが、もしGooglebotというUAの設定でアスタリスク的にGooblebot-Mobileも切り分けられれば、書式はUAにその文字列が含まれる、という理解でOKになるでしょうし、切り分けられなければさらにログファイルのどの部分で指定しなければならないのかを追究しなくてはなりません(だからあえてGooglebot-Mobileの方はコメントアウトしてある)。
さて、とりあえずはこれで様子を見て、Gooblebotからのアクセス並びにGooblebot-Mobileからのアクセスがどのようにログに記録されていくのか、様子見をしてみましょう!
・・・なんか、様子見ばっかりですね・・・(^-^;;