web-dev-qa-db-ja.com

Tomcat 6:アクセス制御の例外?

Tomcat6サーバーをセットアップしようとしていますが、他の誰かが確立した別のセットアップと一致させようとしています。ただし、私のデプロイメント(デフォルトのUbuntuインストール)はpolicy.d/ディレクトリ構造を使用し、確立されたサーバーはcatalina.policyファイルのみを使用します。特定のcatalina.policyに一致するようにpolicy.dのすべてのエントリを設定しようとしましたが、起動時に次のスタックトレースを取得します(ローカルホストログから)。

では、2つの質問があります。まず、Tomcatにpolicy.d/で示されるディレクトリ構造ではなく、単一のポイルシーファイルを使用させるにはどうすればよいですか?次に、同じポリシーを使用するようにすべてのファイルを指定した場合でも、以下のスタックトレースが表示されるのはなぜですか?

スタックトレース:

SEVERE: Servlet /myapp threw load() exception
Java.security.AccessControlException: access denied (Java.lang.RuntimePermission accessClassInPackage.org.Apache.jasper)
        at Java.security.AccessControlContext.checkPermission(AccessControlContext.Java:342)
        at Java.security.AccessController.checkPermission(AccessController.Java:553)
        at Java.lang.SecurityManager.checkPermission(SecurityManager.Java:549)
        at Java.lang.SecurityManager.checkPackageAccess(SecurityManager.Java:1529)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:291)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:264)
        at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1314)
        at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1245)
        at Java.lang.ClassLoader.loadClassInternal(ClassLoader.Java:332)
        at org.Apache.jasper.servlet.JspServlet.init(JspServlet.Java:100)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:616)
        at org.Apache.catalina.security.SecurityUtil$1.run(SecurityUtil.Java:244)
        at Java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAsPrivileged(Subject.Java:537)
        at org.Apache.catalina.security.SecurityUtil.execute(SecurityUtil.Java:276)
        at org.Apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.Java:162)
        at org.Apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.Java:115)
        at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1166)
        at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:992)
        at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4058)
        at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4367)
        at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:791)
        at org.Apache.catalina.core.ContainerBase.access$000(ContainerBase.Java:123)
        at org.Apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.Java:145)
        at Java.security.AccessController.doPrivileged(Native Method)
        at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:769)
        at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:525)
        at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:978)
        at org.Apache.catalina.startup.HostConfig.deployDirectories(HostConfig.Java:941)
        at org.Apache.catalina.startup.HostConfig.deployApps(HostConfig.Java:499)
        at org.Apache.catalina.startup.HostConfig.start(HostConfig.Java:1201)
        at org.Apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.Java:318)
        at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:117)
        at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1053)
        at org.Apache.catalina.core.StandardHost.start(StandardHost.Java:719)
        at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1045)
        at org.Apache.catalina.core.StandardEngine.start(StandardEngine.Java:443)
        at org.Apache.catalina.core.StandardService.start(StandardService.Java:516)
        at org.Apache.catalina.core.StandardServer.start(StandardServer.Java:710)
        at org.Apache.catalina.startup.Catalina.start(Catalina.Java:578)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:616)
        at org.Apache.catalina.startup.Bootstrap.start(Bootstrap.Java:288)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:616)
        at org.Apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.Java:177)    

Policy.d

grant codeBase "file:${Java.home}/lib/-" {
        permission Java.security.AllPermission;
};

// These permissions apply to all shared system extensions
grant codeBase "file:${Java.home}/jre/lib/ext/-" {
        permission Java.security.AllPermission;
};

// These permissions apply to javac when ${Java.home] points at $Java_HOME/jre
grant codeBase "file:${Java.home}/../lib/-" {
        permission Java.security.AllPermission;
};

// These permissions apply to all shared system extensions when
// ${Java.home} points at $Java_HOME/jre
grant codeBase "file:${Java.home}/lib/ext/-" {
        permission Java.security.AllPermission;
};

// ========== CATALINA CODE PERMISSIONS =======================================
// These permissions apply to the daemon code
grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" {
        permission Java.security.AllPermission;
};

// These permissions apply to the logging API
grant codeBase "file:${catalina.home}/bin/Tomcat-juli.jar" {
        permission Java.util.PropertyPermission "Java.util.logging.config.class", "read";
        permission Java.util.PropertyPermission "Java.util.logging.config.file", "read";
        permission Java.io.FilePermission "${Java.home}${file.separator}lib${file.separator}logging.properties", "read"; 
        permission Java.lang.RuntimePermission "shutdownHooks";
        permission Java.io.FilePermission "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read";
        permission Java.util.PropertyPermission "catalina.base", "read";
        permission Java.util.logging.LoggingPermission "control";
        permission Java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write";
        permission Java.io.FilePermission "${catalina.base}${file.separator}logs${file.separator}*", "read, write";
        permission Java.lang.RuntimePermission "getClassLoader";
        // To enable per context logging configuration, permit read access to the appropriate file.
        // Be sure that the logging configuration is secure before enabling such access
        // eg for the examples web application:
        // permission Java.io.FilePermission "${catalina.base}${file.separator}webapps${file.separator}examples${file.separator}WEB-INF${file.separator}classes${file.separator}logging.properties", "read";
};

