Configuring Tomcat With A SecurityManager

Policy File Format

The security policies implemented by the Java SecurityManager are configured in the$CATALINA_BASE/conf/catalina.policy file. This file completely replaces the java.policy file present in your JDK system directories. The catalina.policy file can be edited by hand, or you can use the policytool application that comes with Java 1.2 or later.

Entries in the catalina.policy file use the standard java.policy file format, as follows:

 

// Example policy file entry

 

grant [signedBy <signer>,] [codeBase <code source>] {

permission <class> [<name> [, <action list>]];

};

The signedBy and codeBase entries are optional when granting permissions. Comment lines begin with “//” and end at the end of the current line. The codeBase is in the form of a URL, and for a file URL can use the${java.home} and ${catalina.home} properties (which are expanded out to the directory paths defined for them by the JAVA_HOME, CATALINA_HOME and CATALINA_BASE environment variables).

The Default Policy File

The default $CATALINA_BASE/conf/catalina.policy file looks like this:

 

// Licensed to the Apache Software Foundation (ASF) under one or more

// contributor license agreements. See the NOTICE file distributed with

// this work for additional information regarding copyright ownership.

// The ASF licenses this file to You under the Apache License, Version 2.0

// (the “License”); you may not use this file except in compliance with

// the License. You may obtain a copy of the License at

//

//     http://www.apache.org/licenses/LICENSE-2.0

//

// Unless required by applicable law or agreed to in writing, software

// distributed under the License is distributed on an “AS IS” BASIS,

// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

// See the License for the specific language governing permissions and

// limitations under the License.

 

// ============================================================================

// catalina.policy – Security Policy Permissions for Tomcat

//

// 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 each web application:

//

// * Read access to the web application’s document root directory

// * Read, write and delete access to the web application’s working 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;

};

 

 

// ========== 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

// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home},

// update this section accordingly.

// grant codeBase “file:${catalina.base}/bin/tomcat-juli.jar” {..}

grant codeBase “file:${catalina.home}/bin/tomcat-juli.jar” {

permission java.io.FilePermission

“${java.home}${file.separator}lib${file.separator}logging.properties”, “read”;

 

permission java.io.FilePermission

“${catalina.base}${file.separator}conf${file.separator}logging.properties”, “read”;

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 “shutdownHooks”;

permission java.lang.RuntimePermission “getClassLoader”;

permission java.lang.RuntimePermission “setContextClassLoader”;

 

permission java.lang.management.ManagementPermission “monitor”;

 

permission java.util.logging.LoggingPermission “control”;

 

permission java.util.PropertyPermission “java.util.logging.config.class”, “read”;

permission java.util.PropertyPermission “java.util.logging.config.file”, “read”;

permission java.util.PropertyPermission “org.apache.juli.AsyncLoggerPollInterval”, “read”;

permission java.util.PropertyPermission “org.apache.juli.AsyncMaxRecordCount”, “read”;

permission java.util.PropertyPermission “org.apache.juli.AsyncOverflowDropType”, “read”;

permission java.util.PropertyPermission “org.apache.juli.ClassLoaderLogManager.debug”, “read”;

permission java.util.PropertyPermission “catalina.base”, “read”;

 

// Note: 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.

// E.g. for the examples web application (uncomment and unwrap

// the following to be on a single line):

// 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;

};

 

 

// If using a per instance lib directory, i.e. ${catalina.base}/lib,

// then the following permission will need to be uncommented

// grant codeBase “file:${catalina.base}/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

// 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”;

 

// All JSPs need to be able to read this package

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.tomcat”;

 

// Precompiled JSPs need access to these packages.

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.jasper.el”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.jasper.runtime”;

permission java.lang.RuntimePermission

“accessClassInPackage.org.apache.jasper.runtime.*”;

 

// Precompiled JSPs need access to these system properties.

permission java.util.PropertyPermission

“org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER”, “read”;

permission java.util.PropertyPermission

“org.apache.el.parser.COERCE_TO_ZERO”, “read”;

 

// The cookie code needs these.

permission java.util.PropertyPermission

“org.apache.catalina.STRICT_SERVLET_COMPLIANCE”, “read”;

permission java.util.PropertyPermission

“org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING”, “read”;

permission java.util.PropertyPermission

“org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR”, “read”;

 

// Applications using Comet need to be able to access this package

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.comet”;

 

// Applications using WebSocket need to be able to access these packages

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.tomcat.websocket”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.tomcat.websocket.server”;

};

 

 

// The Manager application needs access to the following packages to support the

// session display functionality. These settings support the following

// configurations:

// – default CATALINA_HOME == CATALINA_BASE

// – CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE

// – CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME

grant codeBase “file:${catalina.base}/webapps/manager/-” {

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.ha.session”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.manager”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.manager.util”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.util”;

};

grant codeBase “file:${catalina.home}/webapps/manager/-” {

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.ha.session”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.manager”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.manager.util”;

permission java.lang.RuntimePermission “accessClassInPackage.org.apache.catalina.util”;

};

 

// You can assign additional permissions to particular web applications by

// adding additional “grant” entries here, based on the code base for that

// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files.

//

// Different permissions can be granted to JSP pages, classes loaded from

// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/

// directory, or even to individual jar files in the /WEB-INF/lib/ directory.

//

// For instance, assume that the standard “examples” application

// included a JDBC driver that needed to establish a network connection to the

// corresponding database and used the scrape taglib to get the weather from

// the NOAA web server. You might create a “grant” entries like this:

//

// The permissions granted to the context root directory apply to JSP pages.

// grant codeBase “file:${catalina.base}/webapps/examples/-” {

//     permission java.net.SocketPermission “dbhost.mycompany.com:5432”, “connect”;

//     permission java.net.SocketPermission “*.noaa.gov:80”, “connect”;

// };

//

// The permissions granted to the context WEB-INF/classes directory

// grant codeBase “file:${catalina.base}/webapps/examples/WEB-INF/classes/-” {

// };

//

// The permission granted to your JDBC driver

// grant codeBase “jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-” {

//     permission java.net.SocketPermission “dbhost.mycompany.com:5432”, “connect”;

// };

// The permission granted to the scrape taglib

// grant codeBase “jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-” {

//     permission java.net.SocketPermission “*.noaa.gov:80”, “connect”;

// };

Starting Tomcat With A SecurityManager

Once you have configured the catalina.policy file for use with a SecurityManager, Tomcat can be started with a SecurityManager in place by using the “-security” option:

 

$CATALINA_HOME/bin/catalina.sh start -security   (Unix)

%CATALINA_HOME%\bin\catalina start -security     (Windows)

Permissions
Configuring Package Protection in Tomcat

Get industry recognized certification – Contact us

keyboard_arrow_up
Open chat
Need help?
Hello 👋
Can we help you?