Apacheのアクセスログからスパムアクセスを分離する

設置していた掲示板に、もの凄い数のスパムコメントがされるようになってしまったため、何ヶ月か前にページを撤去しました。
しかし、掲示板があったURLには未だにたくさんのアクセスがあります。
アクセスログを見てみると、リクエスト元のIPはバラバラで、アクセスの約8割がPOST。1分に4回くらいのアクセスがあります。
もともと流行っていた掲示板でもなかったので、アクセスはほぼ間違いなくスパムコメントを記入するためのBOTでしょう。

これらのアクセスに対し、初めは.htaccessでアクセスを禁止し、403を返すようにしていたのですが、それでもアクセスが止まないため、404を返すようにしてみました。
ところが、なおアクセスは続きます。

このように、明らかにスパムだとわかっているアクセスが続くと、ネットワークやサーバーに負荷がかかるというのは勿論ありますが、特に不便しているのはアクセスログが汚れてしまうことです。
アクセスログはこの掲示板へのアクセスのログで埋め尽くされ、容量が肥大していくだけでなく、現在運営しているページへのアクセスログが確認しづらくなってしまいます。
また、エラーログは、これらのアクセスに対する403や404のログで埋まってしまい、開発中のCGIの動作確認をしようと思っても、すぐにログが流れてしまいます。1

ということで、この旧掲示板に対するアクセスログとエラーログを、他のログとは分けて保存できないかを考えました。

調べてみたところ、アクセスログは SetEnvIf というディレクティブを使うことで、条件ごとのログが保存できるようでしたので、httpd.confに以下のように設定してみました。

LogFormat "%h %l %u %t \"%r\" %>s %b" common
SetEnvIf Request_URI "mybbs" spam
CustomLog logs/spam_log common env=spam
CustomLog logs/access_log common env=!spam

これは、リクエストされたURLに "mybbs" を含む場合に spam というタグを付けて、このタグが付いたアクセスを spam_log に保存し、それ以外を access_log に保存するという意味です。
"mybbs" の部分は正規表現で自由に設定できますので、スパムアクセスがあるアドレスに合わせて設定します。

エラーログの方は分ける方法がわかりませんでした。
なので、旧掲示板に対するアクセスがあった場合、リダイレクトさせてしまうことにしました。
そうすればエラーにならないので、エラーログは残りません。

リダイレクトには、410 Goneを使ってみました。410の場合リダイレクト先を指定しません。

Redirect gone /cgi-bin/mybbs/

アクセスを無くさせるためには他のステータスを返した方がいいのかもしれませんが……。

  1. 開発環境と運用環境が同じサーバーですから。

コメントを残す