Java SecurityManager によるセキュリティポリシーの設定は、
tomcat の conf
ディレクトリに置かれた
tomcat.policy
ファイルで行います。
tomcat.policy
ファイルは、java.policy
ファイルの設定を上書きします。
tomcat.policy
ファイルは、テキストエディタを用いて手で編集するか、もしくは、Java 1.2 から標準で付属されたpolicytoolを使って編集します。
tomcat.policy
ファイルへの登録は、下記のような java.policy
ファイルフォーマットを利用します。
// ポリシーファイルの設定例 grant [signedBy <signer> [,codeBase <code source>] { permission <class> [<name> [, <action list>]]; }; |
codeBase は、URL 形式と、ファイル URL 形式を使用し、 ディレクトリパスを定義した、${java.home} と ${tomcat.home}プロパティを使うこともできます。
デフォルトの tomcat.policy ファイル
// tomcat のためのパーミッション // javac grant codeBase "file:${java.home}/../lib/-" { permission java.security.AllPermission; }; // Tomcat は、すべてのパーミッションを得ます。 grant codeBase "file:${tomcat.home}/lib/-" { permission java.security.AllPermission; }; grant codeBase "file:${tomcat.home}/classes/-" { permission java.security.AllPermission; }; // Webアプリケーションのサンプルのポリシー // デフォルトでは、Tomcat は、webapp ディレクトリへのアクセスと、line.separator, path.separator, file.separator プロパティを読むことを許可されます。 // あなたがここで許可したパーミッションは、デフォルトに追加されます。 grant codeBase "file:${tomcat.home}/webapps/examples" { // すべての Java プロパティに対して、サンプルWebアプリケーションからの読み取りを許可します。 permission java.util.ProperyPermission "*", "read"; }; |
下記の例は、Webアプリケーションのサンプルに対してメールを送れるようにする設定を、デフォルトパーミッションに追加します。つまり、localhost の smtp ポートへのアクセスを許可します。
grant codeBase "file:${tomcat.home}/webapps/examples" { // examplesというWebアプリケーションにlocalhostのsmtpポートの使用を許可します。 permission java.net.SocketPermission "localhost:25","connect"; }; |
もし、すべてのWebアプリケーションのために、デフォルトのポリシーをセットしたいなら、 grantの URL を省略できます。 Tomcat の割り当てに加えて、すべてのアプリケーションを一つ一つ設定することなく、 いくつかのデフォルトのパーミッションの許可したい場合には、次のように書くことができます。
grant { // すべてのWebアプリケーションに、すべてのJava プロパティを読むことを許可します。 permission java.util.ProperyPermission "*", "read"; }; |
最後に、より複雑なtomcat.policy ファイルを示します。
この例では、いくつかのリモートのWebサーバのために Tomcat をアプリケーションサーバとして使います。
Java SecurityManager を使うことにより、リモートのWebサーバが、Tomcat に接続できるように設定します。
// Tomcat のためのパーミッション // javacのために、この設定が必要です。 grant codeBase "file:${java.home}/lib/-" { permission java.security.AllPermission; }; // IP フィルタリングを設定します。 grant codeBase "file:${tomcat.home}/lib/-" { // Tomcat は、すべてのプロパティの読み書きが可能でなければいけません。 permission java.util.PropertyPermission "*","read,write"; // Tomcat は、それ自身のディレクトリのファイルを読めなければいけません。 permission java.io.FilePermission "${tomcat.home}/-","read"; // Tomcat は、そのログに書き込めなければいけません。 permission java.io.FilePermission "${tomcat.home}/logs/-","read,write"; // Tomcat は、conf ディレクトリに書き込めなければいけません。 permission java.io.FilePermission "${tomcat.home}/conf/-","read,write"; // Tomcat は、webapps ディレクトリに書き込めなければいけません。 permission java.io.FilePermission "${tomcat.home}/webapps/-","read,write"; // Tomcatは、JSPのコードをコンパイルできなければいけません。 permission java.io.FilePermission "${tomcat.home}/work/-","read,write,delete"; // Tomcat は、すべての RuntimePermission が必要です。 permission java.lang.RuntimePermission "*"; // Tomcat が Context の セキュリティポリシを設定できる必要があります。 permission java.security.SecurityPermission "*"; // Tomcat は、リモートのWebサーバからのコネクションを受け付ける必要があります。 // XXX.XXX.XXX.XXX を リモートのWebサーバの IP アドレスに置き換えて下さい。 permission java.net.SocketPermission "XXX.XXX.XXX.XXX:1024-","accept,listen,resolve"; // Tomcat は、localhost のポートを使用できる必要があります。 permission java.net.SocketPermission "localhost:1024-","connect,accept,listen,resolve"; }; // webapp ポリシーの例 // デフォルトでは、webappディレクトリの読み込みと、 // line.separator プロパティの読み込みを許可します。 grant codeBase "file:${tomcat.home}/webapps/examples" { permission java.net.SocketPermission "localhost:1024-","listen"; permission java.util.PropertyPermission "*","read"; }; |
server.xml
server.xml 中の ContextInterceptor タグで、クラス名に PolicyInterceptor が定義されている部分のコメントを外して下さい。
TOMCAT_OPTS=-Djava.security.debug=all
を設定すると、Java SecurityManager
のデバッグのためにロギングを行うことができます。
デバッグのログは、tomcat.log
に出力されます。
同じJVM内のjavac呼び出しを使ってJSP をコンパイルするとき、 "AccessControlException RuntimePermission accessClassInPackage sun.tools.javac" というメッセージを出力して、失敗します。
その時は、JAVA_HOME/jre/lib/security/java.security ファイルの設定を 確認して、"package.access=sun." の行のコメントを外して下さい。
Tomcatの作業用ディレクトリの FilePermission が read の時、 同じJVM内のjavac呼び出しによる JSP のコンパイルがAccessControlException で失敗します。
codeBase に、${java.home} プロパティの代わりに絶対パスで指定してみて下さい。
// javacには、この設定が必要です。 grant codeBase "file:/usr/java/lib/-" { permission java.security.AllPermission; };