# Java-Security Permission (?) mit Tomcat unter Unix-Debian



## Guest (21. Jun 2006)

Hi,

als Neuling auf dem Gebiet von Java & Co. sowie Linux eine Frage, mit der ich schon seit zwei
Tagen rummache. Falls ihr mir auch bei meinen optionalen Fragen zu Subdomain und Adress-
aufruf weiterhelfen könntet, wäre es toll, aber nicht zwingend erforderlich.

Zu meiner Fehlermeldung:

Systemumgebung und Fehlerbeschreibung
*******************************************************************************

SYSTEMUMGEBUNG UND ANWENDUNG

1) Betriebssytem: Unix Debian
2) MySQL 4.x (UTF-8) - Zugriff über com.mysql.jdbc.Driver-Klasse (v3)
   --> abgelegt im /common/lib-Verzeichnis unter Tomcat
3) Tomcat 5.5.9
4) Anwendungs-Framework: Struts v1.1
5) Aufruf der Anwendung über Browser: http://www.viuna.de:8080/viuna
6) Verbindung zur Datenbank über JNDI, die im CATALINA_HOME/.../server.xml
   innerhalb der Context definiert sind
7) Auf dem Server ist auch Apache 2 installiert, allerdings ist der Tomcat
   nicht im Apache integriert. Bei Aufruf der obigen Domain wird die
   Willkommensseite vom Tomcat angezeigt.
8) Dateihoch- und runterladen erfolgt per FTP (FileZilla)
9) Terminal-Zugriff per Putty

--> Wenn vor der Domainname kein "http://" angegeben wird, findet der Browser
    die Anwendung nicht und leitet den Anwender weiter auf die MSN-Seite für
    nicht gefundene Adressen.
--> Einzige Änderung am Tomcat war die Änderung der Port-Nr.

Bei diesem System handelt es sich um einen virtuellen Tomcat-Server!


FEHLERBESCHREIBUNG

Soll-Zustand: Nach Eingabe der obigen Adresse im Browser-Adressfeld werden die
im Laufzeit benötigten Klassen in den Speicher geladen. Danach wird die erste
Aktion (Struts-Action) zum Aufbau der Hauptseite ausgelöst. Bereits hier findet
der Zugriff auf die MySQL-Datenbank statt. Nach erfolgreichem Datenempfang
wird die Seite aufgebaut und angezeigt (durch eingebundene JSP-Seiten).

Ist-Zustand: Es wird die Fehlermeldung wie unter "AUSGABE der Log-Datei..."
beschrieben ausgegeben. Bereits vorherige Fehlermeldungen konnten durch die
Erweiterung der Policy-Dateien behoben werden (siehe "Policy-Dateien...)".
Zusätzlich wurden in die Entwicklungsumgebung die common-*.jar-Dateien vom
Tomcat-Server eingebunden, welches auf dem Produktivsystem (Linux) läuft.
Auch dies half zur Behebung von Fehlermeldungen wie "action not found...".

Die gennanten *.jar-Dateien (Struts, Commons, ...) werden im /WEB-INF/lib-
Verzeichnis meiner Anwendung mitgegeben. Ausser den Commons-Libraries befinden
diese sich nicht unter Tomcat.


POLICY-DATEIEN unter /etc/init.d/policy:

*** 01system.policy: **********************************************************

// ============================================================================
// catalina.policy - Security Policy Permissions for Tomcat 4.1
//
// This file contains a default set of security policies to be enforced (by the
// JVM) when Catalina is executed with the "-security" option.  In addition
// to the permissions granted here, the following additional permissions are
// granted to the codebase specific to each web application:
//
// * Read access to the document root directory
//
// ============================================================================


// ========== SYSTEM CODE PERMISSIONS =========================================


// These permissions apply to javac
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;
};
// ============================================================================
*******************************************************************************


*** 02debian.policy ***********************************************************

// These permissions apply to all JARs from Debian packages
grant codeBase "file:/usr/share/java/-" {
  permission java.security.AllPermission;
};
grant codeBase "file:/usr/share/ant/lib/-" {
  permission java.security.AllPermission;
};

********************************************************************************


*** 03catalina.policy **********************************************************

// ========== CATALINA CODE PERMISSIONS =======================================

// These permissions apply to the launcher code
grant codeBase "file:${catalina.home}/bin/commons-launcher.jar" {
        permission java.security.AllPermission;
};

// 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 commons-logging API
grant codeBase "file:${catalina.home}/bin/commons-logging-api.jar" {
        permission java.security.AllPermission;
};

// 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 JMX server
grant codeBase "file:${catalina.home}/bin/jmx.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 "common" directory
grant codeBase "file:${catalina.home}/common/-" {
  permission java.security.AllPermission;
};

