Hardening Tomcat version 7.0

Hardening Tomcat version 7.0.56
1) Disable not-needed services using chkconfig command as part of Operating System Hardening.

2) Install latest stable release of Java

3) Remove all contents is Webapps directory
Set CATALINA_HOME variable first before executing below commands #CATALINA_HOME="/usr/local/apache-tomcat-7.0.56"
#rm -rf $CATALINA_HOME/webapps/docs
#rm -rf $CATALINA_HOME/webapps/examples
#rm –rf $CATALINA_HOME/server/webapps/host-manager
#rm –rf $CATALINA_HOME/server/webapps/manager
#rm -rf $CATALINA_HOME/conf/Catalina/localhost/host-manager.xml
#rm –rf $CATALINA_HOME/conf/Catalina/localhost/manager.xml

4) Run tomcat from Non-privileged account.  Add user tomcat_admin and group tomcat.
# groupadd tomcat; useradd -r tomcat_admin -G tomcat;.

5) Set below owner, group and others permission on Tomcat directories
chown tomcat_admin:tomcat $CATALINA_HOME
chmod g-w,o-rwx $CATALINA_HOME
chown tomcat_admin:tomcat $CATALINA_HOME/conf
chmod g-w,o-rwx $CATALINA_HOME/conf
chown tomcat_admin:tomcat $CATALINA_HOME/logs
chmod o-rwx $CATALINA_HOME/logs
chown tomcat_admin:tomcat $CATALINA_HOME/temp
chmod o-rwx $CATALINA_HOME/temp
chown tomcat_admin:tomcat $CATALINA_HOME/bin
chmod g-w,o-rwx $CATALINA_HOME/bin
chown tomcat_admin:tomcat $CATALINA_HOME/webapps
chmod g-w,o-rwx $CATALINA_HOME/webapps
chmod 770 $CATALINA_HOME/conf/catalina.policy
chown tomcat_admin:tomcat $CATALINA_HOME/conf/catalina.policy
chown tomcat_admin:tomcat $CATALINA_HOME/conf/catalina.properties
chmod g-w,o-rwx $CATALINA_HOME/conf/catalina.properties
chown tomcat_admin:tomcat $CATALINA_HOME/conf/context.xml
chmod g-w,o-rwx $CATALINA_HOME/conf/context.xml
chown tomcat_admin:tomcat $CATALINA_HOME/conf/logging.properties
chmod g-w,o-rwx $CATALINA_HOME/conf/logging.properties
chown tomcat_admin:tomcat $CATALINA_HOME/conf/server.xml
chmod g-w,o-rwx $CATALINA_HOME/conf/server.xml
chown tomcat_admin:tomcat $CATALINA_HOME/conf/tomcat-users.xml
chmod g-w,o-rwx $CATALINA_HOME/conf/tomcat-users.xml
chown tomcat_admin:tomcat $CATALINA_HOME/conf/web.xml
chmod g-w,o-rwx $CATALINA_HOME/conf/web.xml

6) Disable unused connectors for ports like 8080, etc.

7) Add parameters server="xxxxxx" and xpoweredBy="false" and allowTrace=”false” and Secure="true" in Connector description.

8) Do changes in ServerInfo.properties file in catalina.jar by extracting
  # jar xf $CATALINA_HOME /lib/catalina.jar org/apache/catalina/util/ServerInfo.properties
   change server.info attribute to “IIS” or some other server name
  # jar uf $CATALINA_HOME /lib/catalina.jar org/apache/catalina/util/ServerInfo.properties

9) Add a child element, <error-page>, to the <web-app> element, in the $CATALINA_HOME/conf/web.xml file if a generic error page exists to handle java.lang.Exception and java.lang.Throwable exceptions.
 The resulting entry will look as follows:
   <error-page>   
                <exception-type>java.lang.Throwable </exception-type>   
                <location>/error.jsp</location>
   </error-page>
   <error-page>   
                <exception-type> java.lang.Exception</exception-type>   
                <location>/error.jsp</location>
   </error-page>

10) Set the port to -1 in the $CATALINA_HOME/conf/server.xml file and shutdown value to some random uncommon value:
<Server port="-1" shutdown="R@Nd0m$10987">
This disables port 8005 bounded to localhost loopback address.
Note: Tomcat Shutdown script won’t run any longer. Use kill -9 <pid> to stop running tomcat process.

11) Go to file server.xml and add in Valve entry for valves.AccessLogValue
 resolveHosts="false"

12) Check context.xml and add usehttponly="true" in context tag, if not already
e.g. <context usehttponly="true">...</context>

13) Add these parameters to connector description in server.xml
SSLEnabled="true" scheme="https" clientAuth="false" sslEnabledProtocols="TLSv1, TLSv1.1, TLSv1.2"
enableLookups="true" disableUploadTimeout="true"   acceptCount="100" debug="0"
ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                       TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
                       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                       TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
                       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
                       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
                       TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
                       TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
                       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
                       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
                       TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
                       TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"
(Prevents POODLE attack)
*Setup Client-cert Authentication --> In the Connector element, set the clientAuth parameter to true.
* It does it "to prevent DNS spoofing"
14)  Default error page for HTTP error code 404, 403 and 500

Go to $tomcat/conf folder
Add following in web.xml by using vi. Ensure you add before </web-app> syntax
<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
</error-page>

15) Make sure the default servlet is configured not to serve index pages when a welcome file is not present. In CATALINA_HOME/conf/web.xml
 <servlet>
   <servlet-name>default</servlet-name>
   <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
   <init-param>
     <param-name>debug</param-name>
     <param-value>0</param-value>
   </init-param>
   <init-param>
     <param-name>listings</param-name>
     <param-value>false</param-value>  <!-- make sure this is false -->
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

16) Configure Log size limit in logging.properties
java.util.logging.FileHandler.limit=10000

17) In the $CATALINA_HOME/conf/server.xml file, change autoDeploy to false and  change deployOnStartup to false. 
autoDeploy="false"  deployOnStartup="false"

18)  Within $CATALINA_HOME/conf/server.xml, ensure each connector is configured to the connectionTimeout setting that is optimal based on hardware resources, load, and number of concurrent connections.
connectionTimeout="60000"
maxHttpHeaderSize=”8192”

19) If application is configured to use SSL, do the following
In $CATALINA_HOME/conf/web.xml, set the following: 
<user-data-constraint>  <transport-guarantee>CONFIDENTIAL</transport-guarantee> <user-data-constraint>

20)  In all context.xml, set the following: 
<Context ... allowLinking=”false” /> 
<Context ... privileged=”false” />

References: OWASP and other sites on Web. Make Sure to test this configuration in staging environment first.


Comments

Popular posts from this blog

Install NS 2.35 from source packages on Fedora 16

"gnome-screenshot" (No such file or directory)"

Configuring Virtual Machines in same network as Host in RHEL 6.x /CentOS 6.x (Bonding and Bridging)