TenForward

技術ブログ。はてなダイアリーから移転しました

TomcatのValve

Tomcat のアクセス制限をしようと RemoteAddrValve を使っていてはまってました.

2 台のホストを用意して,片方に Apache + mod_jk を入れ,片方で Tomcat 5.0.28 を動かしました.mod_jk の設定をして,Apache が動作しているホストにたいしてブラウザから "http://ホスト名/hoge/" と URI を指定してアクセスすると,Tomcat 側のアプリにアクセスするように設定しました.

Tomcat 側では 127.0.0.1 からの接続しか許さない設定にします.

まずは Apache の動作しているホスト上でブラウザを起動し,TomcatCoyote コネクタ (Port 8080) に直接アクセスしてみます.当然 Forbidden が返ります.しかし,ブラウザで "http://localhost/hoge/" と入れて Apachemod_jk 経由でアクセスすると,アクセス出来てしまうのです.うむむ...

しばらくはまってましたが,AccessLogValve を使ってみて,理由がなんとなく分かりました."http://localhost/hoge/" と入れてアクセスすると,Tomcat 側ではリモートのホストからのアクセスにもかかわらず,ログには 127.0.0.1 と記録されます."http://127.0.0.1/hoge/" でも同じ.では Apache が動作しているホスト名を指定して "http://apache/hoge/" のようにアクセスすると,きちんと Apache が動作しているホストのアドレスが記録されます.そしてちゃんと RemoteAddrValve も機能して Forbidden が返ります.

というわけで,AJP コネクタは実際の接続元を見ているのではなく,なんとなく AJP プロトコル内のホスト名を見るとか,そういうことをしているんじゃないですかねぇ.

ソースを見てないので,なんとも言えませんが...