TomcatにおけるJava SecurityManagerの使用方法

なぜSecurityManagerを使うのでしょう?

信頼できないコードがローカルシステム上のファイルにアクセスしたり、 Appletが、それがロードされた以外のホストに接続するのを防止するために、 JavaのSecurityManagerは,Appletをブラウザのサンドボックス内で実行させ ます。

SecurityManagerがブラウザで信頼できないAppletが実行されないように保護 するように、Tomcatの実行中に、SecurityManagerを使ってトロイの木馬的な Servletや、JSP、JSP beans、タグライブラリからサーバを保護することが できます。さらに、不注意によるミスからも同様に保護することができます。

あなたのサイトで、うっかり以下のようなコードを含むJSPの登録を認めたこ とを想像してみてください。

<% System.exit(1); %>


このJSPがTomcatで実行されると,Tomcatは常にExitしてしまいます。

JavaのSecurityManagerを使うことは,システム管理者がサーバーを安全で信 頼できる状態を保つために使用できる一つの防御ラインです。

システム要求条件

SecurityManagerを使うには、JDK1.2をサポートするJVMが必要です。
 

注意

TomcatにおけるSecurityManagerの実装は、Tomcatのセキュリティを確実にす るほどには充分にテストされていません。JSPや、Webアプリケーション、 Servlet、bean、タグライブラリがTomcatの内部のクラスにアクセスしないよ うにするためのパーミッションも追加されていません。信頼できないユーザが Webアプリケーションや、JSP、Servlet、beans、タグライブラリを登録するこ とを認める前に、SecurityManagerの設定が充分かどうかを確認してください。

それでも、SecurityManagerを使って運用する方が、それを使わないで運用す るよりも確実に安全です。
 

パーミッションの種類

Permissionクラスは、Tomcatがロードするクラスがどのパーミッションを持つ かを定義するために使われます。多くのPermissionクラスがJDKに含まれてい ます。そして、あなた自身のWebアプリケーションのために、専用のPermission クラスを作ることもできます。

Tomcatに適用できるシステムのSecurityManagerのPermissionクラスを、以下 に簡単に説明します。  パーミッションの使用方法については、JDKのドキュ メントを参照してください。

java.util.PropertyPermission
    java.home のようなJVMプロパティへのread/writeアクセスの制御

java.lang.RuntimePermission
    exit()やexec()のようなシステム/ランタイム関数の制御

java.io.FilePermission
    ファイルとディレクトリに対するread/write/executeアクセスの制御

java.net.SocketPermission
    ネットワークのソケットの使用の制御

java.net.NetPermission
    マルチキャストネットワークコネクションの使用の制御

java.lang.reflect.ReflectPermission
    クラスを内省するために使用するリフレクションの使用の制御

java.security.SecurityPermission
    Securityメソッドへのアクセスの制御

java.security.AllPermission
    SecurityManagerを使わずにTomcatを実行しているように、全てのパーミッショ ンに対してアクセスを許可します。
 

SecurityManagerがSecurity違反を検出したとき、何が起こるのでしょう?

SecurityManagerがセキュリティポリシーの違反を検出したときには、JVMは AccessControlExceptionまたはSecurityExceptionをthrowします。
 

[訳注: これは角瀬和博が翻訳しました。 日本語訳に対するコメントは、jajakarta-report@nekoyanagi.com宛に送って下さい。]