連載
» 2008年04月24日 00時00分 公開

Tomcatを安全にするセキュリティマネージャとは?Tomcatはどこまで“安全”にできるのか?(6)(1/3 ページ)

[x-labチーム,株式会社アメニクス]

 本連載「Tomcatはどこまで“安全”にできるのか?」では、いままでTomcat 6の新機能と、できるだけセキュアなWebアプリケーションサーバをTomcatで構築するためのヒントをいろいろと紹介してきました。

 今回は、Tomcatセキュリティ連載の最後として、「セキュリティマネージャ」を利用したTomcatでのセキュリティの確保について解説していきたいと思います。

Tomcatの安全性を高めるセキュリティマネージャとは?

 「セキュリティマネージャ」(java.lang.SecurityManagerクラスが使われる)とは、信頼されていないコードを実行することでローカルファイルシステム上にあるファイルへとアクセスしたり、Javaアプレットのダウンロード元のホスト以外と通信して情報を送受信したりといったことができないように、Javaアプレットがサンドボックス)内で実行できるようにする機構です。

外部に影響を出さないように設計された保護領域のこと、サンドボックスで実行されるJavaアプレットはサンドボックス外のファイルやプロセスからは隔離され、外部への操作は禁止される

 セキュリティマネージャがWebブラウザでの信頼されていないアプレットの実行を防ぐのと同じように、Tomcatではセキュリティマネージャを利用することにより、「トロイの木馬」タイプのサーブレットJSP、JSP内のBeanタグライブラリからほかのサーブレットやファイル・データを保護できます。また、不注意によって発生した間違いからもデータを保護できます。

Tomcatでセキュリティマネージャを利用するメリット

 このようなセキュリティ保護はTomcatのクラスローダセキュリティポリシーを読み込むことで実装され、以下のようないくつかのケースで有用なメリットを提供します。

  • Webサーバを第三者に貸し出して信頼できないコードを実行させるケース
    ASP(Application Service Provider)でのサーバ貸し出し時などによくあるパターン。
    サーバを貸し出した第三者からの攻撃を未然に防ぐことができる
  • 詳細が不明なアプリケーションを動作させるケース
    オープンソースのアプリケーションなどを実行する場合などによくあるパターン。アプリケーションに紛れ込んだ悪意のあるコードからサーバを守ることができる
  • RMIを利用してネットワーク上のマシンからコードを実行するケース
    RMI(Remote Method Invocation)は分散アプリケーションの開発時などで使われることがあり、RMIを利用するにはセキュリティマネージャの利用は必須

 今回はこのようなセキュリティ保護機能、セキュリティマネージャをTomcatで利用してみましょう。

セキュリティマネージャを試しに使ってみよう

 それでは、具体的にセキュリティマネージャを利用して実際にどのようなことができるのかを試してみましょう。

“問題”のあるコードを作成

 まずは、実際にセキュリティ上“問題”のあるコードを作成してみましょう。例えば、以下のような内容のJSP(「webapps/ROOT/jsp/」に「badjsp.jsp」という名前で配置)が何かの手違いで偶然存在したとします。

<% System.exit(0); %> 

 このJSPは「Tomcatの停止」を意味するスクリプトです。こんなスクリプトがあったら、このファイルにアクセスされるたびにTomcatが停止するでしょう。

 通常こんなファイルは作成されることはないでしょうし、本当にそんなことができるのかと疑問に思われるかもしれませので、実際に動作させて試してみます。起動スクリプトを利用して現時点でTomcatが正常に起動していることを確認してみます。「/etc/init.d/tomcat status」を実行します。

[root@www jsp]# /etc/init.d/tomcat status
jsvc (pid 15424 15423) を実行中... 

 Tomcatをデーモン化しているjsvcが実行されているメッセージが表示され、正常に稼働していることが確認できました。

編集部注Tomcatのデーモン化とjsvcについて詳しく知りたい読者は、連載第1回の「Tomcatを自動的に起動するには?」をご参照ください。

 起動していることも確認できたので、実際にこのJSPをWebブラウザから開いてみましょう。

図1 Tomcatが停止されたことによる現象 図1 Tomcatが停止されたことによる現象

 Tomcatは稼働中のはずで、確かにJSPは存在しているのに、なぜか「ページが表示できない」というメッセージが現れました。一体なぜでしょうか? そうです。本当にTomcatが停止されたからです。

 再度起動スクリプトからTomcatが停止してしまったのかどうか、確認してみます。「/etc/init.d/tomcat status」を再度実行してみると、以下のようなデーモンが停止しているメッセージが表示されました。

[root@www jsp]# /etc/init.d/tomcat status
jsvc は停止しています 

 あんな簡単なJSPで本当にTomcatが停止させられてしまいました。悪意のない間違いだったとしても、こんなスクリプトを設置されたら一大事ですね。

“問題”にどのように対処すればいいのか?

 こんな問題にどのようにして対処すればいいのでしょうか? このような実装は危険である旨を皆に伝えて利用を禁止しますか? すべてのコードに含まれる危険そうなスクリプトをすべて調べ上げますか?

 いつかミスを生み出す可能性のある方法を取るよりも、セキュリティマネージャを利用して、このようなことが起こらないようにセキュアなコーディングのルールを定義して、サーバの運用を行いましょう。

Tomcatの起動オプションを変更

 まずは、Tomcatの起動オプションを変更して、セキュリティマネージャが“有効”になるようにします。Tomcatの起動用スクリプトを編集しましょう。viで「/etc/init.d/tomcat」を開いてください。

[root@www ~]# vi /etc/init.d/tomcat 

 起動用スクリプトを開いたら、Tomcatのオプション指定を「セキュリティマネージャを利用する」ように変更します。Tomcatのオプション(本連載で作成した起動用スクリプトでいうと、「CATALINA_OPTS=」)のところに「-Djava.security.manager」と「-Djava security.policy=$CATALINA_HOME/conf/catalina.policy」の2つを追加します。以下は変更例です。

CATALINA_OPTS="-Djava.security.manager -Djava.security.policy=$CATALINA_HOME/conf/catalina.policy"

 変更が完了したらファイルを保存して、起動用スクリプトからTomcatを再起動します。「/etc/init.d/tomcat restart」を実行してください。

[root@www ~]# /etc/init.d/tomcat restart 

 これでセキュリティマネージャの利用設定は完了です。現時点では、初期状態のセキュリティマネージャですが、セキュリティマネージャを利用しない場合に比べてかなりセキュアな状態にあるといえます。

 次ページでは、実際にセキュリティマネージャの効果を確認して、Tomcatのセキュリティポリシーについて解説します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。