ちょっと話題の記事

Tomcatで.doや.jspをhtmlに見せるRewriteValve

2015.02.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。 札幌は雪祭りがはじまりました。 今年も初音ミクの露出は多いですねー。

さて、昨今はほとんど見かけなくなりましたが、ウェブサイトにアクセスした時、「/login.do」とか「/shohin.jsp」のようなURLを見ることがあります。 イントラの業務アプリならば兎も角、公開サイトでこんなURLを見ると残念な気持ちになるのは自分だけでしょうか? バックエンドでTomcatなどWebアプリケーションサーバが稼働しているという情報を公開しているのに等しく、セキュリティの意識が低い運営会社だなと感じてしまうからです。

Tomcatではお手軽にURLを偽装できる方法があるので、その方法を紹介します。

Rewrite Valve

Tomcatの固有機能のRewrite ValveApacheのmod_rewriteと同様の機能を提供します。 つまり、Tomcat単体で、外部から.htmlでアクセスしてきたURLを、内部的に.doや*.jspに書き換えることができます。

もちろん、Apacheのmod_rewriteを利用すれば、Rewrite Valveを利用する必要はありません。 しかし、AWS環境でTomcatを運用する場合は、前段にELBを配置し、静的コンテンツはCloudFrontでキャッシュするパターンが多いと思います。 したがって、Tomcatの前段にApacheを置く必要がありません。 Tomcat単体でELBから8080ポートなどへフォワードする方がシンプルです。

Rewrite Valveの設定

Rewrite Valveの設定方法は簡単です。

まず、RewriteValveを有効化するために、context.xmlのValueとして org.apache.catalina.valves.rewrite.RewriteValve を追加します。

<Context>
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Context>

Amazon Linuxにyumでtomcat8をインストールしたならば、/etc/tomcat8/context.xml です。

次に、アプリケーションのWEB-INFの下にrewrite.config を追加します。 例えば、拡張子がhtmlの全てのリクエストを.doとして処理するならば、次のような設定です。

RewriteRule   ^(.*)\.html$ $1.do [L]

記述ルールはmod_rewriteと同じなのでドキュメントなどを参照してください。

後は再起動すれば、アクセスするURLが、 /login.html であっても内部的には /login.do が呼び出されます。 ただし、画面に埋め込まれたリンクなども拡張子をhtmlに変更する必要がありますのでご注意ください。

まとめ

Rewrite Valveを利用すれば、簡単にURLを偽装することができます。 これでストラッツを使っていることがばれませんね!:)

以上、Tomcatの小ネタでした。