Apache での WORM_AGOBOT 対策
Posted by yoosee on Debian at 2004-05-24 23:42 JST1 WebDAV 狙いの WORM アクセス
1,2 週間程前から、Windows プラットフォームの WebDAV を狙ったらしい SEARCH メソッドのアクセスが apache の log に大量に残るようになった。例えばこんな感じだ。218.xx.xx.xx - - [21/May/2004:09:57:47 +0900] "SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\.....このリクエストは 1 アクセスが 32KB もあるので性能的にもログ的にも鬱陶しくて仕方がない。
2 アクセスログの分離
根本対策にはならないが、access.log が肥大化して鬱陶しいため、まずはログを分離する。AGOBOT の場合、Nimda のような SetEnvIf での分離は難しい。しかしこの手の WORM は HTTP/1.1 の Host: 無しで IP アドレスに対してアクセスしてくるので、VirtualHost で IP アドレスへのアクセスを分けてやるのが有効らしい。NameVirtualHost xx.xx.xx.xx <VirtualHost xx.xx.xx.xx> ServerName dummy DocumentRoot /home/www/defaults/www/ CustomLog /var/log/apache/defaults/full.log full ErrorLog /var/log/apache/defaults/error.log </VirtualHost> <VirtualHost yoosee.net> ServerName yoosee.net ServerAlias www.yoosee.net yoosee.net ServerAdmin webmaster@yoosee.net DocumentRoot /home/www/yoosee.net/www/ CustomLog /var/log/apache/yoosee.net/full.log full ErrorLog /var/log/apache/yoosee.net/error.log </VirtualHost>といった感じで log を分離する。log が必要ない場合は Log ファイル名を /dev/null にしてしまうと良い。
3 SEARCH Method の拒否
そもそも SEARCH Method は WebDAV 用の method なので apache で処理する必要はない。逆に apache には無い method なので単純に Limit での拒否はできない。と言うことで LimitExcept で使える method をそもそも限定してしまうことにする。<Location /> <LimitExcept GET POST HEAD OPTIONS> Deny from all </LimitExcept> </Location>ただこのやり方だと結局 Request を受けた後で 500 なりを返すので、性能的にはあまり改善され無い気がする。
4 根本的対策
以上の方法は apache 側での処理のため、根本的な負荷軽減にはあまり効かないと思われる。根本的に対策するには、前段に Squid 等で Reverse Proxy を入れたうえで Squid 側の acl で method を制限する、または Guardian のような Reverse Proxy 型 アプリケーション ファイヤウォールで防衛する、等の方法があるようだ。同一 IP からのアクセスが多い場合には apache 側で mod_throttle 等を使う方法もある気がするが、これも一度 apache 側で処理を受けてしまうため効果のほどは微妙。アクセスをトリガにして何か処理をしたい場合には mod_security を使う方法もあるが、今回向きでは無いだろう。