apaheの設定ファイルはhttpd.confに書かれている。しかし、これにサイト固有の設定を書いる場合、updateしたりして設定ファイルが変更になったりすると、自分の設定にまた書き直すなど面倒な作業が出てくる。
幸い、apacheにはInclude文があり、個別のファイルに設定を記述して取り込むことが出来るので、これを使うことにする。今回は、サイト固有の設定をhttpd-site.confに記述し、httpd.confの中で、次のように取り込む事にする
Include conf/httpd-site.conf
ネット上でググって見ると、内部からのログは記録しない方法は、沢山探し当てることが出来るが、内部と外部のアクセスログを別に記録する方法はなかなか見つからない。
自分の場合、webアプリケーションの開発なんかもやっているので、内部のログもデバッグなどに使用するので残しておきたい。うーーーんと小一時間程考えたら、SetEnvIfで簡単に出来ることがわかりました。
SetEnvIf Remote_Addr "[0-9]*" inter-net=1
SetEnvIf Remote_Addr "192\.168\.0\.*" local-net=1 !inter-net
CustomLog logs/access_log combined env=inter-net
CustomLog logs/access_local_log combined env=local-net
このようにすることで、ログファイルを分けることが出来ました。
最初、下記のように設定していたのですがうまく動かなくてハマってしまいました。
SetEnv inter-net 1
SetEnvIf Remote_Addr "192\.168\.0\.*" local-net=1 !inter-net
CustomLog logs/access_log combined env=inter-net
CustomLog logs/access_local_log combined env=local-net
これだと、内部からのアクセスの場合local-netは定義されるのですが、inter-netの定義が消えてくれず、結果としてaccess_logとaccess_local_logの両方に内部からのアクセスログが記録されてしまいました。どうやら、SetEnvで定義した値は、SetEnvIfでは認識してくれないようです。
画像のログを記録しておくと、ファイルサイズが直ぐに大きくなってしまうので、記録しないようにします。
SetEnvIfNoCase Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)$" nolog=1
SetEnvIf nolog 1 !inter-net !local-net
このようにすれば、access_logにもaccess_local_log記録されません。
ログを記録してしばらくすると、あるはずのない「dafault.ida」や「NULL.IDA」といった名前のファイルにアクセスがあることがわかります。これがいわゆるワームで、そのまま記録しておくとウザイので別ファイルに記録することにします。
こいつらは、RefererとUser-Agentが無いと言う特徴があるので、RefererとUser-Agentが空白なものはワームとする、と言うちょっと強引な方法で設定しています。
SetEnvIf Remote_Addr "[0-9]*" worm=1
SetEnvIf Referer "[[:graph:]]{1,}" !worm
SetEnvIf User-Agent "[[:graph:]]{1,}" !worm
SetEnvIfNoCase Request_URI "\.ida" worm=1
SetEnvIfNoCase Request_URI "\.dll" worm=1
SetEnvIfNoCase Request_URI "\.exe" worm=1
SetEnvIfNoCase Request_URI "\.bat" worm=1
SetEnvIf worm 1 !inter-net !local-net
CustomLog logs/worm_log combined env=worm
さらに、下記のように定義して、アクセス禁止にしてしまいましょう。
<Files *>
order allow,deny
allow from all
deny from env=worm
</Files>
インターネット上には数多くのコンテンツ収集robotが存在しますが、中には一度にゴッソリコンテンツを持っていくrobotや、一日に何回もアクセスしてくる傍若無人な奴等もいます。このような無礼なrobotは出入り禁止にしてしまいましょう。
robotの種類と解説は望月明夜さんのrobotはぢきについてに詳しく書かれているので、これを参考にサーバーに訪れる無礼なrobotを見つけ出します。
家のサーバーに来る、ウザイrobotは次の通り。
- NaverBot-1.0:毎日何回も来て鬱陶しい、以前はとても行儀が悪かったらしいので出入り禁止
- msnbot:毎日訪れて、ゴッソリ持って帰る。MSは嫌いだし出入り禁止(笑)
- yahoo! Slurp:これも毎日来ます。
- Internet-Html-Searcher:アクセスフィルターを販売している会社だとか。ページ上に「大量破壊兵器」と書いただけで有害サイトフィルターにサイトが登録されてしまうとかの噂もある。特にUser Agentを偽装してくる点で極悪。
1〜3についてはDocumentRootにrobots.txtと言うファイルを作成して、次のように書いておけば収集は行いません。
User-Agent: msnbot
Disallow: /
User-agent: NaverBot*
Disallow: /
User-agent: Slurp
Disallow: /
4のInternet-Html-Searcherですが、これはUser Agentを偽装してくるので、robots.txt書いても無駄です(と言うか、robots.txtを見ていない。)ので、IPで禁止するしかありません。
私は、httpd-site.confに次のように書いています。
<Files *>
order allow,deny
allow from all
deny from env=worm
deny from 61.115.195.180
deny from 61.115.195.181
deny from 61.115.195.182
</Files>
別のアドレスからアクセスがあった場合は、これに追加していきます。そしてrobotとの戦いは続く....
apacheで出力するログをそのままにしておくと巨大なログファイルとなってしまいます。巨大ファイルでは、ログをちょっと見たい時や、stats等でアクセス解析する時に効率が悪いので、ある一定のサイズや時間になった場合、ログを分割させる設定を行うことにします。
apacheにはログのローテーションを行うためのコマンドrotatelogsが付属しています。これを使えばapacheを停止させずにログのローテーションを行うことが出来ます。
rotatelogsのコマンド引数は下記のようになっています。
# rotatelogs logfile rotationtime [offset]
- logfile:ローテーションを行うログのファイル名(access_logやerror_logなど)
- rotationtime:ローテーションを行う間隔を秒数で設定します。(86400と設定した場合、一日毎にローテーションをおこないます。)
- offset:世界標準時からのオフセットを指定します。(特に必要ない?)
rotatelogsを使用してローテーションを行うには、confファイルに次のように記述します。
ErrorLog "|/usr/sbin/rotatelogs /var/www/log/access_log 86400"
ErrorLog "|/usr/sbin/rotatelogs /var/www/log/error_log 86400"
rotatelogsの場所とログのある場所は、システムによって異なるので書き換えてください。これによって、一日毎にログローテーションが行われます。しかし、rotatelogsによるログローテーションにも下記の欠点はあります。
- ローテーションされたログファイルは、自分で消さないと無限に増えてしまう。
- ファイルサイズによるローテーションは出来ない。
- ローテーションしたログファイルは圧縮されない(ぽい)。
特に、アクセスの少ないサーバの場合、ファイルサイズによるローテーションが出来ないと小さなファイルが沢山増えてしまい、かえって不便になることもあります。
大抵のunixであるならば、ローテーションを行うためのコマンドが用意されている。私が使用しているOpenBSDにはnewsyslogコマンドがあり、これが/var/log以下にあるログのローテーションを管理しています。
apacheのログをnewsyslogコマンドでローテションをさせるためには、/etc/newsyslog.confに下記の設定を追加すればOKです。
# logfile_name owner:group mode count size when flags
/var/www/log/access_log www:www 644 12 250 * Z /var/www/logs/httpd.pid
/var/www/log/error_log www:www 644 12 250 * Z /var/www/logs/httpd.pid
/var/www/log/worm_log www:www 644 12 250 * Z /var/www/logs/httpd.pid
これで、各ログが250Kbyteになったらローテーションが行われ、ローテーションされたファイルは12個まで保存されます。