// These permissions apply to the server startup code
grant codeBase "file:${catalina.home}/bin/bootstrap.jar" {
        permission Java.security.AllPermission;
};

// These permissions apply to the servlet API classes
// and those that are shared across all class loaders
// located in the "lib" directory
grant codeBase "file:${catalina.home}/lib/-" {
        permission Java.security.AllPermission;
};


// ========== WEB APPLICATION PERMISSIONS =====================================
// These permissions are granted by default to all web applications
// In addition, a web application will be given a read FilePermission
// and JndiPermission for all files and directories in its document root.
grant { 
    // Required for JNDI lookup of named JDBC DataSource's and
    // javamail named MimePart DataSource used to send mail
    permission Java.util.PropertyPermission "Java.home", "read";
    permission Java.util.PropertyPermission "Java.naming.*", "read";
    permission Java.util.PropertyPermission "javax.sql.*", "read";

    // OS Specific properties to allow read access
    permission Java.util.PropertyPermission "os.name", "read";
    permission Java.util.PropertyPermission "os.version", "read";
    permission Java.util.PropertyPermission "os.Arch", "read";
    permission Java.util.PropertyPermission "file.separator", "read";
    permission Java.util.PropertyPermission "path.separator", "read";
    permission Java.util.PropertyPermission "line.separator", "read";

    // JVM properties to allow read access
    permission Java.util.PropertyPermission "Java.version", "read";
    permission Java.util.PropertyPermission "Java.vendor", "read";
    permission Java.util.PropertyPermission "Java.vendor.url", "read";
    permission Java.util.PropertyPermission "Java.class.version", "read";
    permission Java.util.PropertyPermission "Java.specification.version", "read";
    permission Java.util.PropertyPermission "Java.specification.vendor", "read";
    permission Java.util.PropertyPermission "Java.specification.name", "read";

    permission Java.util.PropertyPermission "Java.vm.specification.version", "read";
    permission Java.util.PropertyPermission "Java.vm.specification.vendor", "read";
    permission Java.util.PropertyPermission "Java.vm.specification.name", "read";
    permission Java.util.PropertyPermission "Java.vm.version", "read";
    permission Java.util.PropertyPermission "Java.vm.vendor", "read";
    permission Java.util.PropertyPermission "Java.vm.name", "read";

    // Required for OpenJMX
    permission Java.lang.RuntimePermission "getAttribute";

    // Allow read of JAXP compliant XML parser debug
    permission Java.util.PropertyPermission "jaxp.debug", "read";

    // Precompiled JSPs need access to this package.
    permission Java.lang.RuntimePermission "accessClassInPackage.org.Apache.jasper.runtime";
    permission Java.lang.RuntimePermission "accessClassInPackage.org.Apache.jasper.runtime.*";

    // Precompiled JSPs need access to this system property.
    permission Java.util.PropertyPermission "org.Apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read";

};
3
Stefan Kendall

UbuntuがTomcatファイルをあちこちに散らばらせる方法が好きではありませんでした。むしろ、Tomcatバイナリ配布をダウンロードして、カスタム構成をセットアップすることを好みます。これは、より単純で、より柔軟で、保守が容易であると信じています。これを行う方法については、私のサイトのいくつかのブログエントリ http://www.brianshowalter.com で説明しました。

また、Javaセキュリティポリシーを使用する必要があるかどうかも疑問です。場合によっては、そうです。機密データを処理するアプリケーションに貴重な追加のセキュリティを提供しますが、多くの場合、追加の複雑さと適切な構成を取得する必要性は、余分な時間と労力の価値がありません。

2
Brian Showalter

まず最初に、Javaセキュリティポリシーを使用する必要がありますか?最も簡単な解決策は、Tomcatの起動スクリプトでこれを無効にすることです。

/etc/init.d/Tomcat6で置換

    Tomcat6_SECURITY=yes

    Tomcat6_SECURITY=no

セキュリティマネージャを使用する必要があり、既存のインストールと一致する必要があると仮定すると、Tomcat6をアンインストールし、Webからダウンロードして、ディレクトリ全体を/ optまたは/ usr/localから実行することをお勧めします。これは、セキュリティ更新プログラムを自分で追跡する必要があることを意味しますが、少なくともすべてのファイルが同じ場所にあり、構成のヘルプを得るのが簡単になります。

さて、あなたが持っているもので作業してみましょう。カスタムポリシーファイルがある場合、これはpolicy.dの[〜#〜] only [〜#〜]ファイルであるか、少なくとも「50local.policy」に権限を追加する必要があります。他のすべてのファイルを上書きすることを目的としています。または、/ etc/init.d/Tomcat6のセキュリティポリシーへのパスを変更することもできます。

また、次のようにセキュリティセクションに「-Djava.security.debug = failure」を追加する必要があります。

    if [ "$Tomcat6_SECURITY" = "yes" ]; then
       Java_OPTS="$Java_OPTS -Djava.security.manager -Djava.security.policy=$POLICY_CACHE -Djava.security.debug=failure"
    fi

これにより、はるかに役立つエラーメッセージが表示され、エラーを回避するためにポリシーに追加する権限が正確に示されることがよくあります。

注:EclipseでTomcatを使用している場合は、サーバータブでTomcatをダブルクリックし、[セキュリティを使用する]のチェックを外します。

4
Mark Porter