// These permissions apply to the container's core code, plus any additional
// libraries installed in the "server" directory
grant codeBase "file:${catalina.home}/server/-" {
  permission java.security.AllPermission;
};

// Entry for access (permission) denied problems during starting
// my own struts-application
grant
{
    permission java.security.AllPermission;
};
********************************************************************************


*** 04webapps.policy ***********************************************************

// ========== 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 getting BeanInfo
  permission java.lang.RuntimePermission "accessClassInPackage.sun.beans";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.beans.*";

  // Required for sevlets and JSP's
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";  
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util.*";
  permission java.lang.RuntimePermission "defineClassInPackage.org.apache.catalina.util";
  permission java.lang.RuntimePermission "defineClassInPackage.org.apache.catalina.util.*";

  // Required for running servlets generated by JSPC
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime.*";

  // Required for MX4J
  permission java.lang.RuntimePermission "getAttribute";

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

  // Added on 2006/06/21 (my own additions!)
  permission java.lang.RuntimePermission "createClassLoader";
  permission java.security.AllPermission;
};
********************************************************************************

*** 10admin.policy *************************************************************

// These permissions apply to the privileged admin and manager web applications
grant codeBase "file:${catalina.home}/server/webapps/admin/WEB-INF/classes/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.home}/server/webapps/admin/WEB-INF/lib/-" {
  permission java.security.AllPermission;  
};

grant codeBase "file:/usr/share/struts1.2/struts.jar" {
  permission java.security.AllPermission;
};
********************************************************************************


AUSGABE der Log-Datei /var/log/tomcat5/localhost_com_dev_db_log*:

        at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
        at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
        at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
        at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
        at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:272)
        at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:245)
        at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:177)
        at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:156)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:152)
        at org.ibais.tomcat.filter.CharsetFilter.doFilter(CharsetFilter.java:31)
        at sun.reflect.GeneratedMethodAccessor79.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
        at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:272)
        at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:217)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:197)
        at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:177)
        at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:156)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:152)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:534)


Weitere Fragen (optional):

1) Kann ich unter Tomcat eigene Subdomains anlegen (z. B. "buecher.viuna.de")? Was muss hierzu beachten
   bzw. vornehmen?
2) Ich bin leider neu auf diesem Gebiet und kenne mich in Linux auch nicht aus. Habe gelesen, das normalerweise
   für einen sicheren Betrieb eine Web-Anwendung nicht unter CATALINA_HOME/webapps/{my-app} laufen sollte, sondern
   unter CATALINA_HOME/webapps/ROOT/{my-app}. Möchte gerne Näheres hierzu erfahren, falls Erfahrungen vorliegen.
3) Kann ich meine Anwendung nicht als "www.viuna.de" aufrufen? Hierbei erhalte ich eine Fehlermeldung, das die
   Domain nicht findbar ist. Ich muss jedesmal den Protokoll-Typ und die Port-Nr. mitangeben
   (http://www.viuna.de:8080/viuna).

Vielen Dank für eure Hilfe.

Gruss
Cengiz


----------



## foobar (22. Jun 2006)

Zu 2) Du kannst den Tomcat in einem Chroot laufen lasen, dann kann der Server nicht auf das System zugreifen. Google ist dein Freund ;-)


----------



## padde479 (22. Jun 2006)

Okay, zu den optionalen Fragen:

1. Unter Subdomains verstehe ich so etwas: _http://host.com/subdomain_. Dies ist möglich, denn
2. neue Projekte, die Du erstellst, beispielsweise unter _CATALINA_HOME/webapps/mywebapp_ werden ja auch so im Browser angesprochen.
3. Wenn Du Deine Anwendung ohne explizite Angabe eines Ports aufrufen möchtest, dann muss diese am Port 80 und nicht am Port 8080 lauschen. Dazu ist eine kleine Änderung in der _server.xml_-Datei notwendig. Am besten, Du kuckst einmal bei google nach.

Gruß
Padde


----------



## Guest (22. Jun 2006)

Hi,

erstmal vielen Dank für die Antworten.

Ich habe schon gegoogeld. Allerdings mit wenig Erfolg, weil ich eben das was ich gefunden habe versucht habe umzusetzen, aber nicht das gewünschte Ergebnis rauskam.

Mit Sub-Domain meine ich z. B. "http://buch.host.de". Hier habe ich in der server.xml folgende Änderung vorgenommen (Tomcat läuft unter Windows auf meinem lokalen Rechner):

      <Host name="buch.localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
      <Context ...... />
      </Host>

Hat allerdings nicht funktioniert.

Auf dem Server selbst habe ich es noch nicht ausprobiert.

Gruss
Cengiz


----------

