apacheで特定のディレクトリ、特定のUAだけ拒否する。

ZmEuとかいうユーザーエージェントからの攻撃が最近多くってうざい。 ログを見ている限り、どうやらPHPのみを対象にした攻撃のようです。というか、弱いサーバーを探しているだけ?

うちのサイトはPHP使ってないんだけどね。 被害が出ないとはいえaccess_logに残り続けるのはやっぱりうざいので、ダミーのファイルを置いてハニーポット・・・は作らないで、アクセスを拒否しつつログにも残さないようにしてみます。

SetEnvIf "^$" deny_ua nolog  # User-Agentヘッダはあるんだけど値が設定されていない場合
SetEnvIf "^-$" deny_ua nolog  # そもそもUser-Agentヘッダが無いとこうなるっぽい
SetEnvIf "^ZmEu$" deny_ua nolog

Deny from env=deny_ua

CustomLog /var/log/apache2/access_log combinedio env=!nolog

こんな感じにセットしてみた。

してみたあと何日かしてerror_logを見てみたら、

[Mon Feb 24 18:49:15 2014] [error] [client xxx.xxx.xxx.xxx] client denied by server configuration: /path/to/root/directory/errors/403.html

こんなのが大量に残ってた。 うーん、これはうざい。 エラーログにアクセス権無いのが問題なんだね。

というわけでさっきのSetEnvIf群のあとに

SetEnvIf Request_URI "^/errors/" !deny_ua !nolog

こんなのを追加。

そっけない標準のエラーログではなくて、ErrorDocumentディレクティブで設定したファイルが表示されるようになりました。 そしてaccess_logにも残らない。素晴らしい。error_logの方には残るから、多分問題ないよね。