RequestChecker

 リバースプロキシを通さずに、Zope(ZServer)で直接 HTTP をサービスすると、よく落ちたり止まったりするらしい・・・どうも、Nimda等のワームから不正な Request をたくさん受けると調子悪いらしい・・・という話をよく耳にします。

 基本的には、Zope(Python) が遅いのがいけないとは思うのですが、ZServerで HTTP Request を受け取ってから ZODB のトランザクションを開始するまでの間に、不正なパスをチェックできれば、負荷もだいぶ軽減できるのでは?と思い、本当にそんなこと(トランザクション開始前のチェック)ができるのかどうか、試してみた結果がこれです。

 なお、当方 Zope2.6.1 で試しましたが、他のバージョンでも動作すると思います。

インストール

  1. 最新のアーカイブ をダウンロードします
  2. lib/Python/Products 以下に展開します
  3. $(INST_HOME)/ZServer ディレクトリに cd します
  4. patch -p0 < ../lib/python/Products/RequestChecker/ZServer.diff でパッチを当てます
  5. lib/python/Products/RequestChecker/request_checkpat.py の 変数 checkpat_req_precompile や checkpat_env_precompile  の値を書き換えます
  6. Zope を(再)起動します

4.のパッチは、(Windows環境等で)patchコマンドがない場合は、中身を見てもらえば、手で修正することができます。

5.の書き方については、既存のソースを参考にしてください。

Control_Panel->Products->RequestChecker の Refresh タブで、リフレッシュができますので、Zopeを動かしながら拒否するパターンを変更することができます。

関連URL

更新履歴

0.3 2003/3/16 Status 400 をクライアントに返す。
0.2 2003/3/12 IPアドレスをログに残す。 refresh.txtを同梱。
0.1 2003/2/24 初期リリース

応用例

 ちょっと書き換えれば、Apacheの mod_rewrite みたいなことができるかも・・・などと考えています。

 それから、mod_antihak というのがあるらしいが、 http://apantihak.sourceforge.net/ こんなのもがんばればできそう。(説明は http://slashdot.jp/journal.pl?op=display&uid=2524&id=108668 がわかりやすいです。)

 

 


Zope メモ